【问题标题】:php-fpm doesn't load kafka extension while php cli doesphp-fpm 不加载 kafka 扩展,而 php cli 加载
【发布时间】:2015-09-20 16:35:34
【问题描述】:

我按照this link 的说法编译 php kafka 扩展。

我可以在 php cli 模式下使用 Kafka 类,但在 php-fpm(web request) 模式下会出现 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

【问题讨论】:

    标签: php apache-kafka


    【解决方案1】:

    我找到了答案。

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

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

    总之,原因找到了。 php-fpm 在加载扩展 kafka 时无法加载 librdkafka。 librdkafka 在目录/usr/local/lib 中,它不在red-hat 中的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。我认为这是一个错误,将 /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 中的安装指南提到运行 ldconfig,但 red-hat 有特殊情况 lib 目录不在 ld 配置文件中。

    【讨论】:

      猜你喜欢
      • 2019-09-25
      • 2022-06-13
      • 1970-01-01
      • 1970-01-01
      • 2014-03-03
      • 1970-01-01
      • 2011-03-02
      • 1970-01-01
      • 2014-04-10
      相关资源
      最近更新 更多