汇知百科
白蓝主题五 · 清爽阅读
首页  > 故障排查

PHP脚本错误排查:常见问题与解决方法

PHP脚本运行不起来?先看错误日志

网站突然白屏,或者提示“500 内部服务器错误”,第一反应别急着改代码。打开 PHP 的错误日志,这才是最直接的线索。很多生产环境默认关闭了错误显示,但日志文件里早把问题写得明明白白。Linux 系统下通常在 /var/log/php_errors.log 或 Nginx/Apache 的日志目录里。

也可以临时在脚本开头加上:

ini_set('display_errors', 1);
ini_set('log_errors', 1);
ini_set('error_log', '/tmp/php-error.log');
error_reporting(E_ALL);

这样能强制输出错误到页面和日志,方便定位。

语法错误:漏了个分号,整个脚本罢工

新手常犯的错:写完一行忘了加分号,或者括号没闭合。比如:

$name = 'zhangsan'
echo 'Hello ' . $name;

第二行前面没加分号,PHP 解析器会报 Parse error: syntax error, unexpected 'echo'。这种错误一运行就崩,连调试信息都出不来。用命令行跑一遍脚本,能快速发现:php -l script.php,这个命令只检查语法,不执行。

变量未定义或拼写错误

写着写着手一滑,把 $username 写成 $usernmae,PHP 不报错但结果不对。开启 E_NOTICE 级别错误就能抓这类问题:

error_reporting(E_ALL); // 包含 notice 警告

开发阶段建议全程开着,能避免很多低级失误。线上环境可以关掉,但别连 warning 都屏蔽。

数据库连接失败,别只盯着密码

提示“Connection refused”时,很多人反复核对用户名密码,其实可能是数据库服务没启动,或者防火墙拦了 3306 端口。本地测试时用 telnet localhost 3306 看能不能通。另外 PDO 异常要主动捕获:

try {
    $pdo = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
    echo '数据库错误:' . $e->getMessage();
}

不然出错了只会看到空白页面。

上传文件失败?看看 php.ini 设置

用户传不了图片,提示“临时文件无法移动”。这时候查 upload_max_filesizepost_max_size 是否太小。比如设置了 2M,但用户想传 5M 的图,自然失败。同时确认 upload_tmp_dir 目录可写,有些服务器这个路径权限不对。

var_dump($_FILES) 打印上传信息,error 字段会告诉你具体原因,比如值为 1 是超过大小限制,2 是表单设置的 MAX_FILE_SIZE 超限。

时区警告:date() 函数的坑

调用 date('Y-m-d') 时报 It is not safe to rely on the system's timezone settings。这不是致命错误,但会影响时间准确性。在 php.ini 里设置 date.timezone = Asia/Shanghai,或者在脚本里加:

date_default_timezone_set('Asia/Shanghai');

尤其做订单、日志记录时,时间不准后续排查更麻烦。

依赖扩展没装,函数找不到

写了 json_decode() 却提示函数不存在?可能是 JSON 扩展没启用。虽然 PHP 5.2+ 默认带,但某些精简安装会去掉。用 php -m 查已加载模块,或者 function_exists('json_decode') 判断一下。处理图片时 gd、imagick 也常遇到类似问题。

部署新服务器时,建议写个诊断页,列出关键函数和扩展状态,省得一个个试。