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

Как позволить 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 см. в обоих случаях.

user1 установил 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 работать правильно?

Это известная ошибка: https://bugs.php.net/bug.php?id=69090 который присутствовал годами. Но не больше.

Итак, обновите свою версию php и добавьте это в php.ini:

opcache.validate_root

Это сделает ключи кеша уникальными для каждого пользователя, поэтому, даже если есть два "/htdocs/wp-config.php" в двух разных chroot'ах, отныне они будут получать две разные записи кеша.

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