PHP Startup: Unable to load dynamic library 问题。

PHP Startup: Unable to load dynamic library ... (tried:... 这种算是比较常见的问题,
当然这里只讨论在保证 php.ini 中启用了相关扩展,并且相应的.dll文件确实存在于加载目录中的情况。

我个人遇到的是'pdo_firebird'和 'pdo_oci'.

D:\Tool\php\php-7.2.7-Win32-VC15-x64>php

Warning: PHP Startup: Unable to load dynamic library 'pdo_firebird' (tried: D:\Tool\php\php-7.2.7-Win32-VC15-x64\ext\pdo_firebird (找不到指定的模块。), D:\Tool\php\php-7.2.7-Win32-VC15-x64\ext\php_pdo_firebird.dll (找不到指定的模块。)) in Unknown on line 0

Warning: PHP Startup: Unable to load dynamic library 'pdo_oci' (tried: D:\Tool\php\php-7.2.7-Win32-VC15-x64\ext\pdo_oci (找不到指定的模块。), D:\Tool\php\php-7.2.7-Win32-VC15-x64\ext\php_pdo_oci.dll (找不到指定的模块。)) in Unknown on line 0

昨天还好好的没有报错,今天就开始报错了。。重装php也没有用。

前者,通过
PHP Startup: Unable to load dynamic library php_pdo_firebird.dll : The Official Microsoft IIS Forums
中的描述,向php主目录中添加一个fbclient.dll可以解决。
实测的确消除了报错,只是需要下载和php对应版本的firebird.
但问题在于,php主目录下本来没有这个fbclient.dll也是可以正常工作的。所以这算是某种变通的补救措施(甚至可能仅仅是阻止了php报错)。

至于后者,根据
PHP unable to load dynamic library "php_pdo_oci.dll" - Stack Overflow
中的说法,需要安装Oracle Instant Client.
(Oracle官网需要注册才能下载,注册基本上都是必填项。。注册成功之后不能登录,过了好久才同步为登录状态。。)。
实测有效。但需要的究竟是其中哪一部分组件不明。

其他的一些什么方法,什么将ext目录加入环境变量之类的试过了,无效。

我非常想了解:
1.如何真正解决这两个问题?
2.如何解决类似的扩展加载失败问题,有没有什么实用的经验?
3.是什么原因导致此类情况发生?
为什么会有系统.dll文件甚至运行库组件丢失的情况?
(从昨天到今天并未浏览危险网站,除了php报错也没有发现其他任何疑似中毒的现象)

欢迎各位提供意见和思路。

阅读 15.7k
2 个回答

问题属于环境配置,基本知识点是程序的运行机制。要彻底解决问题,可以从两方面入手:1. 动态链接库作用是什么? 2. PHP如何加载动态链接库?明白这两个问题,疑问自然迎刃而解。

建议使用php -i|findstr extphp -m两个命令查看配置/拓展加载情况,并试试在php.ini中使用绝对路径加载拓展。

错误信息提示的是无法加载对应的库,那么可能出现的问题就是,无法找到文件,或者文件无法正常使用。在windows下经常会出现这样的问题(因为linux下一般都是编译安装,有仇当时就报了)。

那么出现这种问题,无法就是extension_dir配置错误或者dll对环境运行有依赖,比如VC2015或者依赖数据库的一些dll,而这些dll必须是安装数据库后才会到全局环境当中

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题