佳木斯湛栽影视文化发展公司

主頁 > 知識庫 > PHP解決高并發(fā)問題(opcache)

PHP解決高并發(fā)問題(opcache)

熱門標(biāo)簽:阿里云 科大訊飛語音識別系統(tǒng) 銀行業(yè)務(wù) 電子圍欄 Linux服務(wù)器 Mysql連接數(shù)設(shè)置 服務(wù)器配置 團(tuán)購網(wǎng)站

php高并發(fā)之opcache

今天工作的時候接觸到客戶的一臺服務(wù)器,業(yè)務(wù)邏輯比較簡單 。估算pv在120w左右吧,用的是阿里云2c4g的服務(wù)器。一大早就開始卡頓了,登陸服務(wù)器后查看負(fù)載到了八九十。

之后就想辦法調(diào)整一下吧。突然想起某位前輩說過的:開啟opcache吧,真的會變快的。

于是我馬上就開始整,過程很簡單

1.進(jìn)入php,ini 搜索opcache 。

2,修改對應(yīng)參數(shù)(如下)

zend_extension=opcache.so     #引入擴(kuò)展 php7中默認(rèn)已經(jīng)裝好了  可能是鼓勵大家用吧
[opcache]
;opcache開關(guān)
opcache.enable=1

;CLI環(huán)境下,PHP啟用OPcache
opcache.enable_cli=1

;OPcache共享內(nèi)存存儲大小,單位MB
opcache.memory_consumption=128

;PHP使用了一種叫做字符串駐留(string interning)的技術(shù)來改善性能。例如,如果你在代碼中使用了1000次字符串“foobar”,在PHP內(nèi)部只會在第一使用這個字符串的時候分配一個不可變的內(nèi)存區(qū)域來存儲這個字符串,其他的999次使用都會直接指向這個內(nèi)存區(qū)域。這個選項(xiàng)則會把這個特性提升一個層次——默認(rèn)情況下這個不可變的內(nèi)存區(qū)域只會存在于單個php-fpm的進(jìn)程中,如果設(shè)置了這個選項(xiàng),那么它將會在所有的php-fpm進(jìn)程中共享。在比較大的應(yīng)用中,這可以非常有效地節(jié)約內(nèi)存,提高應(yīng)用的性能。
這個選項(xiàng)的值是以兆字節(jié)(megabytes)作為單位,如果把它設(shè)置為16,則表示16MB,默認(rèn)是4MB
opcache.interned_strings_buffer=8

;這個選項(xiàng)用于控制內(nèi)存中最多可以緩存多少個PHP文件。這個選項(xiàng)必須得設(shè)置得足夠大,大于你的項(xiàng)目中的所有PHP文件的總和。
設(shè)置值取值范圍最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。也就是說在200到1000000之間。
opcache.max_accelerated_files=10000

;設(shè)置緩存的過期時間(單位是秒),為0的話每次都要檢查
opcache.revalidate_freq=60

;從字面上理解就是“允許更快速關(guān)閉”。它的作用是在單個請求結(jié)束時提供一種更快速的機(jī)制來調(diào)用代碼中的析構(gòu)器,從而加快PHP的響應(yīng)速度和PHP進(jìn)程資源的回收速度,這樣應(yīng)用程序可以更快速地響應(yīng)下一個請求。把它設(shè)置為1就可以使用這個機(jī)制了。
opcache.fast_shutdown=1

;如果啟用(設(shè)置為1),OPcache會在opcache.revalidate_freq設(shè)置的秒數(shù)去檢測文件的時間戳(timestamp)檢查腳本是否更新。
如果這個選項(xiàng)被禁用(設(shè)置為0),opcache.revalidate_freq會被忽略,PHP文件永遠(yuǎn)不會被檢查。這意味著如果你修改了你的代碼,然后你把它更新到服務(wù)器上,再在瀏覽器上請求更新的代碼對應(yīng)的功能,你會看不到更新的效果
強(qiáng)烈建議你在生產(chǎn)環(huán)境中設(shè)置為0,更新代碼后,再平滑重啟PHP和web服務(wù)器。
opcache.validate_timestamps=0

;開啟Opcache File Cache(實(shí)驗(yàn)性), 通過開啟這個, 我們可以讓Opcache把opcode緩存緩存到外部文件中, 對于一些腳本, 會有很明顯的性能提升.
這樣PHP就會在/tmp目錄下Cache一些Opcode的二進(jìn)制導(dǎo)出文件, 可以跨PHP生命周期存在.
opcache.file_cache=/tmp

4.重啟php服務(wù)器 (如果有配置問題的話會對應(yīng)報錯 檢查后重做)

5.檢查擴(kuò)展是否已經(jīng)可用 php -m 查看是否有opcache ,或者phpinfo()中進(jìn)行查看。

6.檢查程序是否有相應(yīng)錯誤,開啟后可能對部分程序有影響(特別是那種依賴于注釋的程序,對對對就是那種刪除注釋會報錯那種)

7.完成 驗(yàn)證效果。

簡單說一下opcache 為什么會加快php的效率。 php 屬于解釋型語言,每次執(zhí)行都要經(jīng)過解釋器來進(jìn)行翻譯 形成字節(jié)碼,而應(yīng)該程序定型了之后基本是就不會進(jìn)行變化的。 而opcache就把這個內(nèi)容緩存到內(nèi)存中。降低了重復(fù)沒有必要的勞動,進(jìn)行減負(fù)。 至于性能對應(yīng),明天我上一下圖。效果還是很明顯的。服務(wù)器開始從滿負(fù)載到70%左右

下面有一份更加詳細(xì)的配置說明有需要的可以看一下。

1 opcache.enable boolean
 2 啟用操作碼緩存。如果禁用此選項(xiàng),則不會優(yōu)化和緩存代碼。 在運(yùn)行期使用 ini_set() 函數(shù)只能禁用 opcache.enable 設(shè)置,不可以啟用此設(shè)置。 如果在腳本中嘗試啟用此設(shè)置項(xiàng)會產(chǎn)生警告。
 3 
 4 opcache.enable_cli boolean
 5 僅針對 CLI 版本的 PHP 啟用操作碼緩存。 通常被用來測試和調(diào)試。
 6 
 7 opcache.memory_consumption integer
 8 OPcache 的共享內(nèi)存大小,以兆字節(jié)為單位。
 9 
10 opcache.interned_strings_buffer integer
11 用來存儲臨時字符串的內(nèi)存大小,以兆字節(jié)為單位。 PHP 5.3.0 之前的版本會忽略此配置指令。
12 
13 opcache.max_accelerated_files integer
14   OPcache 哈希表中可存儲的腳本文件數(shù)量上限。 真實(shí)的取值是在質(zhì)數(shù)集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個比設(shè)置值大的質(zhì)數(shù)。 設(shè)置值取值范圍最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。
15 
16 opcache.max_wasted_percentage integer
17  浪費(fèi)內(nèi)存的上限,以百分比計(jì)。 如果達(dá)到此上限,那么 OPcache 將產(chǎn)生重新啟動續(xù)發(fā)事件。
18 
19 opcache.use_cwd boolean
20     如果啟用,OPcache 將在哈希表的腳本鍵之后附加改腳本的工作目錄, 以避免同名腳本沖突的問題。 禁用此選項(xiàng)可以提高性能,但是可能會導(dǎo)致應(yīng)用崩潰。
21 
22 opcache.validate_timestamps boolean
23     如果啟用,那么 OPcache 會每隔 opcache.revalidate_freq 設(shè)定的秒數(shù) 檢查腳本是否更新。 如果禁用此選項(xiàng),你必須使用 opcache_reset() 或者 opcache_invalidate() 函數(shù)來手動重置 OPcache,也可以 通過重啟 Web 服務(wù)器來使文件系統(tǒng)更改生效。
24 
25 opcache.revalidate_freq integer
26     檢查腳本時間戳是否有更新的周期,以秒為單位。 設(shè)置為 0 會導(dǎo)致針對每個請求, OPcache 都會檢查腳本更新。
27     如果 opcache.validate_timestamps 配置指令設(shè)置為禁用,那么此設(shè)置項(xiàng)將會被忽略。
28 
29 opcache.revalidate_path boolean
30     如果禁用此選項(xiàng),在同一個 include_path 已存在的緩存文件會被重用。 因此,將無法找到不在包含路徑下的同名文件。
31 
32 opcache.save_comments boolean
33     如果禁用,腳本文件中的注釋內(nèi)容將不會被包含到操作碼緩存文件, 這樣可以有效減小優(yōu)化后的文件體積。 禁用此配置指令可能會導(dǎo)致一些依賴注釋或注解的 應(yīng)用或框架無法正常工作, 比如: Doctrine, Zend Framework 2 以及 PHPUnit。
34 
35 opcache.load_comments boolean
36     如果禁用,則即使文件中包含注釋,也不會加載這些注釋內(nèi)容。 本選項(xiàng)可以和 opcache.save_comments 一起使用,以實(shí)現(xiàn)按需加載注釋內(nèi)容。
37 
38 opcache.fast_shutdown boolean
39     如果啟用,則會使用快速停止續(xù)發(fā)事件。 所謂快速停止續(xù)發(fā)事件是指依賴 Zend 引擎的內(nèi)存管理模塊 一次釋放全部請求變量的內(nèi)存,而不是依次釋放每一個已分配的內(nèi)存塊。
40 
41 opcache.enable_file_override boolean
42     如果啟用,則在調(diào)用函數(shù) file_exists(), is_file() 以及 is_readable() 的時候, 都會檢查操作碼緩存,無論文件是否已經(jīng)被緩存。 如果應(yīng)用中包含檢查 PHP 腳本存在性和可讀性的功能,這樣可以提升性能。 但是如果禁用了 opcache.validate_timestamps 選項(xiàng), 可能存在返回過時數(shù)據(jù)的風(fēng)險。
43 
44 opcache.optimization_level integer
45     控制優(yōu)化級別的二進(jìn)制位掩碼。
46 
47 opcache.inherited_hack boolean
48     在 PHP 5.3 之前的版本,OPcache 會存儲代碼中使用 DECLARE_CLASS 操作碼 來實(shí)現(xiàn)繼承的位置。當(dāng)文件被加載之后,OPcache 會嘗試使用當(dāng)前環(huán)境來綁定被繼承的類。 由于當(dāng)前腳本中可能并不需要 DECLARE_CLASS 操作碼,如果這樣的腳本需要對應(yīng)的操作碼被定義時, 可能無法運(yùn)行。
49     在 PHP 5.3 及后續(xù)版本中,此配置指令會被忽略。
50 
51 opcache.dups_fix boolean
52     僅作為針對 “不可重定義類”錯誤的一種解決方案。
53 
54 opcache.blacklist_filename string
55     OPcache 黑名單文件位置。 黑名單文件為文本文件,包含了不進(jìn)行預(yù)編譯優(yōu)化的文件名,每行一個文件名。 黑名單中的文件名可以使用通配符,也可以使用前綴。 此文件中以分號(;)開頭的行將被視為注釋。
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     以字節(jié)為單位的緩存的文件大小上限。設(shè)置為 0 表示緩存全部文件。
69 
70 opcache.consistency_checks integer
71     如果是非 0 值,OPcache 將會每隔 N 次請求檢查緩存校驗(yàn)和。 N 即為此配置指令的設(shè)置值。 由于此選項(xiàng)對于性能有較大影響,請盡在調(diào)試環(huán)境使用。
72 
73 opcache.force_restart_timeout integer
74     如果緩存處于非激活狀態(tài),等待多少秒之后計(jì)劃重啟。 如果超出了設(shè)定時間,則 OPcache 模塊將殺除持有緩存鎖的進(jìn)程, 并進(jìn)行重啟。
75     如果選項(xiàng) opcache.log_verbosity_level 設(shè)置為 3 或者 3 以上的數(shù)值,當(dāng)發(fā)生重啟時將在日志中記錄一條錯誤信息。
76 
77 opcache.error_log string
78     OPcache 模塊的錯誤日志文件。 如果留空,則視為 stderr, 錯誤日志將被送往標(biāo)準(zhǔn)錯誤輸出 (通常情況下是 Web 服務(wù)器的錯誤日志文件)。
79 
80 opcache.log_verbosity_level integer
81     OPcache 模塊的日志級別。 默認(rèn)情況下,僅有致命級別(0)及錯誤級別(1)的日志會被記錄。 其他可用的級別有:警告(2),信息(3)和調(diào)試(4)。
82 
83 opcache.preferred_memory_model string
84     OPcache 首選的內(nèi)存模塊。 如果留空,OPcache 會選擇適用的模塊, 通常情況下,自動選擇就可以滿足需求。
85     可選值包括: mmap,shm, posix 以及 win32。
86 
87 opcache.protect_memory boolean
88     保護(hù)共享內(nèi)存,以避免執(zhí)行腳本時發(fā)生非預(yù)期的寫入。 僅用于內(nèi)部調(diào)試。
89 
90 opcache.mmap_base string
91     在 Windows 平臺上共享內(nèi)存段的基地址。 所有的 PHP 進(jìn)程都將共享內(nèi)存映射到同樣的地址空間。 使用此配置指令避免“無法重新附加到基地址”的錯誤。
92 
93 opcache.restrict_api string
94     僅允許路徑是以指定字符串開始的 PHP 腳本調(diào)用 OPcache API 函數(shù)。 默認(rèn)值為空字符串 "",表示不做限
95

到此這篇關(guān)于PHP解決高并發(fā)問題(opcache)的文章就介紹到這了,更多相關(guān)PHP高并發(fā)(opcache)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Android基于SoftReference緩存圖片的方法
  • Java jvm中Code Cache案例詳解
  • Java reservedcodecachesize虛擬機(jī)參數(shù)案例詳解
  • 解析springboot整合谷歌開源緩存框架Guava Cache原理
  • PHP之深入學(xué)習(xí)Yii2緩存Cache組件詳細(xì)講解
  • 解決@Cacheable在同一個類中方法調(diào)用不起作用的問題
  • java中Memcached的使用實(shí)例(包括與Spring整合)
  • Java SoftReference類案例詳解

標(biāo)簽:棗莊 蚌埠 江蘇 大理 衢州 衡水 萍鄉(xiāng) 廣元

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《PHP解決高并發(fā)問題(opcache)》,本文關(guān)鍵詞  ;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 收縮
    • 微信客服
    • 微信二維碼
    • 電話咨詢

    • 400-1100-266
    鹤山市| 汪清县| 长寿区| 桃园市| 乌鲁木齐县| 霍林郭勒市| 峨边| 五华县| 德格县| 五河县| 通许县| 丘北县| 西青区| 福安市| 博客| 普洱| 北票市| 将乐县| 双柏县| 柳州市| 南溪县| 会东县| 德令哈市| 茌平县| 鸡西市| 商都县| 新龙县| 栾川县| 宜阳县| 曲阳县| 石楼县| 小金县| 祁阳县| 凌源市| 中牟县| 大埔区| 临邑县| 通许县| 南康市| 广昌县| 慈利县|