2013-07-18 182 views
6

是否有清除/重置使用Opcache與PHP5.4或更低版本的緩存文件的方法?
Hereopcache_reset()函數,它只是似乎與PHP5.5工作Opcache - 在PHP5.4及更低版本中清理緩存

一種解決方法是重新啓動......

編輯:我在Github上

+1

另請參閱http://stackoverflow.com/questions/17224798/how-to-use-php-opcache – TerryE

回答

11

zend_accelerator_module.c聲明這兩個文件API調用:opcache_reset()opcache_invalidate()以及兩個無證者:opcache_get_status()opcache_get_configuration()。他們從源頭上做的很明顯。

當您發出opcache_reset()時,它顯然只適用於連接到正在執行PHP腳本的進程的OPcache高速緩存。是的,你可以在系統上有很多這樣的緩存。

當你請求opcache.enable_cli=1時,那麼OPcache將爲連接到該進程的高速緩存發出重新啓動請求;不幸的是,SAPI創建了一個私有緩存,所以這並沒有太大的好處。

對* nix系統的理解要點在於,OPcache依賴於某些底層進程管理器,例如Apache或FPM來啓動OPcache,導致它到達包含緩存的SMA(mmap())。過程管理器然後分派爲請求提供服務的子進程,並偶然從父進程繼承mmapped區域。

因此,如果您想重置連接到PHP-FPM的OPcache高速緩存,那麼您必須通過在PHP-FPM服務下運行的腳本執行此操作。這隻需要是一個4班輪。如果您想從命令行執行此操作,則可以使用wget,curl或使用curl擴展名的PHP CLI腳本來啓動此FPM腳本。

但是請記住在兩者之間使用一些強大的認證機制來防止第三方利用。

如果您想了解更多,我已完成此概述:The Zend Engine and opcode caching。如果您有任何反饋或問題,請在此處發表評論或在Github上提出問題。

+0

非常感謝您的詳細解釋。 *解決方案*通過創建一個腳本並通過curl運行它有點直接,但感覺不對,或者至少不是那麼簡單。 – schickling

+1

你也可以重新加載php-fpm,這會做一個平穩的重啓,並且應該清除opcache。 – leeb

0

開了一個issue看看是否能方法是可行的與您的環境中的function_exists

if(function_exists('opcache_reset')) echo 'yay!'; 

田地它在PHP5.5可用,因爲opcache與它來,它也應該,如果你已經安裝了OpCache爲一個較舊版本的PHP可用。我相信這是文檔在說PHP (PHP 5 >= 5.5.0, PECL ZendOpcache >= 7.0.0)時注意到的。

我也成功地使用了這個快速和髒的control panel與PHP 5.4(使用opcache_ *方法)。

編輯 看了上面的鏈接控制面板後,我發現它檢查PHP版本,如果opcache_reset存在。

它似乎嘗試accelerator_*而不是opcache_*函數。

我建議您嘗試一下腳本,看看它是否適用於您,然後我們可以反向查看您的服務器上正確安裝了哪些設備以及使用哪些方法。

+0

感謝您的回答!功能存在但似乎沒有效果。 權限(哪個用戶運行'opcache_reset')發揮作用嗎? – schickling

+0

很好的問題,我不確定。你可以嘗試使用該服務器上鍊接的PHP腳本,看看它是否有效?最後,你使用了什麼INI設置?你確定他們正在生效? (什麼是您的緩存過期時間?) – fideloper

+0

使用腳本工作清理緩存。以「www-data」'php -r「的形式運行echo function_exists('opcache_reset')?'opcache _':(function_exists('accelerator_reset')?'accelerator_':'');」'返回'opcache_'。 我使用PHP-FPM與nginx – schickling

0

如果您的服務器上有一個WordPress網站,只需安裝插件OPcache控制板即可。它爲您提供交互式控制,並且在自動Wordpress升級過程運行後觸發緩存重置。

有關運行同一CMS的多個實例的服務器的另一件事要注意,如果它們運行不同版本的CMS或插件,會發生什麼情況。這會發生,例如如果你錯開主要版本的升級。在這種情況下,你的php.ini需要包括

opcache.use_cwd=1 

所以相同的文件名會被單獨編譯取決於它在目錄中。如果您確定您的CMS版本在所有站點相同,您可以將其設置爲0並獲得效率提升,因爲OpCache將編譯每個例程一次,然後將其用於服務器上的所有CMS實例。這也是一個內存效率提升,如果您的WP場上有大量實例,這將會非常有意義。

相關問題