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_filesize 和 post_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 也常遇到类似问题。
部署新服务器时,建议写个诊断页,列出关键函数和扩展状态,省得一个个试。