摘要:當(dāng)這個(gè)選項(xiàng)被啟用設(shè)置為,會(huì)在設(shè)置的時(shí)間到達(dá)后檢測(cè)文件的時(shí)間戳。設(shè)置值取值范圍最小值是,最大值在之前是,及之后是。這個(gè)選項(xiàng)的值是以兆字節(jié)作為單位,如果把它設(shè)置為,則表示,默認(rèn)是,這是一個(gè)比較低的值。
在網(wǎng)上無意中看到的一篇文章,這哥們非常簡(jiǎn)潔地談?wù)摿藌end opcache的最佳設(shè)置,他說他為此花了大量的時(shí)間探索zend opcache的每個(gè)設(shè)置選項(xiàng)的細(xì)節(jié),甚至是閱讀它的源代碼,并且在自己的項(xiàng)目中實(shí)踐(一個(gè)每天有117 million的HTTP請(qǐng)求的應(yīng)用)。
Opcache優(yōu)化在著名的《modern php》 中也有重要篇幅。在PHP文檔也有詳細(xì)介紹:http://php.net/manual/zh/opcache.configuration.php#ini.opcache.revalidate-freq
個(gè)人覺得這種文章相當(dāng)有指導(dǎo)意義,所以特地把它的設(shè)置方式摘譯如下(格式有些修改)。
opcache.revalidate_freq這個(gè)選項(xiàng)用于設(shè)置緩存的過期時(shí)間(單位是秒),當(dāng)這個(gè)時(shí)間達(dá)到后,opcache會(huì)檢查你的代碼是否改變,如果改變了PHP會(huì)重新編譯它,生成新的opcode,并且更新緩存。值為“0”表示每次請(qǐng)求都會(huì)檢查你的PHP代碼是否更新(這意味著會(huì)增加很多次stat系統(tǒng)調(diào)用,譯注:stat系統(tǒng)調(diào)用是讀取文件的狀態(tài),這里主要是獲取最近修改時(shí)間,這個(gè)系統(tǒng)調(diào)用會(huì)發(fā)生磁盤I/O,所以必然會(huì)消耗一些CPU時(shí)間,當(dāng)然系統(tǒng)調(diào)用本身也會(huì)消耗一些CPU時(shí)間)??梢栽陂_發(fā)環(huán)境中把它設(shè)置為0,生產(chǎn)環(huán)境下不用管,因?yàn)橄旅鏁?huì)介紹另外一個(gè)設(shè)置選項(xiàng)。
opcache.validate_timestamps當(dāng)這個(gè)選項(xiàng)被啟用(設(shè)置為1),PHP會(huì)在opcache.revalidate_freq設(shè)置的時(shí)間到達(dá)后檢測(cè)文件的時(shí)間戳(timestamp)。
如果這個(gè)選項(xiàng)被禁用(設(shè)置為0),opcache.revalidate_freq會(huì)被忽略,PHP文件永遠(yuǎn)不會(huì)被檢查。這意味著如果你修改了你的代碼,然后你把它更新到服務(wù)器上,再在瀏覽器上請(qǐng)求更新的代碼對(duì)應(yīng)的功能,你會(huì)看不到更新的效果,你必須得重新加載你的PHP(使用kill -SIGUSR2強(qiáng)制重新加載)。
這個(gè)設(shè)定是不是有些蛋疼,但是我強(qiáng)烈建議你在生產(chǎn)環(huán)境中使用,why?因?yàn)楫?dāng)你在更新服務(wù)器代碼的時(shí)候,如果代碼較多,更新操作是有些延遲的,在這個(gè)延遲的過程中必然出現(xiàn)老代碼和新代碼混合的情況,這個(gè)時(shí)候?qū)τ脩粽?qǐng)求的處理必然存在不確定性。
opcache.max_accelerated_files這個(gè)選項(xiàng)用于控制內(nèi)存中最多可以緩存多少個(gè)PHP文件。這個(gè)選項(xiàng)必須得設(shè)置得足夠大,大于你的項(xiàng)目中的所有PHP文件的總和。我的代碼庫大概有6000個(gè)PHP文件,所以我把這個(gè)值設(shè)置為一個(gè)素?cái)?shù)7963。
真實(shí)的取值是在質(zhì)數(shù)集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個(gè)比設(shè)置值大的質(zhì)數(shù)。 設(shè)置值取值范圍最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。
聽起來好復(fù)雜,但用下面的命令就妥啦
你可以運(yùn)行 find . -type f -print | grep php | wc -l 這個(gè)命令來快速計(jì)算你的代碼庫中的PHP文件數(shù)。
opcache.memory_consumption這個(gè)選項(xiàng)的默認(rèn)值為64MB,我把它設(shè)置為192MB,因?yàn)槲业拇a很大。你可以通過調(diào)用opcachegetstatus()來獲取opcache使用的內(nèi)存的總量,如果這個(gè)值很大,你可以把這個(gè)選項(xiàng)設(shè)置得更大一些。
opcache.interned_strings_buffer這是一個(gè)很有用的選項(xiàng),但是似乎完全沒有文檔說明。PHP使用了一種叫做字符串駐留(string interning)的技術(shù)來改善性能。例如,如果你在代碼中使用了1000次字符串“foobar”,在PHP內(nèi)部只會(huì)在第一使用這個(gè)字符串的時(shí)候分配一個(gè)不可變的內(nèi)存區(qū)域來存儲(chǔ)這個(gè)字符串,其他的999次使用都會(huì)直接指向這個(gè)內(nèi)存區(qū)域。這個(gè)選項(xiàng)則會(huì)把這個(gè)特性提升一個(gè)層次——默認(rèn)情況下這個(gè)不可變的內(nèi)存區(qū)域只會(huì)存在于單個(gè)php-fpm的進(jìn)程中,如果設(shè)置了這個(gè)選項(xiàng),那么它將會(huì)在所有的php-fpm進(jìn)程中共享。在比較大的應(yīng)用中,這可以非常有效地節(jié)約內(nèi)存,提高應(yīng)用的性能。
這個(gè)選項(xiàng)的值是以兆字節(jié)(megabytes)作為單位,如果把它設(shè)置為16,則表示16MB,默認(rèn)是4MB,這是一個(gè)比較低的值。
opcache.fast_shutdown另外一個(gè)很有用但也沒有文檔說明的選項(xiàng)。從字面上理解就是“允許更快速關(guān)閉”。它的作用是在單個(gè)請(qǐng)求結(jié)束時(shí)提供一種更快速的機(jī)制來調(diào)用代碼中的析構(gòu)器,從而加快PHP的響應(yīng)速度和PHP進(jìn)程資源的回收速度,這樣應(yīng)用程序可以更快速地響應(yīng)下一個(gè)請(qǐng)求。把它設(shè)置為1就可以使用這個(gè)機(jī)制了。
最終我們對(duì)于opcache在php.ini的設(shè)置如下:
開發(fā)模式下推薦,直接禁用opcache擴(kuò)展更好
opcache.revalidate_freq=0 opcache.validate_timestamps=1 opcache.max_accelerated_files=3000 opcache.memory_consumption=192 opcache.interned_strings_buffer=16 opcache.fast_shutdown=1
多臺(tái)機(jī)器集群模式或者代碼更新頻繁時(shí)推薦,可以兼顧性能,方便代碼更新
opcache.revalidate_freq=300 opcache.validate_timestamps=1 opcache.max_accelerated_files=7963 opcache.memory_consumption=192 opcache.interned_strings_buffer=16 opcache.fast_shutdown=1
穩(wěn)定項(xiàng)目推薦,性能最好
opcache.revalidate_freq=0 opcache.validate_timestamps=0 opcache.max_accelerated_files=7963 opcache.memory_consumption=192 opcache.interned_strings_buffer=16 opcache.fast_shutdown=1
via: http://gywbd.github.io/posts/2016/1/best-config-for-zend-opcache.html
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/21733.html
摘要:概述字節(jié)碼緩存不是的新特性,有很多獨(dú)立的擴(kuò)展可以實(shí)現(xiàn),比如和等,但是截至目前這些擴(kuò)展都沒有集成到內(nèi)核,從開始,內(nèi)置了字節(jié)碼緩存功能,名為。開始之前,我們先來看看什么是字節(jié)碼緩存,以及字節(jié)碼緩存的作用是什么。該函數(shù)將重置整個(gè)字節(jié)碼緩存。 概述 字節(jié)碼緩存不是PHP的新特性,有很多獨(dú)立的擴(kuò)展可以實(shí)現(xiàn),比如APC、eAccelerator和Xache等,但是截至目前這些擴(kuò)展都沒有集成到PHP...
摘要:怎樣才算是高性能的應(yīng)用性能和速度不是一對(duì)同義詞。紅線表示針對(duì)速度進(jìn)行了優(yōu)化的腳本,藍(lán)線是可擴(kuò)展性優(yōu)先的腳本。將任何這些功能置于循環(huán)中可能會(huì)導(dǎo)致性能問題。完整的代碼檢測(cè)評(píng)估雖然可能很耗時(shí),但它可以為你提供有關(guān)應(yīng)用程序性能的深入信息。 showImg(https://segmentfault.com/img/bVNxDn?w=900&h=500);程序員都喜歡最新的PHP 7,因?yàn)樗筆H...
摘要:昨晚線上出故障,緊急處理切換容災(zāi)后緩解了故障,解決故障后從容災(zāi)切換回正式服務(wù)時(shí)發(fā)現(xiàn)文件更新無效,重啟后才生效。查看昨晚的日志,更新不生效持續(xù)時(shí)間遠(yuǎn)遠(yuǎn)大于秒,所以這個(gè)檢測(cè)間隔時(shí)間的問題可以了,我們繼續(xù)。 昨晚線上出故障,緊急處理切換容災(zāi)后緩解了故障,解決故障后從容災(zāi)切換回正式服務(wù)時(shí)發(fā)現(xiàn)PHP文件更新無效,重啟FPM后才生效。下面記錄復(fù)盤追查的過程。 因?yàn)槭荘HP文件更新不生效,所以馬上懷...
摘要:鳥哥點(diǎn)評(píng)相對(duì)于主要優(yōu)化也是在?;诘哪_本測(cè)試未開啟取平均值取平均值開啟取平均值取平均值在本次測(cè)試中,未開啟的情況下,性能比略有提升,開啟之后,比有很大的提升。測(cè)試結(jié)果和配置參數(shù)以及服務(wù)器配置有關(guān),僅供對(duì)比與的性能。 直播好久沒有曝光量了,自薦一波《PHP進(jìn)階之路》(PHPer們,好久沒有投資自己了呢?)原文地址 https://mengkang.net/1019.html PHP7.2...
摘要:從開始,內(nèi)置了字節(jié)碼緩存功能,名為。因?yàn)槭墙忉屝哉Z言,解釋器執(zhí)行腳本時(shí)會(huì)解析腳本代碼,生成一系列的操作碼,然后執(zhí)行字節(jié)碼,每次的請(qǐng)求都是這樣,會(huì)消耗很多資源,使用字節(jié)碼緩存可以緩存預(yù)先編譯的字節(jié)碼,減少響應(yīng)時(shí)間,降低系統(tǒng)資源的壓力。 Zend OPcache 1).從PHP5.0開始,內(nèi)置了字節(jié)碼緩存功能,名為Zend OPcache。因?yàn)镻HP是解釋性語言,PHP解釋器執(zhí)行PHP腳本...
閱讀 2497·2023-04-25 19:24
閱讀 1716·2021-11-11 16:54
閱讀 2842·2021-11-08 13:19
閱讀 3556·2021-10-25 09:45
閱讀 2563·2021-09-13 10:24
閱讀 3293·2021-09-07 10:15
閱讀 4046·2021-09-07 10:14
閱讀 2962·2019-08-30 15:56