无论是刚装好PHP的新服务器,还是接手一个陌生的项目环境,动手写业务代码之前都应该先把环境检查一遍。环境不可用导致的问题往往很隐蔽,比如缺少某个扩展时页面直接白屏,或者上传目录没有写权限导致文件保存失败。下面介绍几种常用且可靠的检查方式,覆盖从基础配置到具体依赖的各个层面。

一、使用探针文件检查整体环境
最直接的方式是写一个探针文件。在网站根目录下新建一个test.php,内容只有一行:
<?php phpinfo();
保存后通过浏览器访问这个文件,如果能看到一张完整的PHP配置信息表格,说明PHP解释器已经正常工作,Web服务器与PHP的协作也没有问题。这个页面包含的信息非常丰富,比如PHP版本、运行方式(是Apache模块还是PHP-FPM)、已加载的扩展列表、各种配置指令的当前值等。
排查问题时可以重点关注几个字段:PHP Version确认版本是否符合项目要求;Loaded Configuration File显示实际加载的php.ini路径,很多人修改了配置却不生效,原因就是改错了文件,服务器上往往同时存在多个php.ini;extension_dir告诉你扩展目录在哪里,方便确认扩展文件是否放对位置。
需要强调的是,phpinfo()会暴露服务器的详细配置,包括环境变量和路径信息,检查完之后务必立刻删除探针文件,不要把它留在生产环境里。
二、命令行方式检查版本和扩展
如果可以登录服务器,命令行检查更快。执行下面两条命令:
php -v # 输出示例: # PHP 8.2.10 (cli) (built: Sep 5 2023) # Copyright (c) The PHP Group php -m # 列出所有已加载的扩展,例如: # Core # ctype # curl # dom # fileinfo # mbstring # mysqli # pdo_mysql
php -v用于确认版本,比如项目要求PHP 8.0以上,这里一眼就能看出来。php -m列出当前已启用的扩展,检查pdo_mysql、gd、curl、mbstring这些常用扩展是否在列表中,缺哪个就在php.ini里把对应的extension=xxx前面的分号去掉,然后重启服务。
命令行方式还能查看具体配置项的值,例如php -i | findstr upload_max_filesize(Windows)或php -i | grep upload_max_filesize(Linux),不用翻php.ini文件也能快速确认上传大小限制、内存限制等关键参数。另外,php --ini可以直接显示加载的配置文件路径,比phpinfo更轻量。
要注意一点:命令行的PHP和Web服务的PHP可能是两套独立的环境,比如服务器上同时装了多个PHP版本,CLI用的是8.2而网站跑的是7.4。所以命令行检查通过后,最好还是用探针文件确认Web环境的情况。
三、在代码中做动态检测
很多时候我们需要在程序运行时判断某个功能是否可用,而不是靠人工查看。PHP提供了几个内置函数来做这件事:
<?php
// 检查扩展是否加载
if (!extension_loaded('pdo_mysql')) {
exit('缺少 pdo_mysql 扩展,请先安装并启用');
}
// 检查函数是否存在(某些函数可能被 disable_functions 禁用)
if (!function_exists('curl_init')) {
exit('curl 函数不可用');
}
// 检查类是否存在
if (!class_exists('PDO')) {
exit('PDO 类不可用');
}
// 检查PHP版本
if (version_compare(PHP_VERSION, '8.0.0', '<')) {
exit('当前PHP版本为 ' . PHP_VERSION . ',需要 8.0 以上');
}
extension_loaded()判断扩展,function_exists()判断函数,class_exists()判断类,这三个函数可以组合使用,在入口脚本里做统一的环境自检。一旦发现不满足条件就给出明确提示,比让用户面对一个莫名其妙的报错页体验好得多。
除了能力检测,环境配置也可以动态读取。ini_get()能拿到任意配置项的当前值,例如检查上传限制:
<?php
$uploadLimit = ini_get('upload_max_filesize');
$postLimit = ini_get('post_max_size');
echo "单文件上传限制:{$uploadLimit},POST总限制:{$postLimit}";
四、检查数据库连接和目录权限
环境检查的最后一环是验证外部依赖。数据库连不上是部署时最常见的问题之一,可以用一段简单的代码测试:
<?php
try {
$pdo = new PDO(
'mysql:host=127.0.0.1;dbname=test;charset=utf8mb4',
'root',
'password',
[PDO::ATTR_TIMEOUT => 3]
);
echo '数据库连接正常';
} catch (PDOException $e) {
echo '数据库连接失败:' . $e->getMessage();
}
如果连接失败,错误信息通常会指出原因,比如Connection refused说明数据库服务没启动,Access denied说明账号密码不对,Unknown database说明库名写错了,根据提示逐项排查即可。
目录权限同样重要,尤其是上传目录、日志目录和缓存目录。可以用is_writable()检查写权限:
<?php
$dirs = ['./uploads', './runtime/cache', './logs'];
foreach ($dirs as $dir) {
if (!is_dir($dir)) {
echo "{$dir} 目录不存在\n";
} elseif (!is_writable($dir)) {
echo "{$dir} 目录不可写,请调整权限\n";
} else {
echo "{$dir} 正常\n";
}
}
Linux环境下目录权限问题很常见,Web进程通常以www或nginx用户运行,如果目录归属于root且没有写权限,上传功能就会失败。适当执行chmod或chown调整即可解决。
把上面这些检查项整合成一个自检脚本,部署新环境时跑一遍,几分钟就能确认环境是否就绪,比出了问题再逐个排查省事得多。