php高併發之opcache

来源:https://www.cnblogs.com/sgj123/archive/2019/05/23/10915372.html
-Advertisement-
Play Games

今天工作的時候接觸到客戶的一臺伺服器,業務邏輯比較簡單 。估算pv在120w左右吧,用的是阿裡雲2c4g的伺服器。一大早就開始卡頓了,登陸伺服器後查看負載到了八九十。 之後就想辦法調整一下吧。突然想起某位前輩說過的:開啟opcache吧,真的會變快的。 於是我馬上就開始整,過程很簡單 1.進入php ...


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

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

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

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()中進行查看。

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

       7.完成  驗證效果。

 

簡單說一下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 

 

    


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 委托定義類型,類型指定特定方法簽名。 可將滿足此簽名的方法(靜態或實例)分配給該類型的變數,然後(使用適當參數)直接調用該方法,或將其作為參數本身傳遞給另一方法再進行調用。 以下示例演示了委托的用法。 public delegate string Reverse(string s); 行創建特定簽名 ...
  • 1,C++ 中繼承是非常重要的一個特性,本節課研究在繼承的情形下,C++ 的對象模 型又有什麼不同; 2,繼承對象模型(最簡單的情況下): 1,在 C++ 編譯器的內部類可以理解為結構體; 2,子類是由父類成員疊加子類新成員得到的; 1,代碼示例: 1 class Derived : public ...
  • 0基礎、非電腦專業怎麼學Python?其中最重要的,我想就是基礎的夯實。掌握好Python語法等基礎知識,才能在做項目時事半功倍。今天我們就來看看2位前輩是怎麼自學Python的。希望對你有所幫助。 ...
  • 1.二維矩陣的轉置 2.矩陣相加,A,B矩陣均需要為一個N*M的矩陣,即相加矩陣的行和列必須相等 3.矩陣相乘,A,B矩陣需要滿足條件為A為m*n的矩陣,B為n*p的矩陣,結果C為m*p的矩陣 4.編寫函數利用三項式壓縮稀疏矩陣稀疏矩陣:一個矩陣的大部分元素為0,則是稀疏矩陣 三項式:非零項用(i, ...
  • 所屬網站分類: 面試經典 > python 作者:外星人入侵 鏈接: http://www.pythonheidong.com/blog/article/13/ 來源:python黑洞網 www.pythonheidong.com webbrowser模塊提供了一個高級介面來顯示基於Web的文檔,大 ...
  • 積跬步,行千里,先從最簡單的開始寫。 這一篇介紹V8中的時間模塊,與libuv粗糙的update_loop_time方法不同,V8有一套獨立完整的類負責管理時間。 該類位於src/base/platform/time.h,是一個輔助模塊,首先來看一下繼承樹。 整個模塊的繼承關係比較簡單,一般常用的就 ...
  • 統計字元串中每一個不同的字元 JDK9的新特性: List介面,Set介面,Map介面裡邊增加了一個靜態方法of,可以給集合一次性添加多個元素 使用前提:當集合中存儲的元素的個數已經確定了,不再改變使用,也就是說,添加完元素之後,就不能再使用put方法來添加元素了 註意事項: 1. of方法只適用於 ...
  • 伺服器免密登錄 由於有多台伺服器,每次登錄還需要 去找對應的伺服器地址,然後輸入密碼,為了避免麻煩,就使用了免密登錄。普通登錄方式: ssh -p 22 [email protected] 每次登錄還需要輸入密碼,比較麻煩 更換免密碼登錄: 本地操作: 本地的公鑰位置: ~/.ssh/i... ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...