Debian

如何讓opcache在chroot下正常工作?

  • October 8, 2017

有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。

user1 的 index.php 在 user2 的 index.php 之前執行。

在這種情況下,當我從 user2 文件夾中呼叫 index.php 時,我會從 user1 文件夾中看到 index.php 的編譯輸出。

目前解決方案:我可以為每個使用者執行不同的 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

這將使每個使用者的記憶體鍵都是唯一的,因此即使在兩個不同的 chroot 中有兩個“/htdocs/wp-config.php”,從現在開始它們將獲得兩個不同的記憶體條目。

不,您需要在 chroot 中擁有獨特的路徑才能實現您的目標。發生此問題是因為整個 PHP-FPM 工作人員都在 chroot 內工作,但它使用的是全域 OPCache。/www在 chroot 內部,除了文件名的開頭之外,它根本看不到任何其他內容。

這可以通過使用池名稱和文件名作為記憶體鍵在 PHP 程式碼庫中修復。但是,由於 chroot 是一個特例,據我所知,它還沒有實現。

當我為一個項目實現 chroot PHP-FPM 時,我做了一個如下結構:

/srv/www/domain.com/domain.com/docroot

chroot 目錄在哪裡/srv/www/domain.com。這樣,文件名的 chroot 內始終有一個唯一標識符,因此不會發生記憶體鍵衝突。

引用自:https://serverfault.com/questions/862258