我们有一个 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 发出警告,但实际上仍然加载?
有谁知道这到底是什么鬼?
谢谢