Mac/Linux下XAMPP无法加载php_*.dll是因系统只识别.so文件,需注释php.ini中所有含.dll的extension=行并重启Apache;Windows下报“找不到指定模块”则源于依赖DLL缺失,须匹配TS/NTS、PHP版本及VC运行库,并将依赖DLL置于Apache bin目录。

Mac/Linux 下 XAMPP 里 php_*.dll 报错是根本用错后缀
Mac 或 Linux 上看到 Unable to load dynamic library php_pdo_mysql.dll 这类报错,不是文件丢了,而是系统压根不认 .dll 后缀——Unix 系统只加载 .so(shared object)文件。XAMPP 在 macOS 或 Linux 发行版中预编译的扩展全是 .so,但默认 php.ini 里仍保留 Windows 风格的 extension=php_pdo_mysql.dll 行。
实操建议:
- 打开
/Applications/XAMPP/xamppfiles/etc/php.ini(macOS)或/opt/lampp/etc/php.ini(Linux),搜索所有含.dll的extension=行 - 全部用分号注释掉,例如:
;extension=php_pdo_mysql.dll - 保存后重启 Apache(不是仅刷新页面,要通过 XAMPP 控制面板或命令行重启服务)
- 验证:访问
http://localhost/dashboard/phpinfo.php,搜索pdo_mysql,确认状态为enabled即可——XAMPP Unix 版本已把常用扩展静态编译进 PHP,无需手动extension=开启
Windows 下 php_*.dll 报“找不到指定的模块”(error 126)
这个错误不是路径写错了,而是 DLL 依赖缺失:比如 php_pdo_sqlsrv.dll 依赖 SQL Server Native Client,php_oci8.dll 依赖 Oracle Instant Client,php_imagick.dll 依赖 ImageMagick 的 CORE_RL_wand_.dll 等。系统找不到这些依赖项,就抛出 error 126。
实操建议:
- 先确认 PHP 是 TS(线程安全)还是 NTS(非线程安全):查
phpinfo()中Thread Safety字段,enabled→ 用_ts.dll,disabled→ 用_nts.dll - 检查扩展名是否严格匹配 PHP 主版本和构建标识,例如 PHP 8.2.12 应使用
php_parallel-1.4.0-8.2-ts-vc15-x64.dll,不能混用 VC14/VC16 或 8.1 编译的版本 - 把扩展依赖的 DLL(如
msvcp140.dll、sqlncli11.dll、igdumd64.dll)复制到C:/xampp/apache/bin/目录(Apache 启动时优先从此处加载依赖) - 别只改
extension_dir路径却忘了同步放对文件:用php --ini查生效的php.ini,再用php -i | grep extension_dir确认路径,最后进该目录用dir命令验证.dll文件真实存在且大小写一致
extension_dir 改成绝对路径反而更易出错
XAMPP 默认 extension_dir = "ext" 是相对路径,它基于 PHPIniDir 解析。一旦你手动改成 extension_dir = "C:/xampp/php/ext",Apache 子进程在不同工作目录下可能解析失败,导致扩展看似存在却加载不了。
实操建议:
- 保持
extension_dir为相对路径"ext",不要加盘符或斜杠开头 - 确保
PHPIniDir指向的目录下确实存在ext/子目录,且里面是当前 PHP 版本对应的完整扩展集 - 若需切换 PHP 版本(如从 8.1 切到 8.2),不要只复制
php.ini,必须同步替换整个ext/目录——不同版本的.dll不兼容,混放必报Module compiled with module API=20220829, PHP compiled with module API=20210902 - 用
php -m单独测试 CLI 模式能否加载扩展,可绕过 Apache 初始化干扰,更快定位是扩展本身问题还是 Web 服务器配置问题
多端口共用一套 PHP 配置时的隐性冲突
Apache 配置多个 Listen 端口(如 8080 和 8081)本身不会引发扩展加载失败,但若在 httpd-vhosts.conf 或多个配置片段中重复出现 LoadModule php_module 或多次设置 PHPIniDir,就会导致 PHP 模块被重复注册或初始化顺序错乱,最终表现为某些扩展(如 openssl、curl)反复报 Unable to load dynamic library 或直接 Segmentation fault。
实操建议:
- 全局搜索
httpd.conf及extra/下所有配置文件,确保LoadModule php_module只出现一次 -
PHPIniDir必须且只能在主配置区(如httpd-xampp.conf)声明一次,所有VirtualHost块内禁止再写 - 若真需不同端口跑不同 PHP 版本,放弃“单 Apache + 多端口”思路,改用两个独立
httpd -f实例,各自绑定端口、ServerRoot和PHPIniDir,并指向不同版本的php8apache2_4.dll
最容易被忽略的是:Mac/Linux 下删掉 .dll 行后没重启 Apache,或 Windows 下改完 php.ini 没重启服务就去刷网页;还有就是以为复制了 .dll 就万事大吉,却漏掉了它背后一整套依赖 DLL —— 它们不在 ext/ 目录里,而在系统 PATH 或 Apache bin/ 目录中。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











