PECL_HTTP 加载失败。

10

这是我的服务器配置:

  • CentOS发布 6.5(最终版)
  • PHP 5.5.7
  • pecl_http 2.0.4 稳定版
  • 服务器版本:Apache/2.2.15(Unix)

我已经将一切都设置好并运行了,但当我尝试加载pecl_http模块时,它会给我以下警告,并且无法加载:

PHP Warning:  PHP Startup: Unable to load dynamic library '/path/to/php/modules/http.so' - /path/to/php/modules/http.so: undefined symbol: php_persistent_handle_abandon in Unknown on line 0

我已经到处查找,但没有运气。安装似乎很好,但我不知道出了什么问题。

4个回答

19

我也曾遇到同样的问题-无法使2.0.4版本正常工作。为了帮助你或其他遇到类似问题的人,我邀请你查看我在serverfault 上的回答。

为了方便起见,我也将它复制在下面:


我没有遇到设置问题-至少我不知道。 我正在运行nginx + php5-fpm。我的php.ini文件已正确配置,并且所有其他扩展都正常工作-可以使用phpinfo()或php--ini进行测试。

我的pecl_http(HttpRequest)的问题是扩展版本(2.0.4)。通过命令行运行以下命令检查您的版本:

pecl list

我无法让 pecl_http-2.0.4 正常工作,但我能够运行

pecl uninstall pecl_http

然后运行

pecl install pecl_http-1.7.6。确保已安装 libcurl,否则可能会出现安装失败。

重启 php5-fpm 和我的 Web 服务器(nginx)后,一切都完美地工作了!


额外帮助:

在安装之前 - 并且 pear 已经安装 - 您可能需要运行这两个命令(假设您正在使用 fpm 中的 php.ini,或者您可以根据您的配置编写路径):

pear config-set php_ini /etc/php5/fpm/php.ini
pecl config-set php_ini /etc/php5/fpm/php.ini

这样做可以让 PECL 知道你在与 Web 服务器一起使用哪个 php.ini 文件,它将在正确的位置添加 extension=http.so。这对我很有帮助,也许对你有帮助!


3
确保在加载HTTP之前先加载Propro和Raphf,否则会出现错误。 - Jubair
1
我在http之前已经安装了propro和raphf扩展,但仍然无法工作。使用pecl_http-1.7.6确实奏效了,耶! - NateS
1
我总是得到 pear config-set php_ini /etc/php7.0/fpm/php.ini PHP Warning: PHP Startup: Unable to load dynamic library '/usr/lib/php/20151012/http.so' - /usr/lib/php/20151012/http.so: undefined symbol: php_resource_factory_handle_ctor in Unknown on line 0 。已经搜索过,但没有找到可行的解决方案。也许你知道更多? - kwoxer

18

自版本2起,PECL HTTP要求在加载http之前必须加载模块raphf和propro。因此,请编辑您的php.ini或php.d/pecl_http.ini文件或者您加载模块的任何位置,使其看起来像这样:

 extension=raphf.so
 extension=propro.so
 extension=http.so

来源: http://www.php.net/manual/zh/http.install.php#113769


2
这是正确的解释和适当的解决方案。 - crishoj
这救了我的一天。 - Tung Nguyen

0

当涉及从PECL或PEAR安装时,我总是遇到“某些”问题,导致模块无法正常工作。上述错误在Ubuntu和Debian上实际上非常常见。

由Ubuntu和Debian提供的软件包不会自动安装每个模块所需的所有依赖项,因此我不得不在StackExchange、Google和开发者网站之间寻找解决方案。

对我有用的解决方法(注意:在Debian而不是CentOS上)是安装以下软件包:

php5-phpdbg php5-dev php-http zlib1g-dev libcurl4-openssl-dev libevent-dev imagemagick libmagick++-dev imagemagick-common libmagic-dev libghc-iconv-dev libpcre3-dev

这个包被标记为 php-http 是有意的。这个特定的包没有带有 5,因此除非你知道你需要它,否则你很可能会忽略它。所以对于那些在 Ubuntu 和/或 Debian 系统上的用户,可以同时搜索 php5 和 php(使用 --names-only 帮助缩小包的范围)。

我提到这一点是希望能帮助其他可能在类似系统上遇到同样问题的人。我不确定 CentOS 软件库的包名称是否完全相同,但是了解通常需要的包名称可能会帮助您和其他人缩小列表。

安装完这些包后,只需卸载并重新安装 pecl_http 包,重启 php5-fpm,错误就应该消失了;通过创建 phpinfo 文件进行确认。


0
我想进一步扩展Jack Miller的答案。我正在使用OpenSUSE,它将extension=******.so加载器放入/etc/php5/conf.d目录中,分成多个文件。例如:
ctype.ini debug.ini exif.ini http.ini imagick.ini mbstring.ini mysqli.ini opcache.ini pdo.ini pdo_sqlite.ini raphf.ini tokenizer.ini xmlreader.ini xsl.ini curl.ini dom.ini gd.ini iconv.ini json.ini memcache.ini mysql.ini openssl.ini pdo_mysql.ini propro.ini sqlite3.ini xdebug.ini xmlwriter.ini zlib.ini

自然地,它使用glob一个接一个地加载它们,这意味着它们按字母顺序加载,你猜对了 - raphf.ini在http.ini之后被加载。

将raphpf.ini重命名为a_raphf.ini就可以解决问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接