You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker环境下PHP error_log无内容且无法定位日志文件的求助

Docker环境下PHP error_log无内容且无法定位日志文件的求助

遇到Docker里PHP日志找不到、写不进去的问题确实挺闹心的,我帮你梳理几个排查方向,一步步来定位问题:

1. 先确认PHP配置是否真的加载生效了

你挂载了自定义的custom-php.ini,但首先得确认这个配置真的被PHP(包括Apache模块和CLI模式)读取到了:

检查Apache运行的PHP配置(网页场景)

在你的项目目录里创建一个phpinfo.php文件,内容如下:

<?php phpinfo(); ?>

访问这个文件,找到以下两个关键项:

  • Loaded Configuration File:确认加载的配置文件路径,以及Additional .ini files parsed里是否包含/usr/local/etc/php/conf.d/custom-php.ini
  • error_log:看实际生效的日志路径是不是你设置的/tmp/php_errors.log

检查CLI模式的PHP配置

直接在容器里执行命令,查看CLI PHP的日志配置:

docker-compose exec php php -i | grep -A 3 -B 1 "error_log"
docker-compose exec php php -r "echo ini_get('error_log') . PHP_EOL;"

注意:Apache的PHP和CLI的PHP理论上会共享conf.d目录下的配置,但有时候可能存在差异,必须分别确认。

2. 排查文件权限问题

即使路径配置对了,PHP运行的用户没有写入权限也会导致日志为空:

检查/tmp目录的权限

docker-compose exec php ls -ld /tmp

正常情况下/tmp的权限应该是drwxrwxrwt,允许所有用户写入。

测试www-data用户(Apache运行的PHP用户)能否写入/tmp

Apache的PHP是用www-data用户运行的,手动模拟这个用户尝试写入:

# 切换到www-data用户写入测试内容
docker-compose exec php su - www-data -c "echo '测试写入' > /tmp/test_www_data.log"
# 查看是否写入成功
docker-compose exec php cat /tmp/test_www_data.log

如果写入失败,说明权限有问题,你可以手动调整/tmp的权限,或者检查容器启动时是否有修改过目录权限的操作。

3. 区分CLI模式和Apache模式的日志位置

你之前用docker-compose exec php php -r "error_log('=== TEST DEFAULT ERROR LOG ===');"测试的是CLI模式的PHP,它的日志行为和Apache模块的PHP可能不一样:

  • 如果CLI的error_log配置是/tmp/php_errors.log,那直接查看这个文件即可:
    docker-compose exec php cat /tmp/php_errors.log
    
  • 如果CLI的error_log是默认的syslog,那日志会写到系统日志里,查看方式:
    docker-compose exec php tail -20 /var/log/syslog
    

而你之前用docker-compose logs --tail=100 php看不到,是因为只有当PHP把日志输出到stderr/stdout时,Docker才会捕获到日志;如果日志写到了文件里,Docker logs是看不到的,必须进入容器查看对应文件。

4. 检查Apache自身的日志和配置

有时候Apache的错误会影响PHP日志的写入,查看Apache的错误日志:

docker-compose exec php tail -30 /var/log/apache2/error.log

另外,确认你的容器正确启动了Apache:你的Dockerfile最后用了自定义的start.sh作为启动命令,要确保这个脚本里最终启动了Apache(比如包含exec apache2-foreground命令),否则Apache没运行,网页的PHP代码根本不会执行。

5. 其他细节排查

  • 检查custom-php.ini的语法:确保每一行格式正确,比如log_errors = On(注意是log_errors不是log_error,别少了s),没有多余的空格或语法错误。
  • 检查代码里有没有覆盖配置:比如项目代码里有没有ini_set('log_errors', 'Off')或者error_reporting(0)之类的代码,强制关闭了日志。
  • 重启容器:有时候挂载的配置文件需要容器重启才能生效,执行docker-compose restart php后再测试。

内容来源于stack exchange

火山引擎 最新活动