日志写入失败主因是.user.ini覆盖或权限错误:先检查并注释log_errors=off等行,再确认日志文件属主为www、权限644,supervisor或计划任务需指定www用户执行。

日志路径被 .user.ini 覆盖或禁用
宝塔环境下,站点根目录下的 .user.ini 文件会优先于全局 php.ini 生效,且默认不显示在文件管理器中(需勾选“显示隐藏文件”)。很多情况下日志“没写入”,其实是因为它被悄悄关掉了。
- 进入对应站点根目录(如
/www/wwwroot/example.com),用宝塔「文件」管理器打开.user.ini - 查找是否有
log_errors=Off或error_log=./logs/php_error.log这类行——./是相对路径,多数时候指向不存在的子目录 - 临时注释掉这些行(行首加
;),保存后执行bt 11重载 PHP - 再触发一次错误(比如访问一个不存在的 PHP 文件),用
tail -f /www/wwwlogs/php84_error.log看是否开始输出
日志文件权限或属主不对
PHP 8.4 默认以 www 用户运行,如果日志文件属主是 root 或权限为 600,就会静默失败——不报错、不提示、也不写入。
- 执行
ls -l /www/wwwlogs/php84_error.log,确认属主是www、权限是-rw-r--r--(即644) - 如果不是,运行:
chown www:www /www/wwwlogs/php84_error.log && chmod 644 /www/wwwlogs/php84_error.log - 如果文件还不存在,先
touch /www/wwwlogs/php84_error.log再授权,否则 PHP 可能因无法创建文件而放弃写日志
Supervisor 或计划任务里 PHP 进程没权限写日志
用 Supervisor 跑队列、或用宝塔计划任务执行 php artisan schedule:run 时,日志为空或报 Permission denied,问题往往不在代码,而在执行上下文。
- Supervisor 进程:进宝塔「Supervisor 进程管理器」→ 点对应进程的「日志」→ 查
.err.log,搜Permission denied或proc_open is not available - 若出现
proc_open报错,去「软件商店 → PHP 8.4 → 禁用函数」里把proc_open去掉 - 计划任务:默认以
root执行,但日志路径是www用户专属。必须手动指定完整 PHP 路径并切换用户,例如:su -c "/www/server/php/84/bin/php /www/wwwroot/example.com/artisan schedule:run" -s /bin/bash www
PHP-FPM 池配置覆盖了 error_log 设置
宝塔的 PHP-FPM 配置可能通过 php_admin_value[error_log] 强制指定了另一个路径,导致你改了 php.ini 也没用。
- 进「软件商店 → PHP 8.4 → 设置 → 配置修改」,搜索
error_log,看是否有php_admin_value[error_log]行 - 如果有,要么删掉它,要么确保该路径存在、可写、且属主为
www - 也可以在站点配置里单独设置:宝塔「网站 → 设置 → 配置文件」→ 在
location ~ \.php$块里加fastcgi_param PHP_VALUE "error_log=/www/wwwlogs/example_error.log";
error_log 最终生效的是哪一条,再顺着它查权限、查用户、查 SAPI 上下文。最常卡住的地方不是代码,而是 .user.ini 和 su -c 这种细节。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











