Назад | Перейти на главную страницу

Потоковый безопасный php-pecl-memcache и php-pecl-mongo

Я хочу переключить сервер Fedora с Apache с prefork на worker.

Вроде все нормально, кроме библиотек php для Mongo и Memcache. Кому-нибудь удалось заставить их работать с httpd worker mpm?

Обратите внимание, что я установил memcache и mongo следующим образом:

yum install php-pecl-memcache php-pecl-mongo

По прихоти я попытался скопировать .so из /usr/lib64/php/modules/ к /usr/lib64/php-zts/modules/, но у меня такие ошибки:

Предупреждение PHP: запуск PHP: невозможно загрузить динамическую библиотеку '/usr/lib64/php-zts/modules/memcache.so' - /usr/lib64/php-zts/modules/memcache.so: undefined symbol: basic_globals in Unknown on строка 0 Предупреждение PHP: запуск PHP: невозможно загрузить динамическую библиотеку '/usr/lib64/php-zts/modules/mongo.so' - /usr/lib64/php-zts/modules/mongo.so: неопределенный символ: core_globals в Неизвестно в строке 0

Вы не можете просто копировать модули из /usr/lib64/php/modules/ к /usr/lib64/php-zts/modules/- ZTS (многопоточная) и не-ZTS сборки PHP имеют разные ABI модуля.

Видимо пакет php-pecl-memcache для Fedora 18 и даже Пакет Rawhide созданы без поддержки ZTS, поэтому их нельзя использовать с mod_php в многопоточном MPM Apache.

Здесь у вас есть несколько вариантов:

  1. Согласно рекомендация в PHP FAQ, самый надежный способ использовать PHP вместе с многопоточным Apache MPM - это режим FastCGI (например, с php-fpm), так что PHP будет работать в отдельных однопоточных процессах. Таким образом, вы можете использовать все доступные расширения PHP - даже те, которые используют небезопасные библиотеки и вообще не могут работать в многопоточном процессе.

  2. Если вам действительно нужно использовать mod_php с многопоточным MPM, вы можете использовать сторонние пакеты (как это), которые построены с поддержкой php-zts (обратите внимание, что /usr/lib64/php-zts/modules/memcache.so присутствует в списке файлов).

  3. Если вы не можете найти готовый двоичный пакет с поддержкой php-zts для нужного вам расширения PHP, вы можете попробовать перестроить пакет самостоятельно, но даже это может оказаться невозможным, если рассматриваемое расширение не имеет поддержки ZTS в своем код.