У меня есть набор сценариев 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.