有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
,index.php
两种情况下都可以看到。
user1
已经安装了 WordPress。user2
有自定义index.php
。user1
user2
的 index.php 在之前执行index.php
。
index.php
在这种情况下,当我从文件夹调用时,我会看到来自文件夹user2
的编译输出。index.php
user1
当前解决方案. 我可以为每个用户运行不同的 PHP或者我必须毁掉我那漂亮的结构,/home/user1/www
让/home/user1/user1www/
OPcache 需要查看不同的路径。或者我禁用 OPcache,但这会影响性能。
有没有办法可以保留/home/user1/www
、/home/user2/www
等并让 OPcache 正常工作?
答案1
这是一个著名的错误:https://bugs.php.net/bug.php?id=69090 这种情况已经存在多年了。但现在不再存在了。
因此,更新你的 PHP 版本,并将其添加到php.ini
:
opcache.validate_root=1
这将使每个用户的缓存键唯一,因此即使/htdocs/wp-config.php
在两个不同的 chroot 中有两个,从现在开始他们也会获得两个不同的缓存条目。
答案2
不,您需要在 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 中文件名始终有一个唯一标识符,这样就不会发生缓存键冲突。