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

时间:2017-09-22 16:14:51

标签: php apache curl ldap intl

今天我将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

PHPINFO

但是不管怎么说,即使有有效的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" ...错误:(

有什么想法吗?

5 个答案:

答案 0 :(得分:0)

它基本上是404 dll's。 apache运行的用户,没有权限读取文件夹D:\Bin\XAMPP\7.0.9\php\ext\,或文件夹不存在。至于为什么它在cli中工作但不在apache中工作,他们可能会阅读不同的php.ini,但也可能是php-cli作为不同的用户帐户运行。检查一下,在cli中运行php -r 'phpinfo();' | grep -i username,在<?php phpinfo();运行一个页面,然后查找&#34; Enviorment&#34; &GT; &#34;用户&#34;在apache phpinfo(); ,这些页面还会告诉您他们是否正在加载相同的php.ini文件。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

嗯,这很奇怪,但这个问题的根本问题是......使用Apache作为服务。我无法解释原因,但是当运行Apache作为服务时,无法加载这些扩展,但是在没有服务的情况下运行时,仅使用&#34; Start&#34;从XAMPP控制中心,所有工作正常,具有相同的配置和目录/文件结构。

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

现在我可以正确启动Apache了。还有一个小问题,因为XAMPP控制面板在点击&#34; Start&#34;后没有显示Apache正在运行,但是进程在那里并且正在运行。但最重要的是引擎盖下的一切都很好。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

我遇到了同样的问题。除了这两个之外的所有扩展加载: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