如何让OPcache在chroot下正常工作?

如何让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.phpindex.php两种情况下都可以看到。

  • user1已经安装了 WordPress。user2有自定义index.php

  • user1user2的 index.php 在之前执行index.php

index.php在这种情况下,当我从文件夹调用时,我会看到来自文件夹user2的编译输出。index.phpuser1

当前解决方案. 我可以为每个用户运行不同的 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 中文件名始终有一个唯一标识符,这样就不会发生缓存键冲突。

相关内容