2015-09-19 139 views
0

我编译php kafka扩展为this link说。php-fpm不加载kafka扩展,而php cli不能加载

我可以在php cli模式下使用Kafka类,但在php-fpm(web请求)模式下出现Class 'Kafka' not found错误。

php --info | grep kafka表示扩展名存在,而HTML中的phpinfo表示扩展名不存在。

我可以从phpinfo page确认php-fpm和php-cli使用相同的php.ini。

那么,我该如何发现问题所在?

PHP版本:5.5.13 PHP-FPM版本:5.5.13

回答

0

我找到了答案。

php-fpm模式下的Class 'Kafka' not found错误是由php-fpm无法加载Kafka扩展引起的。虽然我在php.ini中加extension=kafka.so。但是在加载扩展时出现了一些错误。

我发现原因是使用dl来手动加载扩展,并在响应中得到错误。为什么php-fpm在加载扩展的过程中出现一些错误时保持沉默。也许我错过了一些配置?

无论如何,原因被发现。当加载扩展卡夫卡时,Php-fpm无法加载librdkafka。 librdkafka位于目录/usr/local/lib中,它不在红帽子的ld搜索路径中。检查/etc/ld.so.conf以查找您的搜索路径。

/usr/local/lib添加到/etc/ld.so.conf并运行ldconfig解决问题。

cli模式工作的原因是因为变量$ LD_LIBRARY_PATH =“/ usr/local/lib”。

有关加载过程的详细信息,请this link

要搜索存储在文件/etc/ld.so.conf中的目录列表。许多源自Red Hat的发行版通常不在文件/etc/ld.so.conf中包含/ usr/local/lib。我认为这是一个bug,并且将/ usr/local/lib添加到/etc/ld.so.conf是在Red Hat派生系统上运行许多程序所需的常见“修复”。

在程序启动时搜索所有这些目录会非常低效,所以实际上使用了缓存安排。默认情况下,程序ldconfig(8)读入文件/etc/ld.so.conf,在动态链接目录中设置适当的符号链接(这样它们将遵循标准约定),然后将缓存写入/ etc/ld.so.cache然后被其他程序使用。这极大地加速了对图书馆的访问。这意味着无论何时添加DLL,删除DLL或DLL目录集发生更改时都必须运行ldconfig;运行ldconfig通常是程序包管理员在安装库时执行的步骤之一。然后,在启动时,动态加载器实际上使用文件/etc/ld.so.cache,然后加载它所需的库。

安装在github引导menthioned大约运行ldconfig,但红色的帽子有特殊situatiion的lib目录不在ld的配置文件。