Как правильно запустить opcache под chroot?
Есть php-fpm и opcache (скачивается и компилируется с php.net)
opcache.enable = 1
opcache.use_cwd = 1
zend_extension=opcache.so
Профили php-fpm запускаются в chroot, т.е. /home/user1/www/index.php -> /www/index.php, /home/user2/www/index.php -> /www/index.php, что за индекс.php вижу в обоих случаях.
Пользователь1 установил WordPress. У user2 есть собственный index.php.
index.php user1 был выполнен до index.php user2.
В том случае, когда я звоню index.php из папки user2, я вижу скомпилированный вывод index.php из папки user1.
Текущее решение: я могу запустить разные PHP для каждого пользователя ИЛИ я должен убить мою красивую структуру / home / user1 / www в / home / user1 / user1www /, потому что opcache должен видеть разные пути. Или я отключаю opcache, но это влияет на производительность.
Есть ли способ сохранить / home / user1 / www, / home / user2 / www и т. Д. И позволить opcache работать правильно?
2 ответа
Это известная ошибка: https://bugs.php.net/bug.php?id=69090 которая присутствовала годами. Но не больше.
Итак, обновите вашу версию php и добавьте ее в php.ini:
opcache.validate_root
Это сделает ключи кэша уникальными для каждого пользователя, поэтому даже если в двух разных chroot-файлах есть два "/htdocs/wp-config.php", теперь они получат две разные записи в кэше.
Нет, вам нужно иметь уникальные пути внутри chroot для достижения вашей цели. Эта проблема возникает из-за того, что весь рабочий PHP-FPM работает внутри chroot, но использует глобальный OPCache. Внутри chroot он просто не видит ничего, кроме /www
в начале имени файла.
Это можно исправить в кодовой базе PHP, используя имя пула и имя файла в качестве ключа кеша. Однако, поскольку chroot является особым случаем, насколько я знаю, он не был реализован.
Когда я реализовывал chroot PHP-FPM для одного проекта, я создал такую структуру:
/srv/www/domain.com/domain.com/docroot
Где каталог chroot был /srv/www/domain.com
, Таким образом, внутри chroot всегда есть уникальный идентификатор для имени файла, чтобы не возникало коллизий ключей кэша.