最近在我的 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 地狱。