1

我们有一个 Intranet 站点,其中包含多个使用 curl_init() 开始的 PHP 脚本。前几天 ArchLinux 的更新与 cURL (glibc) 的一些依赖关系混淆了。这导致 curl 模块无法在 PHP 中正确加载,即 extension_loaded('curl') 失败。

我从 Apache /var/http/error_log 收到此错误:

PHP 警告:PHP 启动:无法加载动态库“/usr/lib/php/modules/curl.so” - /lib/libc.so.6:未找到版本“GLIBC_2.16”(/usr/lib 需要/libcurl.so.4) 在第 0 行的未知中

  • 奇怪的是,我们有另一个几乎相同的脚本(在同一台机器上)使用 curl_init() 在 PHP 命令行上运行,该脚本通过 cron 作业运行,并且 PHP 在执行此脚本期间正确加载 cURL。这工作得很好。
  • cURL 配置为通过 extension=curl.so 在 php.ini 中运行
  • 如果我检查 phpinfo(),我会看到“--with-curl=shared”。但是它不显示 cURL 信息表。这告诉我模块没有正确加载。
  • curl.so 文件位于:/usr/lib/php/modules/curl.so
  • 这些 cURL 脚本通常也可以正常运行,它们目前在另一台测试机器上运行良好。
  • 这个问题发生在 PHP 5.4.5

ldd /usr/lib/libcurl.so.4

linux-gate.so.1 (0xb7770000)
libssh2.so.1 => /lib/libssh2.so.1 (0xb76de000)
librt.so.1 => /lib/librt.so.1 (0xb76d5000)
libssl.so.1.0.0 => /lib/libssl.so.1.0.0 (0xb7673000)
libcrypto.so.1.0.0 => /lib/libcrypto.so.1.0.0 (0xb74ad000)
libz.so.1 => /lib/libz.so.1 (0xb7495000)
libpthread.so.0 => /lib/libpthread.so.0 (0xb747a000)
libc.so.6 => /lib/libc.so.6 (0xb72d4000)
libdl.so.2 => /lib/libdl.so.2 (0xb72cf000)
/lib/ld-linux.so.2 (0xb7771000)

在我的发行版中,他们所做的更改是 /lib 现在是 /usr/lib 的符号链接:http ://www.archlinux.org/news/the-lib-directory-becomes-a-symlink/

编辑

我尝试了 DaveRandom 在这里建议的...

[root http]# php -r " echo (file_exists('/usr/lib/php/modules/curl.so')) ? 'It exists.' : 'It doesn\'t e.'; "
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/json.so' - /usr/lib/php/modules/json.so: cannot open shared object file: No such file or directory in Unknown on line 0
PHP Warning:  file_exists(): open_basedir restriction in effect. File(/usr/lib/php/modules/curl.so) is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/) in Command line code on line 1

Warning: file_exists(): open_basedir restriction in effect. File(/usr/lib/php/modules/curl.so) is not within the allowed path(s): (/srv/http/:/home/:/tmp/:/usr/share/pear/) in Command line code on line 1
It doesn't exist.

它失败了,因为它不允许通过ini访问该路径,所以我重新配置它并再次尝试......

[root http]# php -r " echo (file_exists('/usr/lib/php/modules/curl.so')) ? 'It exists.' : 'It doesn\'t exist.'; "
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/json.so' - /usr/lib/php/modules/json.so: cannot open shared object file: No such file or directory in Unknown on line 0
It exists.

奇怪的是 JSON 实际上正在工作......

[root m]# php -r " echo (extension_loaded('json')) ? 'It is loaded' : 'It is not loaded'; "
PHP Warning:  PHP Startup: Unable to load dynamic library '/usr/lib/php/modules/json.so' - /usr/lib/php/modules/json.so: cannot open shared object file: No such file or directory in Unknown on line 0
It is loaded

我想问题是,什么会导致 cURL 在命令行上工作,模块文件在那里,但无法通过 Apache PHP 加载扩展。

那么另一方面,什么会导致 JSON 发出警告,但实际上仍然加载?

有谁知道这到底是什么鬼?

谢谢

4

1 回答 1

4

好吧,我找到了解决办法。基本上只是从 cURL 7.27.0-1 降级到 7.26.0-1,这是哪种sux,但它有效:

我认为这个问题是 ArchLinux 独有的,但这将解决它(如果你是像我这样的 ArchLinux 用户)。

mkdir /tmp/pacman_build
cd /tmp/pacman_build
cp /var/cache/pacman/pkg/curl-7.26.0-1-`uname -m`.pkg.tar.xz .
tar -xJf curl-7.26.0-1-`uname -m`.pkg.tar.xz
LD_PRELOAD=/tmp/pacman_build/usr/lib/libcurl.so pacman -U /var/cache/pacman/pkg/curl-7.26.0-1-`uname -m`.pkg.tar.xz

请注意,这要求您最近在包管理器缓存中拥有版本 7.26.0-1 的 curl。如果失败,请检查 /var/cache/pacman/pkg 以获取另一个版本的 curl。如果你那里没有一个,你必须找到一个。

于 2012-08-07T19:01:28.337 回答