如何讓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。
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 內始終有一個唯一標識符,因此不會發生記憶體鍵衝突。