PHP中出现“Unable to load dynamic library”问题的解决方法

今天把一个客户的服务器上面的PHP4升级到PHP5,根据前几天写的从PHP4升级到PHP5的步骤进行升级之后,总是在错误的日志文件中出现如下提示:

startup: Unable to load dynamic library : PHP5\ext\php_mysql.dll

可是明明将extension_dir设置正确了还是提示无法找到dll文件。后来在CSDN上面找到一篇相关的文章,大体意思是php扩展目录中的模块需要依赖于一些基础的dll文件,如果系统没有找到这些基础的dll文件的话也会是扩展模块产生错误。解决的方法有两种,一种是拷贝这些dll文件到system32目录下面,另外一种方法就是将这些dll的目录设置到环境变量%PATH%中去。PHP5的话只要设置其安装目录就可以了。

但是问题是我按照上面的设置还是出现上面的提示,真的是很奇怪。后来我尝试将libmysql.dll文件拷贝到system32目录下面的时候出现是否覆盖文件的提示,这个时候我才恍然大悟,原来php4中的dll目录下面的文件都被拷贝到system32目录下面而没有被删除,所以php5误将这些文件当作基础文件了。于是使用如下的批处理命令将php4留在系统中的文件一一删除即解决了问题:


@echo off
echo remove php4

echo remove php.ini and php4ts.dll
del %SystemRoot%\php.ini
del %SystemRoot%\system32\php4ts.dll

echo remove dlls from system32...
del %SystemRoot%\system32\expat.dll
del %SystemRoot%\system32\FDFTK.DLL
del %SystemRoot%\system32\fribidi.dll
del %SystemRoot%\system32\gds32.dll
del %SystemRoot%\system32\iconv.dll
del %SystemRoot%\system32\libeay32.dll
del %SystemRoot%\system32\libmhash.dll
del %SystemRoot%\system32\libmysql.dll
del %SystemRoot%\system32\mSQL.dll
del %SystemRoot%\system32\ntwdblib.dll
del %SystemRoot%\system32\sablot.dll
del %SystemRoot%\system32\ssleay32.dll
del %SystemRoot%\system32\Yaz.dll

echo done!

这样说的话php5对于查找这些基础dll文件的顺序应该跟查找php.ini文件的顺序(详细见从PHP4升级到PHP5文章中的常见问题3)相反,或者是无论如何首先查看system32目录下面是否含有这些dll文件,如果存在的话就不在查找了。

增加内容(2007.9.20):
今天将PHP5.2.3升级为5.2.4之后依然出现上述的问题(系统:win2k server),但是5.2.3版本使用的很好。后来根据参考资料所说的两种方法(一种是拷贝这些dll文件到system32目录下面,另外一种方法就是将这些dll的目录设置到环境变量%PATH%中去)中的后者将php5的安装目录添加到环境变量%PATH%中之后重新启动下就OK了。但是同样的版本我在本机(系统: winxp sp2)只要在Apache设置PHPIniDir为php5安装目录就可以了,并没有设置环境变量,不知道什么原因。

参考资料:
如何解决PHP startup: Unable to load dynamic library的错误

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注