【问题标题】:PHP, Apache: Unable to load dynamic library (even if there is one)PHP、Apache:无法加载动态库(即使有)
【发布时间】:2018-03-04 06:56:54
【问题描述】:

今天我已将 XAMPP 的内部结构迁移到 64 位:

  • Apache(从 32 位 2.4.25 到 64 位 2.4.27)
  • PHP(从 32 位 7.1.4 到 64 位 7.1.9)

我已经下载了之前在 32 位中使用的每个扩展,安装、配置(如果需要,主要复制和粘贴路径更改)并且通常一切都“正常”。

-> % php --version
PHP 7.1.9 (cli) (built: Aug 30 2017 18:34:46) ( ZTS MSVC14 (Visual C++ 2015) x64 )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2017 Zend Technologies

但不知何故,即使有有效的 DLL(其中大部分捆绑在下载的 PHP 包中),我也会收到 PHP Startup: Unable to load dynamic library 错误。这些是curlintlldapimagick(最后一个是我安装的)。 php.ini 中的路径是正确的(许多其他扩展从同一目录正确加载)。这是我每次通过 Apache 访问页面时在php_error_log 中得到的:

[22-Sep-2017 15:52:47 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\Bin\XAMPP\7.0.9\php\ext\php_curl.dll' - The specified module could not be found.
 in Unknown on line 0
[22-Sep-2017 15:52:47 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\Bin\XAMPP\7.0.9\php\ext\php_intl.dll' - The specified module could not be found.
 in Unknown on line 0
[22-Sep-2017 15:52:47 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\Bin\XAMPP\7.0.9\php\ext\php_ldap.dll' - The specified module could not be found.
 in Unknown on line 0
[22-Sep-2017 15:52:47 UTC] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\Bin\XAMPP\7.0.9\php\ext\php_imagick.dll' - The specified module could not be found.
 in Unknown on line 0

在 CLI 中一切正常(与 Apache 相同的 php.ini):

-> % php -i | grep -n3 curl
175:curl
178-cURL Information => 7.55.0

-> % php -i | grep -n3 ldap
347:ldap
349-LDAP Support => enabled
350-RCS Version => $Id: 0779387e5f88edc656159d12b9302a053e82cc79 $

-> % php -i | grep -n3 intl
330:intl
332-Internationalization support => enabled
333-version => 1.1.0
335-ICU Data version => 57.1

但在 Apache 中我有 Attempted to call function "curl_init" ... 错误:(

有什么想法吗?

【问题讨论】:

  • 首先确保 apache 的 php.ini 开启了 log_errors,然后发布错误日志。不过,最有可能的是,dll 是为不同版本的 php 编译的。如果是这种情况,错误日志会告诉您,并帮助我们帮助您。我也认为这个问题应该在Serverfault中
  • 3 个扩展与 PHP 捆绑在一起(从官方网站下载),因此它们是有效的(并且在 CLI 中工作)。只有imagick 是自定义的,但我选择了匹配版本(VC14、x64、PHP7.1、TS)。我启用了日志,但只有我上面发布的错误:PHP Startup: Unable to load dynamic library,仅此而已。 PHP 和 Apache 日志(在调试级别)不包含任何可以告诉我发生了什么的内容。我很困惑。

标签: php apache curl ldap intl


【解决方案1】:

我遇到了同样的问题。加载除了这两个之外的所有扩展:amqp 和 pdo_sqlite:

PHP Warning:  PHP Startup: Unable to load dynamic library 'pdo_sqlite' (tried: D:\\xampp74\\php\\ext\\pdo_sqlite (The specified module could not be found.), D:\\xampp74\\php\\ext\\php_pdo_sqlite.dll (The specified module could not be found.)) in Unknown on line 0

PHP Warning:  PHP Startup: Unable to load dynamic library 'amqp' (tried: D:\\xampp74\\php\\ext\\amqp (The specified module could not be found.), D:\\xampp74\\php\\ext\\php_amqp.dll (The specified module could not be found.)) in Unknown on line 0

一种解决方案是将 php 路径添加到环境变量 PATH 中。

这里真正的问题是,虽然扩展 dll 位于 xampp\php\ext 中,但某些扩展具有位于 xampp\php 中的附加文件。如果没有将php路径添加到PATH中,这些额外的dll是无法加载的。

如果您不想将 PHP 路径添加到 PATH,解决方案是将额外的 dll 文件添加到 xampp\apache\bin 文件夹(复制,而不是移动)。就我而言:

  • 用于 pdo_sqlite 的 libsqlite3.dll
  • rabbitmq.4.dll 和 rabbitmq.4.pdb 用于 php_amqp

或者,如果你通过批处理文件启动 apache,在启动 apache 之前添加 php 路径:

SET PATH=%PATH%;d:\xampp74\php

【讨论】:

    【解决方案2】:

    我在 Windows 10 上遇到了同样的问题,并通过将 php 主目录添加到系统(不是用户!)PATH 环境并重新启动系统来解决它。 当 Apache 作为服务安装时,它以系统用户身份运行,这意味着它看不到您的用户环境变量。

    【讨论】:

      【解决方案3】:

      嗯,这很奇怪,但这个问题的根本问题是……使用 Apache 作为服务。我无法解释为什么,但是当将 Apache 作为服务运行时,这些扩展无法加载,但是在没有服务的情况下运行时,仅使用 XAMPP 控制中心的“开始”,在相同的配置和目录/文件结构下一切正常。

      我意识到,当我想回到以前的工作版本并再次链接 32 位版本时(我在 XAMPP 安装目录中使用 apachephp 符号链接)。 cURL 未加载,但在迁移到 64 位之前可以正常工作。所以我开始挖掘和试验服务,在取消注册后它开始正常工作。所以我认为64位也可能是这种情况......确实如此。

      现在我可以正常启动 Apache。仍然存在小问题,因为 XAMPP 控制面板在单击“开始”后未将 Apache 显示为正在运行,但进程在那里并且正在运行。但最重要的是引擎盖下一切正常。

      【讨论】:

        【解决方案4】:

        检查您的 DLL 版本是否正确。 x64 和 x86 版本之间经常存在差异,ZTS 和 NON TREAD SAFE 之间也存在差异。出于某种原因,您只会得到信息:无法加载扩展,而不是 ddls 不兼容的漂亮错误消息。

        【讨论】:

          【解决方案5】:

          它基本上是 404'ing dll。运行 apache 的用户无权读取文件夹 D:\Bin\XAMPP\7.0.9\php\ext\ ,或者该文件夹不存在。至于为什么它在 cli 中有效但在 apache 中无效,他们可能正在阅读不同的 php.ini,但也可能是 php-cli 作为不同的用户帐户运行。要检查这一点,请在 cli 中运行 php -r 'phpinfo();' | grep -i username,并在带有 <?php phpinfo(); 的页面上运行,然后在 apache phpinfo() 中查找“环境”>“用户”; ,页面还会告诉您它们是否正在加载相同的 php.ini 文件。

          这与编程无关,所以我再说一遍,这应该在 serverfault.com 或其他东西上,而不是 stackoverflow.com

          【讨论】:

          • 有明确的信息表明php.ini 相同且路径正确(当我从错误日志中复制路径并将其粘贴到资源管理器时,它会尝试打开文件)。这些扩展在 CLI 中被正确读取,通过 Apache,许多其他扩展从相同的 ext 目录和精确的配置约定 (extension=php_something.so) 工作。我不知道如何调试它,为什么这些扩展在 Apache 中无效(找到但未加载)。
          猜你喜欢
          • 2017-03-03
          • 2010-12-20
          • 2019-04-03
          • 1970-01-01
          • 2019-03-12
          • 2015-03-01
          • 2017-09-25
          • 1970-01-01
          • 2022-08-07
          相关资源
          最近更新 更多