最近在我的Windows 7开发机器上安装了Apache2.2和PHP 5.2.17之后,我想分享一下我关于如何设置才能加载正确版本的OpenSSL DLL的发现。许多人在其他地方发布了关于如果加载了错误版本会导致的“DLL地狱”的问题。
首先,安装Apache 2.2并检查其运行情况,然后从http://windows.php.net/download/.下载PHP的Windows二进制文件。请注意,根据该页面侧边栏的信息,目前推荐与Apache2一起使用的PHP版本是5.2.17,即使它是一个较旧的版本。此外,此版本包含使用OpenSSL所需的所有DLL——无需像旧的PHP手册中建议的那样重新编译。
验证PHP安装后,通过取消注释以下行来启用OpenSSL支持:
extension=php_openssl.dll
在php.ini中,你会在PHP目录中找到它(我假设你把它放在c:/PHP)。接下来检查php_openssl.dll的位置,你应该在c:/PHP/ext中找到它。也在php.ini中找到键extension_dir,并将它的值更改为c:/php/ext。接下来,将此位置添加到PATH的末尾(无需重启)。
此时,当你启动Apache时,它将尝试加载php_openssl.dll,但是如果你的设置与我的类似,你会看到一个错误。我更喜欢手动启动Apache,错误会出现在一个对话框中:“无法在动态链接库LIBEAY32.dll中找到序号4114”。(我不确定如果以服务方式启动Apache是否会收到此消息)。Apache日志也包含一条错误消息,说明无法加载php_openssl.dll,尽管该消息没有命名libeay32.dll。欢迎来到DLL地狱。
Libeay32.dll出现是因为php_openssl.dll依赖于它(也依赖于ssleay32.dll)。我认为发生的情况是Apache首先尝试根据extension_dir键指定的路径以编程方式加载php_openssl.dll。但是,所谓的依赖DLL的加载则留给Windows的默认机制。如果Windows找到不兼容版本的依赖DLL,则会发生错误。
因此,解决方法显然是确保加载了正确版本的libeay32.dll。至少在我的机器上,还有其他三个进程加载了此相同DLL的各种版本。它们包括Mozy备份客户端、Windows资源管理器(因为Mozy在资源管理器中安装了支持)和OpenOffice套件。在这方面,我的机器与专用服务器非常不同,在专用服务器上,人们可能希望尽可能少的冗余进程。大概在服务器上,人们可以遵循建议将dll复制到system32目录的建议,例如。但我不会通过进行系统范围的更改来乱改我的其他程序。
那么该怎么办呢?我没有发现关于Windows如何搜索DLL的可用信息非常有用,主要是因为我不理解它。但它确实说Windows首先查找的地方是“应用程序加载的目录”。
为了说明重点,经过大量实验后,我得出了一个关键的认识——“应用程序”是APACHE,而不是PHP。因此,我将libeay32.dll复制到Apache2.2/bin目录。问题解决了。没有错误消息,运行phpinfo确认OpenSSL已存在并启用。
祝你好运,远离DLL地狱。