您的位置:首页 > 编程语言 > PHP开发

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

2013-02-17 13:06 981 查看
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文件,如果存在的话就不在查找了。

安装过程

我的安装环境是:windows 2000 server,Apache2,PHP5.2.3(php-5.2.3-Win32.zip)。

1) 解压缩zip包,将其中的php.ini-recommended改名为php.ini;对php.ini文件进行一些修改

; 打开这个项使得一些使用tag模板的程序如discuz、dedecms等正常运行

short_open_tag = On

; 修改php扩展组件的路径

extension_dir = "php安装目录\ext"

; 增加对mysql的支持,将下面这行文字前面的分号删除即可

extension=php_mysql.dll

; 设置session保存的目录,这项默认是被注释掉的

session.save_path = "C:/temp"

2) 在Apache中进行设置,打开httpd.conf,在文件中添加如下设置:

# 加载php5的apache模块

LoadModule php5_module "php5的安装目录\php5apache2.dll"

# 增加头文件

AddType application/x-httpd-php .php .php3

# 设置php.ini所在的文件目录

PHPIniDir "php安装目录"

然后重启apache就可以了。

最后说明一句:如果在Apache配置文件中没有通过PHPIniDir “php安装目录”设置了PHP5的根目录的话需要将PHP5的安装目录添加到%PATH%的环境变量中。

一些常见的问题

1) 运行网站提示不能连接mysql数据库

这是因为默认情况下php5不像php4那样至此MySQL的,所以需要手动将 extension=php_mysql.dll 打开使其支持MySQL。

2) 运行某些包含session操作的程序时出现下面的错误提示:

Warning: session_start() [function.session-start]: SAFE MODE Restriction in effect. The script whose uid is 2023 is not allowed to access /var/tmp/ owned by uid 0 in /configs/config.inc.php on line 9

Fatal error: session_start() [function.session-start]: Failed to initialize storage module: files (path: ) in /configs/config.inc.php on line 9

这是php5一个安全模式的bug,默认session的save_path是系统的临时目录,这样会要校验权限。在php.ini文件里,显式指定session的save_path(比如 c:/temp)然后重启web服务就解决了。

3) Apache 设置的时候 PHPIniDir 有什么作用?

与php4搜索php.ini是在%SystemRoot%下不同的是,PHP5按照以下顺序依次查找PHP.ini:

* PHPIniDir (Apache 2 module only)

* 注册表键值:HKEY_LOCAL_MACHINE—SOFTWARE—PHPIniFilePath

* 环境变量:%PHPRC%

* PHP5的目录 (for CLI), 或者web服务器目录(for SAPI modules)

* Windows目录(C:\windows or C:\winnt)

所以如果是Apache + PHP5的话可以使用 PHPIniDir 指定php5的配置文件php.ini的路径。

4) 安装 PHP5 之后打开 Discuz!或DedeCMS 的时候图片和论坛的信息都无法正常显示

解决的方法是打开php.ini,查找short_open_tag,将其设置为short_open_tag= on。对于Discuz!论坛如果还是显示有问题的话可以将forumdata/cache和forumdata/templates下面的文件删除然程序重新创建下缓存即可。

5) 使用网上发布的“汉字验证码”程序的时候只显示背景不显示文字或显示类似“Invalid font filename in xxx.php on line 57”的错误信息

与PHP4不同的是PHP5在安全模式下不能访问系统路径,而网上发布的验证码程序中的字体只有一个文件名而不包含路径,如果指定完整路径(比如:C:\Winodws\Fonts\simhei.ttf)的话则会提示没有访问的权限。估计这个应该是php默认配置权限所造成的,我目前解决的方法就是将字体文件从系统目录直接拷贝到程序目录下面。我估计应该通过设置一下php.ini文件可以实现之前php4的效果,但是目前我还没有找到设置的方法。

6) 文件无法上传?

上传文件的时候出现下面的提示:

File upload error - unable to create a temporary file in Unknown on line 0

这是因为默认的php.ini中没有设置上传的临时文件,默认为系统的临时文件地址。如果没有权限去读系统的临时文件目录的话就会产生上述错误。解决的方法就是去掉 upload_tmp_dir 前面的分号然后设置临时文件目录。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐