讓子彈飛~利用OPcache擴充套件提升PHP7效能 | laravel篇

TigerJin發表於2021-09-09

前言
十一點半了,沉澱時間到了。

PHP在執行的時候,存在這樣的一個流程,先將PHP程式碼預編譯,生成位元組碼後再載入到記憶體裡,最後CPU在記憶體上執行編譯後的位元組碼片段。我們會發現,在執行PHP程式的時候,每次都經過這樣的流程,此非浪費Time,是的,很容易聯想到:為何不向C++語言看齊呢,將原始碼編譯成可直接載入到記憶體so哥呢?呃呃。快拿出你的步槍,裝上這顆子彈OPcache。自從PHP5.5.0出來後,就內建此zend擴充套件了。


What is OPcache
OPcache是PHP中的Zend擴充套件,可以大大提升PHP的效能。
OPcache 透過將 PHP 指令碼預編譯的位元組碼儲存到共享記憶體中來提升 PHP 的效能, 儲存預編譯位元組碼的好處就是 省去了每次載入和解析 PHP 指令碼的開銷。


Judge whether it has been extended OPcache

  ~ php -m | grep OPcache
Zend OPcache
Zend OPcache

倘若沒有開啟的話,可以在php.ini配置中開啟
/home/samego/service/php7.2/php.ini

  ~ echo zend_extension="opcache.so" >> /home/samego/service/php7.2/php.ini

About OPcache configure
接下來,我們需要在 PHP 的配置檔案中啟用 OPcache(預設是關閉的):

opcache.enable=1

下面我們繼續對 OPcache 進行一些最佳化配置:

opcache.memory_consumption=512

這個配置表示你想要分配給 OPcache 的記憶體空間(單位:MB),設定一個大於 64 的值即可。

opcache.interned_strings_buffer=64

這個配置表示你想要分配給實際字串的空間(單位:MB),設定一個大於 16 的值即可。

opcache.max_accelerated_files=32531

這個配置表示可以快取多少個指令碼,將這個值儘可能設定為與專案包含的指令碼數接近(或更大)。

opcache.validate_timestamps=0

改配置值用於重新驗證指令碼,如果設定為 0(效能最佳),需要手動在每次 PHP 程式碼更改後手動清除 OPcache。如果你不想要手動清除,可以將其設定為 1 並透過 opcache.revalidate_freq 配置重新驗證間隔,這可能會消耗一些效能,因為需要每隔 x 秒檢查更改。

opcache.save_comments=1

這個配置會在指令碼中保留註釋,我推薦開啟該選項,因為一些庫依賴於這個配置,並且我也找不出什麼關閉它的好處。

opcache.fast_shutdown=0

快速關閉會給一個更快速清理記憶體的機制,不過,在我的基準測試中,更慢一些,可能這會應用帶來一些效能提升,但是你需要自己去嘗試。

所以,最終的配置最佳化長這樣:

opcache.enable=1
opcache.memory_consumption=512
opcache.interned_strings_buffer=64
opcache.max_accelerated_files=32531
opcache.validate_timestamps=0
opcache.save_comments=1
opcache.fast_shutdown=0

你可以使用這些配置值進行實驗,具體配置值取決於你的應用大小和伺服器配置。


Laravel OPcache

  • install

  ~ composer require appstract/laravel-opcache
  • configure

  ~ php artisan vendor:publish --provider="AppstractOpcacheOpcacheServiceProvider" --tag="config"
  • command

# Clear OPcache:  ~ php artisan opcache:clear# Show OPcache config:  ~ php artisan opcache:config# Show OPcache status:  ~ php artisan opcache:status# Pre-compile your application code:  ~ php artisan opcache:optimize

拭目以待的場景測試

個人比較喜歡資料說話
場景:(1)請求GET介面 (2)測試次數10  (3)併發數為100

case non-extension

1000個請求,花費32.32秒,每秒30.94個請求

Transactions:               1000 hits
Availability:             100.00 %
Elapsed time:              32.32 secs
Data transferred:           0.97 MB
Response time:              0.32 secs
Transaction rate:          30.94 trans/sec
Throughput:             0.03 MB/sec
Concurrency:                9.96
Successful transactions:        1000
Failed transactions:               0
Longest transaction:            0.44
Shortest transaction:           0.11

case had extend

1000個請求,花費2.94秒,每秒340.14個請求

Transactions:               1000 hits
Availability:             100.00 %
Elapsed time:               2.94 secs
Data transferred:           0.97 MB
Response time:              0.03 secs
Transaction rate:         340.14 trans/sec
Throughput:             0.33 MB/sec
Concurrency:                9.86
Successful transactions:        1000
Failed transactions:               0
Longest transaction:            0.29
Shortest transaction:           0.01



作者:AlicFeng
連結:


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2144/viewspace-2819799/,如需轉載,請註明出處,否則將追究法律責任。

相關文章