PHP Opcache工做原理

雖然是在疫情期間,可是咱們仍是要不斷投資本身的大腦,這樣才能在從此的職場道路中讓本身更值錢。

PHP工做原理

首先,咱們先了解下解釋型語言PHP的工做原理,這有利於咱們瞭解PHP Opcache。php

對於PHP,咱們經常使用的是cli模式和php-fpm模式。下面咱們拿cli模式來描述下php執行腳本的運行過程:nginx

  1. php初始化執行,啓動zend引擎,加載已註冊的擴展模塊
  2. 讀取腳本文件,zend引擎對腳本進行詞法分析、語法分析、生成語法生成樹
  3. zend引擎編譯語法樹,生成opcode中間代碼
  4. zend引擎執行opcode,返回執行結果

對於cli模式來講,每次執行php腳本,都會將以上流程完整執行一遍。segmentfault

而對於php-fpm模式來講,php初始化環節(步驟1)會在php-fpm啓動時執行,而以後的步驟則是會在每次請求執行時重複執行(php-fpm+nginx的工做原理,不瞭解的同窗能夠翻看一下以前的文章nginx+php執行請求的工做原理)。瀏覽器

對於大流量高併發項目來講,每次執行腳本或者請求時都須要從新編譯固定不變的腳本文件,生成固定的opcode,確實有些浪費資源了,因此opcache應運而生。緩存

PHP Opcache

Opcache,簡單來講,是php應對每次都須要重複編譯的腳本文件而開發的組件,能夠節省上文所說的解析腳本文件的開銷。服務器

Opcache緩存的內容

目前,Opcache緩存的內容包括:微信

  • Opcode
  • Interned String(能夠理解爲php請求生命週期中不須要釋放的String,包括:變量名、類名、方法名、字符串、註釋等)

Opcache工做原理

Opcache工做原理實際上是使用了共享內存機制,將須要緩存的內容放入到共享內存中,供其餘進程使用。併發

由於Opcache在建立緩存的過程當中不會阻止其餘進程讀取,因此在使用Opcache時要注意兩點,否則會大量消耗資源:高併發

  • 不要給Opcache設置過時時間
  • 不要在流量高峯期發佈代碼

切記!php-fpm

Opcache配置

說了這麼多,下面咱們來看下Opcache如何配置呢?

Opcache配置是放置在php.ini文件中的(沒有安裝該擴展的同窗能夠自行百度安裝該擴展),咱們接下來主要講解一些重要的配置,以來提高PHP總體性能。

//添加Opcache擴展
zend_extension=opcache.so
//開啓Opcache
opcache.enable=1
//cli環境下啓用Opcache
opcache.enable_cli=1
//浪費內存的上限,以百分比計,若是達到該上限,Opcache則會清空並從新生成緩存。默認5%
opcache.max_wasted_percentage=5
//配置共享內存存儲大小,單位MB
opcache.memory_consumption=128
//用來存儲臨時字符串的內存大小,單位MB。這個配置就是上面說到的Opcache緩存的interned_string,它會在第一次使用到interned_string時緩存到共享內存中,供其餘進程後續使用
opcache.interned_strings_buffer=8
//用於控制共享內存最多能夠緩存多少個文件,該值最小範圍是200,在php5.5.6版本以後,最大值是1000000
opcache.max_accelerated_files=4000
//設置緩存的過時時間,爲0的話則每次都要檢查
opcache.revalidate_freq=60
//若是啓用,OPcache會在opcache.revalidate_freq設置的秒數去檢測文件的時間戳(timestamp)檢查腳本是否更新。若是這個選項被禁用(設置爲0),opcache.revalidate_freq會被忽略,PHP文件永遠不會被檢查。這意味着若是你修改了你的代碼,而後你把它更新到服務器上,再在瀏覽器上請求更新的代碼對應的功能,你會看不到更新的效果
opcache.validate_timestamps=0 //因此像我上面說的,在大流量高併發場景下,該項不要啓用,切記
//啓用後,能夠將依賴Zend引擎的內存管理模塊一次釋放所有請求變量的內存,而不是依次釋放每個已分配的內存塊。
opcache.fast_shutdown=1
//啓用文件緩存(設置緩存路徑),這樣Opcache就能夠將Opcode緩存到文件中,實現跨php生命週期緩存
opcache.file_cache=/tmp

總結

經歷過19年的裁人和20年的疫情以後,咱們應該明白只有不斷投資本身才是最重要的。只有不斷提高本身,才能讓本身應對不可控的變化!

最後,祝願你們在新的一年裏都能找到本身誠心如意的好工做。也歡迎你們關注個人微信公衆號和專欄:許錚的技術成長之路(id:xavier-tech-growth),來一塊兒學習技術知識。個人成長也許也是你的~

相關文章
相關標籤/搜索