摘要:概述字節碼緩存不是的新特性,有很多獨立的擴展可以實現,比如和等,但是截至目前這些擴展都沒有集成到內核,從開始,內置了字節碼緩存功能,名為。開始之前,我們先來看看什么是字節碼緩存,以及字節碼緩存的作用是什么。該函數將重置整個字節碼緩存。
概述
字節碼緩存不是PHP的新特性,有很多獨立的擴展可以實現,比如APC、eAccelerator和Xache等,但是截至目前這些擴展都沒有集成到PHP內核,從PHP 5.5.0開始,PHP內置了字節碼緩存功能,名為Zend Opcache。
開始之前,我們先來看看什么是字節碼緩存,以及字節碼緩存的作用是什么。
眾所周知,PHP是解釋型語言,構建在Zend 虛擬機之上,PHP解釋器在執行PHP腳本時會解析PHP腳本代碼,把PHP代碼編譯成一系列Zend操作碼( opcode,由于每個操作碼都是一個字節長,所以又叫字節碼,字節碼可以直接被Zend虛擬機執行),然后執行字節碼。每次請求PHP文件都是這樣,這會消耗很多資源,如果每次HTTP請求都必須不斷解析、編譯和執行PHP腳本,消耗的資源更多。如果PHP源碼不變,相應的字節碼也不會變化,顯然沒有必要每次都重新生成Opcode,結合在Web應用中無處不在的緩存機制,我們可以把首次生成的Opcode緩存起來,這樣下次直接從緩存取,豈不是很快?下面是啟用Opcode緩存之前和之后的流程圖:
字節碼緩存能存儲預先編譯好的PHP字節碼,這樣,下次請求PHP腳本時,PHP解釋器不用每次讀取、解析和編譯PHP代碼,直接從內存中讀取預先編譯好的字節碼,然后立即執行,這樣能省很多時間,極大提升應用的性能。
啟用Zend Opcache注:如果使用Windows開發環境,或者使用brew或apt-get等命令安裝的PHP可以略過編譯步驟。
默認情況下,Zend Opcache沒有開啟,需要我們在編譯時使用--enable-opcache指定啟用Zend Opcache。
編譯好PHP后還需要在php.ini中指定Opcache擴展路徑:
zend_extension=/path/to/opcache.so
一般而言PHP編譯成功后會顯示Zend Opcache擴展路徑,但如果想不起來,可以使用如下命令找到PHP擴展所在目錄:
php -ini | grep extensions
[info] 注:如果你使用Xdebug,需要在php.ini中先加載Zend Opcache,再加載Xdebug。
重啟后,查看phpinfo
php -info | grep Opcache配置Zend Opcache
啟用Zend Opcache后還需要在php.ini中配置Zend Opcache,下面是一份配置示例作為參考:
opcache.validate_timestamps=1 // 生產環境中配置為0 opcache.revalidate_freq=0 //檢查腳本時間戳是否有更新時間 opcache.memory_consumption=64 //Opcache的共享內存大小,以M為單位 opcache.interned_strings_buffer=16 //用來存儲臨時字符串的內存大小,以M為單位 opcache.max_accelerated_files=4000 //Opcache哈希表可以存儲的腳本文件數量上限 opcache.fast_shutdown=1 //使用快速停止續發事件
官網配置參考使用Zend Opcache
Zend Opcache使用起來很簡單,因為啟用之后它會自動運行,Zend Opcache會自動在內存中緩存預先編譯好的PHP字節碼,如果緩存了某個文件的字節碼,就執行對應的字節碼。
如果php.ini中配置了opcache.validate_timestamps值為0,需要小心,因為Zend Opcache將不能覺察PHP腳本的變化,必須手動清空Zend OPcache緩存的字節碼,才能讓它發現PHP文件的變動。這個配置適合在生產環境中設置為0,但在開發環境會帶來不便,我們可以在開發環境中這樣配置啟用自動驗證緩存功能:
opcache.enable=1 # 啟用操作碼緩存,默認為“1”, 如果禁用此選項,則不會優化和緩存代碼。 opcache.revalidate_freq=0 # 檢查腳本時間戳是否有更新的周期,以秒為單位。設置為 0 會導致針對每個請求, OPcache 都會檢查腳本更新。 opcache.validate_timestamps=1 # 如果啟用,那么 OPcache 會每隔 opcache.revalidate_freq 設定的秒數 檢查腳本是否更新。手動清理緩存
除了重啟php-fpm的進程可以清理opcache緩存外,
手動清理緩存涉及到的opcache函數主要為:opcache_reset()和opcache_invalidate() 。
boolean opcache_reset ( void ) # 該函數將重置整個字節碼緩存。 在調用 opcache_reset() 之后,所有的腳本將會重新載入并且在下次被點擊的時候重新解析。
[warning] 需要注意的是,當PHP以PHP-FPM的方式運行的時候,opcache的緩存是無法通過php命令進行清除的,只能通過http或cgi到php-fpm進程的方式來清除緩存。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/31470.html
摘要:磁盤高速緩存操作系統中使用磁盤高速緩存技術來提高磁盤的速度,對高速緩存復制的訪問要比原始數據訪問更為高效。因此,磁盤高速緩存在邏輯上屬于磁盤,物理上則是駐留在內存中的盤塊。 1. 磁盤高速緩存(Disk Cache) 操作系統中使用磁盤高速緩存技術來提高磁盤的I/O速度,對高速緩存復制的訪問要比原始數據訪問更為高效。例如,正在運行的進程的指令既存儲在磁盤上,也存儲在物理內存上,也被復...
摘要:什么是當解釋器完成對腳本代碼的分析后,便將它們生成可以直接運行的中間代碼,也稱為操作碼,。的目地是避免重復編譯,減少和內存開銷。這將帶來顯著的性能加速,通常特別是高流量和高并發量時降低了整體服務器的內存消耗,而且很少有缺點。 一、個人實踐發現opcache 最近為了應對雙十一期間高流量的沖擊,小編通過壓力測試去查找服務器性能瓶頸,發現100并發時,QPS并不是很高,但CPU和內存消耗特...
摘要:起就在中內置了服務器但只是提供開發測試使用,不推薦使用中生產環境中。因為這個服務器接受處理請求時順序執行的,不能并發處理。這個內置的服務器使用起來非常的方便,你只需要執行下面的命令啟動服務器然后就可以訪問了。 PHP 5.4起就在CLI SAPI中內置了web服務器,但只是提供開發測試使用,不推薦使用中生產環境中。因為這個服務器接受處理請求時順序執行的,不能并發處理。 這個內置的web...
說明 魔術方法就是在特定場景下不需要調用而自動執行的方法。因為有魔術方法,所以我們的類可以寫得很靈活~ __construct #構造方法,在類被實例化時自動調用,一般用于初始化操作; __destruct #析構方法,對象被銷毀時自動調用; __clone() #克隆方法,當對象被克隆時,將會自動調用 __get($key) #屬性獲取...
摘要:它使得在生產環境中啟用斷言為零成本,并且提供當斷言失敗時拋出特定異常的能力。錯誤和異常改變了大多數錯誤的報告方式。不同于傳統的錯誤報告機制,現在大多數錯誤被作為異常拋出。 PHP7性能 7最大的亮點,應該就是性能提高了兩倍,某些測試環境下甚至提高到三到五倍,具體可以了解以下鏈接: PHP7 VS HHVM (WordPress) HHVM vs PHP 7 – The Competit...
閱讀 2284·2023-04-25 16:42
閱讀 1198·2021-11-22 14:45
閱讀 2329·2021-10-19 13:10
閱讀 2821·2021-09-29 09:34
閱讀 3398·2021-09-23 11:21
閱讀 2094·2021-08-12 13:25
閱讀 2176·2021-07-30 15:15
閱讀 3488·2019-08-30 15:54