php高併發之opcache

今天工做的時候接觸到客戶的一臺服務器,業務邏輯比較簡單 。估算pv在120w左右吧,用的是阿里雲2c4g的服務器。一大早就開始卡頓了,登錄服務器後查看負載到了八九十。php

以後就想辦法調整一下吧。忽然想起某位前輩說過的:開啓opcache吧,真的會變快的。web

因而我立刻就開始整,過程很簡單api

1.進入php,ini 搜索opcache 。瀏覽器

2,修改對應參數(以下)緩存

 1 zend_extension=opcache.so     #引入擴展 php7中默認已經裝好了  多是鼓勵你們用吧
 2 [opcache]
 3 ;opcache開關
 4 opcache.enable=1  
 5 
 6 ;CLI環境下,PHP啓用OPcache
 7 opcache.enable_cli=1
 8 
 9 ;OPcache共享內存存儲大小,單位MB
10 opcache.memory_consumption=128  
11 
12 ;PHP使用了一種叫作字符串駐留(string interning)的技術來改善性能。例如,若是你在代碼中使用了1000次字符串「foobar」,在PHP內部只會在第一使用這個字符串的時候分配一個不可變的內存區域來存儲這個字符串,其餘的999次使用都會直接指向這個內存區域。這個選項則會把這個特性提高一個層次——默認狀況下這個不可變的內存區域只會存在於單個php-fpm的進程中,若是設置了這個選項,那麼它將會在全部的php-fpm進程中共享。在比較大的應用中,這能夠很是有效地節約內存,提升應用的性能。
13 這個選項的值是以兆字節(megabytes)做爲單位,若是把它設置爲16,則表示16MB,默認是4MB
14 opcache.interned_strings_buffer=8
15 
16 ;這個選項用於控制內存中最多能夠緩存多少個PHP文件。這個選項必須得設置得足夠大,大於你的項目中的全部PHP文件的總和。
17 設置值取值範圍最小值是 200,最大值在 PHP 5.5.6 以前是 100000,PHP 5.5.6 及以後是 1000000。也就是說在200到1000000之間。
18 opcache.max_accelerated_files=10000
19 
20 ;設置緩存的過時時間(單位是秒),爲0的話每次都要檢查
21 opcache.revalidate_freq=60
22 
23 ;從字面上理解就是「容許更快速關閉」。它的做用是在單個請求結束時提供一種更快速的機制來調用代碼中的析構器,從而加快PHP的響應速度和PHP進程資源的回收速度,這樣應用程序能夠更快速地響應下一個請求。把它設置爲1就可使用這個機制了。
24 opcache.fast_shutdown=1
25 
26 ;若是啓用(設置爲1),OPcache會在opcache.revalidate_freq設置的秒數去檢測文件的時間戳(timestamp)檢查腳本是否更新。
27 若是這個選項被禁用(設置爲0),opcache.revalidate_freq會被忽略,PHP文件永遠不會被檢查。這意味着若是你修改了你的代碼,而後你把它更新到服務器上,再在瀏覽器上請求更新的代碼對應的功能,你會看不到更新的效果
28 強烈建議你在生產環境中設置爲0,更新代碼後,再平滑重啓PHP和web服務器。
29 opcache.validate_timestamps=0 
30 
31 ;開啓Opcache File Cache(實驗性), 經過開啓這個, 咱們可讓Opcache把opcode緩存緩存到外部文件中, 對於一些腳本, 會有很明顯的性能提高.
32 這樣PHP就會在/tmp目錄下Cache一些Opcode的二進制導出文件, 能夠跨PHP生命週期存在.
33 opcache.file_cache=/tmp

  4.重啓php服務器 (若是有配置問題的話會對應報錯 檢查後重作)服務器

  5.檢查擴展是否已經可用  php -m  查看是否有opcache  ,或者phpinfo()中進行查看。php7

  6.檢查程序是否有相應錯誤,開啓後可能對部分程序有影響(特別是那種依賴於註釋的程序,對對對就是那種刪除註釋會報錯那種)框架

       7.完成  驗證效果。ide

 

簡單說一下opcache 爲何會加快php的效率。 php 屬於解釋型語言,每次執行都要通過解釋器來進行翻譯 造成字節碼,而應該程序定型了以後基本是就不會進行變化的。函數

而opcache就把這個內容緩存到內存中。下降了重複沒有必要的勞動,進行減負。

     至於性能對應,明天我上一下圖。效果仍是很明顯的。服務器開始從滿負載到70%左右

 

   下面有一份更加詳細的配置說明有須要的能夠看一下。

 1 opcache.enable boolean
 2 啓用操做碼緩存。若是禁用此選項,則不會優化和緩存代碼。 在運行期使用 ini_set() 函數只能禁用 opcache.enable 設置,不能夠啓用此設置。 若是在腳本中嘗試啓用此設置項會產生警告。
 3 
 4 opcache.enable_cli boolean
 5 僅針對 CLI 版本的 PHP 啓用操做碼緩存。 一般被用來測試和調試。
 6 
 7 opcache.memory_consumption integer
 8 OPcache 的共享內存大小,以兆字節爲單位。
 9 
10 opcache.interned_strings_buffer integer
11 用來存儲臨時字符串的內存大小,以兆字節爲單位。 PHP 5.3.0 以前的版本會忽略此配置指令。
12 
13 opcache.max_accelerated_files integer
14   OPcache 哈希表中可存儲的腳本文件數量上限。 真實的取值是在質數集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個比設置值大的質數。 設置值取值範圍最小值是 200,最大值在 PHP 5.5.6 以前是 100000,PHP 5.5.6 及以後是 100000015 
16 opcache.max_wasted_percentage integer
17  浪費內存的上限,以百分比計。 若是達到此上限,那麼 OPcache 將產生從新啓動續發事件。
18 
19 opcache.use_cwd boolean
20     若是啓用,OPcache 將在哈希表的腳本鍵以後附加改腳本的工做目錄, 以免同名腳本衝突的問題。 禁用此選項能夠提升性能,可是可能會致使應用崩潰。
21 
22 opcache.validate_timestamps boolean
23     若是啓用,那麼 OPcache 會每隔 opcache.revalidate_freq 設定的秒數 檢查腳本是否更新。 若是禁用此選項,你必須使用 opcache_reset() 或者 opcache_invalidate() 函數來手動重置 OPcache,也能夠 經過重啓 Web 服務器來使文件系統更改生效。
24 
25 opcache.revalidate_freq integer
26     檢查腳本時間戳是否有更新的週期,以秒爲單位。 設置爲 0 會致使針對每一個請求, OPcache 都會檢查腳本更新。
27     若是 opcache.validate_timestamps 配置指令設置爲禁用,那麼此設置項將會被忽略。
28 
29 opcache.revalidate_path boolean
30     若是禁用此選項,在同一個 include_path 已存在的緩存文件會被重用。 所以,將沒法找到不在包含路徑下的同名文件。
31 
32 opcache.save_comments boolean
33     若是禁用,腳本文件中的註釋內容將不會被包含到操做碼緩存文件, 這樣能夠有效減少優化後的文件體積。 禁用此配置指令可能會致使一些依賴註釋或註解的 應用或框架沒法正常工做, 好比: Doctrine, Zend Framework 2 以及 PHPUnit。
34 
35 opcache.load_comments boolean
36     若是禁用,則即便文件中包含註釋,也不會加載這些註釋內容。 本選項能夠和 opcache.save_comments 一塊兒使用,以實現按需加載註釋內容。
37 
38 opcache.fast_shutdown boolean
39     若是啓用,則會使用快速中止續發事件。 所謂快速中止續發事件是指依賴 Zend 引擎的內存管理模塊 一次釋放所有請求變量的內存,而不是依次釋放每個已分配的內存塊。
40 
41 opcache.enable_file_override boolean
42     若是啓用,則在調用函數 file_exists(), is_file() 以及 is_readable() 的時候, 都會檢查操做碼緩存,不管文件是否已經被緩存。 若是應用中包含檢查 PHP 腳本存在性和可讀性的功能,這樣能夠提高性能。 可是若是禁用了 opcache.validate_timestamps 選項, 可能存在返回過期數據的風險。
43 
44 opcache.optimization_level integer
45     控制優化級別的二進制位掩碼。
46 
47 opcache.inherited_hack boolean
48     在 PHP 5.3 以前的版本,OPcache 會存儲代碼中使用 DECLARE_CLASS 操做碼 來實現繼承的位置。當文件被加載以後,OPcache 會嘗試使用當前環境來綁定被繼承的類。 因爲當前腳本中可能並不須要 DECLARE_CLASS 操做碼,若是這樣的腳本須要對應的操做碼被定義時, 可能沒法運行。
49     在 PHP 5.3 及後續版本中,此配置指令會被忽略。
50 
51 opcache.dups_fix boolean
52     僅做爲針對 「不可重定義類」錯誤的一種解決方案。
53 
54 opcache.blacklist_filename string
55     OPcache 黑名單文件位置。 黑名單文件爲文本文件,包含了不進行預編譯優化的文件名,每行一個文件名。 黑名單中的文件名可使用通配符,也可使用前綴。 此文件中以分號(;)開頭的行將被視爲註釋。
56 
57 簡單的黑名單文件可能以下所示:
58 
59 ; 將特定文件加入到黑名單
60 /var/www/broken.php
61 ; 以字符 x 文件打頭的文件
62 /var/www/x
63 ; 通配符匹配
64 /var/www/*-broken.php
65 
67 opcache.max_file_size integer
68     以字節爲單位的緩存的文件大小上限。設置爲 0 表示緩存所有文件。
69 
70 opcache.consistency_checks integer
71     若是是非 0 值,OPcache 將會每隔 N 次請求檢查緩存校驗和。 N 即爲此配置指令的設置值。 因爲此選項對於性能有較大影響,請盡在調試環境使用。
72 
73 opcache.force_restart_timeout integer
74     若是緩存處於非激活狀態,等待多少秒以後計劃重啓。 若是超出了設定時間,則 OPcache 模塊將殺除持有緩存鎖的進程, 並進行重啓。
75     若是選項 opcache.log_verbosity_level 設置爲 3 或者 3 以上的數值,當發生重啓時將在日誌中記錄一條錯誤信息。
76 
77 opcache.error_log string
78     OPcache 模塊的錯誤日誌文件。 若是留空,則視爲 stderr, 錯誤日誌將被送往標準錯誤輸出 (一般狀況下是 Web 服務器的錯誤日誌文件)。
79 
80 opcache.log_verbosity_level integer
81     OPcache 模塊的日誌級別。 默認狀況下,僅有致命級別(0)及錯誤級別(1)的日誌會被記錄。 其餘可用的級別有:警告(2),信息(3)和調試(4)。
82 
83 opcache.preferred_memory_model string
84     OPcache 首選的內存模塊。 若是留空,OPcache 會選擇適用的模塊, 一般狀況下,自動選擇就能夠知足需求。
85     可選值包括: mmap,shm, posix 以及 win32。
86 
87 opcache.protect_memory boolean
88     保護共享內存,以免執行腳本時發生非預期的寫入。 僅用於內部調試。
89 
90 opcache.mmap_base string
91     在 Windows 平臺上共享內存段的基地址。 全部的 PHP 進程都將共享內存映射到一樣的地址空間。 使用此配置指令避免「沒法從新附加到基地址」的錯誤。
92 
93 opcache.restrict_api string
94     僅容許路徑是以指定字符串開始的 PHP 腳本調用 OPcache API 函數。 默認值爲空字符串 "",表示不作限
95 
相關文章
相關標籤/搜索