PHP,Apache:无法加载动态库(即使有)

PHP, Apache: Unable to load dynamic library (even if there is one)

今天我已将 XAMPP 的内部组件迁移到 64 位:

我已经下载了以前使用的每个 32 位扩展、安装、配置(复制和粘贴,如果需要,主要更改路径)和一般的一切 "works"。

-> % 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.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.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.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.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" ... 错误 :(

有什么想法吗?

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

这与编程没有任何关系,所以我再说一遍,这应该是 serverfault.com 之类的,而不是 whosebug.com

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

嗯,这很奇怪,但这个问题的根本问题是......使用 Apache 作为服务。我无法解释为什么,但是当 运行 Apache 作为服务时无法加载这些扩展,但是当 运行 没有服务时,仅使用来自 XAMPP 控制中心的 "Start",使用相同的配置和 directory/file 结构一切正常。

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

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

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

我遇到了同样的问题。除以下两个外,所有扩展都已加载: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 文件夹(复制,而不是移动)。就我而言:

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

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

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