Я компилирую расширение php kafka как эта ссылка говорит.
я могу использовать Kafka
Класс в режиме php cli, но получите Class 'Kafka' not found
ошибка в режиме php-fpm (веб-запрос).
php --info | grep kafka
указать расширение присутствует в то время как phpinfo
в html указать расширение, которое отсутствует.
Я могу подтвердить от phpinfo page
что php-fpm и php-cli используют один и тот же php.ini.
Итак, как я могу определить, где проблема?
версия php: 5.5.13
версия php-fpm: 5.5.13
Я нахожу ответ.
Class 'Kafka' not found
ошибка в режиме php-fpm вызвана тем, что php-fpm не может загрузить расширение Kafka. Хотя я добавляю extension=kafka.so
в php.ini
, Но при загрузке расширения произошла ошибка.
Я нашел причину использования dl
загрузить расширение вручную и получить ошибку в ответе. Почему php-fpm хранит молчание, когда в процессе загрузки расширения произошла какая-то ошибка. Может быть, я пропустил некоторые настройки?
Во всяком случае, причина найдена. Php-fpm не может загружать librdkafka во время загрузки расширения kafka. Либрдкафка в реж /usr/local/lib
, которого нет в пути поиска ld в red-hat. Проверьте /etc/ld.so.conf для вашего пути поиска.
добавлять /usr/local/lib
в /etc/ld.so.conf и запустите ldconfig, чтобы решить проблему.
Причина, по которой работает режим cli, заключается в том, что переменная $ LD_LIBRARY_PATH = «/ usr / local / lib».
Для получения дополнительной информации о процессе загрузки, проверьте эта ссылка
Список каталогов для поиска хранится в файле /etc/ld.so.conf. Многие производные от Red Hat дистрибутивы обычно не включают / usr / local / lib в файл /etc/ld.so.conf. Я считаю это ошибкой, и добавление / usr / local / lib в /etc/ld.so.conf — это общее «исправление», необходимое для запуска многих программ в системах, производных от Red Hat.
Поиск всех этих каталогов при запуске программы был бы крайне неэффективным, поэтому фактически используется механизм кэширования. Программа ldconfig (8) по умолчанию считывает файл /etc/ld.so.conf, устанавливает соответствующие символические ссылки в каталогах динамических ссылок (чтобы они следовали стандартным соглашениям), а затем записывает кеш в / etc / ld.so.cache, который затем используется другими программами. Это значительно ускоряет доступ к библиотекам. Подразумевается, что ldconfig должен запускаться всякий раз, когда добавляется DLL, когда DLL удаляется или когда изменяется набор каталогов DLL; Запуск ldconfig часто является одним из шагов, выполняемых менеджерами пакетов при установке библиотеки. При запуске динамический загрузчик фактически использует файл /etc/ld.so.cache, а затем загружает необходимые библиотеки.
Руководство по установке в GitHub Имеется в виду запуск ldconfig, но у red-hat есть особая ситуация, когда директория lib отсутствует в файле конфигурации ld.
Других решений пока нет …