Как правильно запустить 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 всегда есть уникальный идентификатор для имени файла, чтобы не возникало коллизий ключей кэша.

Другие вопросы по тегам