cURL 7.27.0-1无法通过Apache PHP加载,但在php命令行上运行良好

时间:2012-08-07 14:17:31

标签: php linux apache curl archlinux

我们有一个内部网站点,它有多个PHP脚本,它们开始使用curl_init()。前几天有一个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'   在第0行的未知中未找到(/usr/lib/libcurl.so.4所需)

  • 奇怪的是我们有另一个几乎相同的脚本(在同一台机器上),使用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发出警告,但仍然实际加载?

有谁知道这可能是什么?

由于

1 个答案:

答案 0 :(得分: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

请注意,这要求您最近在软件包管理器缓存中安装了curl版本7.26.0-1。如果失败,请检查/ var / cache / pacman / pkg是否有另一个版本的curl。如果你没有,那么你必须找到一个。