Рейтинг:0

PHP 7.4 под nginx с php-fpm — один общий кэш APCu — как?

флаг cn
C C

У меня есть набор сценариев PHP 7.4, работающих с расширением APCu, которое используется кодом в качестве общего хранилища объектов для всех пользователей, посещающих один размещенный веб-сайт. Из-за собственного непонимания я позже узнал, что кэш APCu установлен на PHP-процесс. Итак, что я вижу, так это то, что в некоторых случаях пользователь а получает другое кешированное значение, чем пользователь "б" (предположительно, поскольку PHP-FPM разветвил новый процесс для пользователя «b»).

Но мне все еще не ясно, как именно настроить php-fpm, чтобы все входящие запросы были внутри дочерних процессов, которые являются производными от того же родительского процесса.

APCu гуру кракджо сказал это еще в 2015 году (выделено мной жирным):

Просто чтобы ответить на исходный вопрос ... как сказал @fruitl00p, вы можете настроить свой выход из проблемы невозможности поделиться, если вы используете фпм.

Есть разница между использованием fpm и использованием fcgi, я должен вероятно, поместите PR в phptherightway, чтобы прояснить это.

Правило состоит в том, что только дочерние процессы могут получить доступ к тому, что их родитель созданный; В FCGI порожденные процессы не обязательно являются потомками их родитель, они могут не быть настоящими форками. Если ваш менеджер процессов работает как обычный FCGI/CGI, то вы не сможете поделиться, если он работает как FPM и инициализирует PHP в родительском и разветвляет дочерний переводчики, то у вас не будет проблем.

Дальнейшие исследования привели меня к файлу php-fpm www.conf и настройкам для:

вечера = динамический
pm.max_children = 50

Итак, это так же просто, как изменить это на:

вечера = статический
pm.max_children = 50

то есть это способ заставить php-fpm убедиться, что все дочерние процессы указывают на одного родителя? Таким образом, гарантировать, что в игре есть только один глобальный кэш APCu? Я понимаю, что мне нужно заняться математикой, чтобы вычислить правильное значение pm.max_children.

Пожалуйста, обрати внимание: на данный момент я не могу переключиться на memcached, так как я полагаюсь на итерацию регулярных выражений по ключам APCu через объект APCUIterator. Возможно, со временем я доберусь до этого, но пока я должен придерживаться APCu.

флаг us
Все процессы PHP-FPM разветвляются одним родителем, и кеш APCu должен быть общим между ними. Пожалуйста, поделитесь полной конфигурацией PHP и nginx в своем вопросе.
флаг cn
C C
@TeroKilkanen спасибо за это понимание - и теперь, основываясь на некоторых дополнительных тестах, которые я провел вчера, кажется, что все PID php-fpm указывают на общий родительский PID. Я использую по существу «простую ванильную» конфигурацию для nginx и php. Кроме того, настоящая причина моей проблемы оказалась в том, что я развернут в OpenShift в трех модулях, поэтому у меня есть три разных PHP/кэша. Пользователи нажимают на модули случайным образом. А это значит, что я должен перенести это все в отдельный микросервис специально для кеширования.
флаг us
Или вы можете маршрутизировать запросы на основе хэша IP, чтобы запросы постоянно попадали на один и тот же сервер.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.