PHP在Windows 10上可独立运行,关键在于:CLI开发选NTS版(启动快、无锁开销),IIS或Apache模块模式必须用TS版且VC版本匹配;extension_dir须写绝对路径,date.timezone必须设为"Asia/Shanghai"以防数据库连接异常。

PHP在Windows 10上能不依赖Apache/Nginx直接跑起来,关键不是装完就完事,而是选对版本、配对扩展路径、绕开VC运行时冲突——否则php -v报错或extension=mbstring始终不生效。
选TS还是NTS?看你是用IIS还是命令行/CLI
Windows下PHP二进制包分Thread Safe(TS)和Non-Thread Safe(NTS)。这不是性能高低问题,而是运行模型匹配问题:
- IIS必须用TS版:它靠FastCGI模块加载
php-cgi.exe,依赖线程安全机制 - 纯CLI开发(如Composer、Laravel Artisan、单元测试)推荐NTS:启动快、内存占用低、无线程锁开销
- Apache模块模式(
LoadModule php8_module "php8apache2_4.dll")只认TS,且必须与Apache编译器版本一致(VC15对应Apache 2.4.57,VC16对应2.4.58+)
如果你只是写脚本、跑测试、搭本地API服务,下载php-8.1.27-Win32-vs15-x64-nts.zip即可——别被“Thread Safe”字面意思带偏。
php.ini里extension_dir写绝对路径,否则扩展全失效
解压PHP后,复制php.ini-development为php.ini,但光取消;extension_dir = "ext"注释远远不够。Windows下相对路径在这里会崩:
通过 SSH 隧道从 Android 设备在互联网上对 Windows PC 实现完整远程控制的设置与使用指南,适用于远程桌面访问、安全 RDP 等。
立即学习“PHP免费学习笔记(深入)”;
- 默认
extension_dir = "ext"→ PHP会从当前工作目录找ext文件夹,不是从PHP安装目录 - 正确写法是:
extension_dir = "D:/dev/php-8.1.27/ext"(用正斜杠,不要反斜杠) - 验证是否生效:
php -m | findstr mbstring,没输出说明路径错了或dll缺失 - 常见坑:NTS版没有
php8apache2_4.dll,TS版没有php-cgi.exe(其实有,但命名不同),别混着拷
PATH环境变量只加PHP根目录,别加\ext或\cli
系统PATH里只填D:/dev/php-8.1.27,不要多加子目录。多加反而导致php -v报MSVCP140.dll missing:
- VC运行时DLL(如
vcruntime140.dll)就在PHP根目录下,PATH指向根目录才能自动加载 - 如果PATH里写了
D:/dev/php-8.1.27/ext,系统会优先从这里找DLL,但ext里只有扩展so/dll,没有运行时库 - 新打开CMD后执行
where php,应只返回一条路径;若返回多条,说明PATH重复或路径污染 - 改完PATH务必关掉所有CMD/PowerShell窗口再重开,旧进程不会自动继承新变量
date.timezone不设会导致PDO/MySQLi连接静默失败
很多PHP扩展(尤其是mysqli、PDO)在建立数据库连接前会读取时区信息。若date.timezone未设或设错,可能:
- 连接MySQL成功但查询时间字段出错(如
NOW()返回UTC而非本地时间) - 某些PDO驱动抛
SQLSTATE[HY000] [2054] Server sent charset (255) unknown to the client(实际是时区链路触发的字符集协商异常) - 正确设置:
date.timezone = "Asia/Shanghai",注意引号必须是英文双引号,不能用中文标点 - 验证方式:
php -r "echo date_default_timezone_get();"输出Asia/Shanghai即生效
最易被忽略的是:即使你只用PHP CLI跑脚本,只要涉及new PDO()或mysqli_connect(),这个配置就绕不开——它不在Web服务器层,而在PHP解释器初始化阶段硬绑定。


















