能直接在命令行运行php -v且浏览器能打开phpinfo()页面,才算真正配通PHP环境;需依次验证CLI可用性、Web服务器集成、php.ini配置生效、扩展加载及时区设置等环节,任一缺失均会导致空白页、500错误或命令未识别。

能直接在命令行跑 php -v 且浏览器能打开 phpinfo(),才算真正配通。中间任一环节断在环境变量、模块路径、时区或服务端口,都会表现为“PHP不运行”“页面空白”“500错误”或“命令未识别”。
确认PHP CLI是否可用(命令行执行)
这是所有后续步骤的前提。如果连 php -v 都报“不是内部或外部命令”,说明PHP解释器根本没被系统找到。
- 先检查PHP是否真的解压到了某个目录(如
C:\php或C:\xampp\php),且该目录下存在php.exe - 把完整路径(例如
C:\php)加进系统Path环境变量,**不是**C:\php\php.exe - 改完环境变量后,必须新开一个命令提示符窗口再试
php -v,旧窗口不会自动刷新变量 - 如果提示“缺少
MSVCR110.dll”等VC运行库,去微软官网下载对应版本的Visual C++ Redistributable安装即可
启用关键扩展和时区(php.ini 配置)
php.ini 不只是“改个时区”,它直接决定 mysqli、curl、openssl 等功能能否用。默认的 php.ini-development 是禁用大部分扩展的。
- 复制
php.ini-development并重命名为php.ini,否则所有修改无效 - 取消注释并修正
extension_dir:必须写成绝对路径,例如extension_dir = "C:/php/ext"(注意斜杠方向,Windows下反斜杠易出错) - 启用常用扩展:去掉
;extension=mysqli、;extension=openssl、;extension=curl前的分号 - 设置时区:改为
date.timezone = Asia/Shanghai,否则date()函数会报Warning - 临时目录要手动创建:
upload_tmp_dir = "C:/php/tmp"→ 先在C:\php下建好tmp文件夹,否则文件上传失败
Apache 加载 php_module 失败的常见原因
即使 php -v 成功,http://localhost 仍可能返回 500 错误或直接下载 .php 文件——这基本是 Apache 和 PHP 模块没对上号。
立即学习“PHP免费学习笔记(深入)”;
- PHP 必须选 Thread Safe (TS) 版本才能配合 Apache;NTS 版本只适用于 Nginx + PHP-FPM
-
LoadModule路径中的 DLL 文件名必须与你实际 PHP 版本严格匹配,例如 PHP 8.3 对应php8apache2_4.dll,PHP 8.2 是php8apache2_4.dll(名字几乎一样,但不能混用) -
PHPIniDir指向的是php.ini所在目录,不是文件路径,例如PHPIniDir "C:/php",不是"C:/php/php.ini" - 修改完
httpd.conf后,必须重启 Apache 服务,仅重启控制面板里的 Apache 进程不够,有时需在任务管理器中结束残留的httpd.exe - Apache 日志(
logs/error.log)里会明确写出 DLL 加载失败的具体原因,比浏览器报错更可信
用内置服务器快速验证(无需 Apache/Nginx)
如果你只是写脚本、调试逻辑,或刚起步不想碰 Web 服务器配置,php -S 是最轻量的验证方式,但它不支持 .htaccess 或重写规则。
- 确保当前目录下有
index.php或其他 PHP 文件 - 执行命令:
php -S localhost:8000,服务就起来了 - 浏览器访问
http://localhost:8000/index.php即可看到输出 - 如需路由支持,可额外写一个路由器文件,例如
router.php,内容为:if (preg_match('/\.(?:png|jpg|jpeg|gif)$/', $_SERVER["REQUEST_URI"])) {return false;} else {include __DIR__ . '/index.php';},然后启动时加参数:php -S localhost:8000 router.php - 这个模式下,
$_SERVER['DOCUMENT_ROOT']不可用,要用__DIR__替代
最容易被忽略的是:PHP 版本与 Apache/NGINX 的兼容性、DLL 文件名的细微差异、以及 php.ini 文件是否真正在生效路径下——哪怕只差一个字母,phpinfo() 里显示的“Loaded Configuration File”那一行,才是唯一可信的依据。



















