1. 程式人生 > >轉 [PHP] - 性能加速 - 開啟Opcache

轉 [PHP] - 性能加速 - 開啟Opcache

黑名單 標準 The use 進制 空字符串 調用 work .so

原文地址:[PHP] - 性能加速 - 開啟Opcache

PHP7已經發布了, 作為PHP10年來最大的版本升級, 最大的性能升級, PHP7在多放的測試中都表現出很明顯的性能提升
技術分享圖片

一、開啟Opcache

在開啟opcache之前,我們先介紹一下編譯與解釋
編譯器是把源程序的每一條語句都編譯成機器語言,並保存成二進制文件,這樣運行時計算機可以直接以機器語言來運行此程序,速度很快;
而解釋器則是只在執行程序時,才一條一條的解釋成機器語言給計算機來執行,所以運行速度是不如編譯後的程序運行的快的.

  解釋型語言的實現中,翻譯器並不產生目標機器代碼,而是產生易於執行的中間代碼,這種中間代碼與機器代碼是不同的,中間代碼的解釋是由軟件支持的,不能直接使用硬件,軟件解釋器通常會導致執行效率較低。用解釋型語言編寫的程序是由另一個可以理解中間代碼的解釋程序執行的。與編譯程序不同的是,解釋程序的任務是逐一將源程序的語句解釋成可執行的機器指令,不需要將源程序翻譯成目標代碼後再執行。對於解釋型Basic語言,需要一個專門的解釋器解釋執行

在很多時候我們成為編譯,但是它實際是進行解釋的

對於一個編譯型程序,它的編譯和執行是分開的,先編譯成二進制可執行文件,然後在次執行。

  對於PHP、Python屬於解釋型語言,不產生機器碼,而是產生中間碼(中間碼是不能直接執行,這個中間嗎只有解釋器可以識別到,中間碼要靠解析器來進行執行)
比如說PHP的解析器是Zend,PHP使用Zend引擎,中間碼我們也稱作為操作碼(opcode)

Basic程序,每條語言只有在執行才被翻譯。這種解釋型語言每執行一次就翻譯一次,因而效率低下。

1、編輯:用編輯軟件(EDIT.EXE或記事本)形成源程序(.ASM),如:LX.ASM;
2、匯編:用匯編程序(MASM.EXE)對源程序進行匯編,形成目標文件(.OBJ),格式如下:MASM LX.ASM;
3、連接:用連接程序(LINK.EXE)對目標程序進行連接,形成可執行文件(.EXE),格式如下:LINK LX.OBJ;
4、執行:如果結果在屏幕在顯示,則直接執行可執行文件。
5、調試:用調試程序(DEBUG.EXE)對可執行文件進行調試,格式如下:DEBUG LX.EXE

摘選自:http://www.cnblogs.com/bluestorm/archive/2012/12/09/2810167.html

鳥哥在博客中說,提高PHP 7性能的幾個tips,第一條就是開啟opache,引用下原文:

  記得啟用Zend Opcache, 因為PHP7即使不啟用Opcache速度也比PHP-5.6啟用了Opcache快,
所以之前測試時期就發生了有人一直沒有啟用Opcache的事情

開啟opcache方法
PHP 5.5+版本以上的,可以使用PHP自帶的opcache開啟性能加速(默認是關閉的),PHP5.5之後opcache可以直接--enable-opcache 。對於PHP 5.5以下版本的,需要使用APC來進行緩存,這裏不說明,可以查看我們的優化之路中的PHP文章

PHP5.5之前需要使用APC來進行緩存,

PHP opcache 中文手冊

1. 打開php.ini文件
我使用的是PHP7,關於php7安裝可以查看我的另一篇文章
http://www.abcdocker.com/abcdocker/2144
路徑是在編譯的時候安裝的

2. 找到:[opcache],設置為:

[opcache]
; 開關打開
opcache.enable=1

; 設置共享內存大小, 單位為:Mb
opcache.memory_consumption=128

;如果啟用,那麽 OPcache 會每隔 opcache.revalidate_freq 設定的秒數 檢查腳本是否更新。 如果禁用此選項,你必須使用 opcache_reset() 或者 opcache_invalidate() 函數來手動重置 OPcache,也可以 通過重啟 Web 服務器來使文件系統更改生效。
opcache.validate_timestamps=60

#提示:在opcache使用軟連接的情況下,會存在opcache沒有被清除的情況.可以使用重啟fastcgi來解決這個問題.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3. 添加opcache.so
在php.ini最後一行添加opcache.so 主要作用是用來引用opcache

[root@abcdocker ~]# tail /etc/php.ini 
zend_extension="opcache.so"
  • 1
  • 2

4. 重啟Nginx和php

5. 測試
配置完成後,可以使用如下代碼查詢opcache:

<?php
    phpinfo();
?>
  • 1
  • 2
  • 3

註意:我們需要在nginx目錄下配置phpinfo測試文件

訪問頁面得到如下界面:http://www.abcdocker.com/phpinfo.php
技術分享圖片

我們除了可以在phpinfo上查看,還可以在php-fpm -m命令進行查看

[root@abcdocker ~]# /usr/local/php/sbin/php-fpm -m
[PHP Modules]
....
[Zend Modules]
Zend OPcache
  • 1
  • 2
  • 3
  • 4
  • 5

以下是opcache的配置說明:

        OPcache 配置選項

名字默認可修改範圍
opcache.enable “1” PHP_INI_ALL
opcache.enable_cli “0” PHP_INI_SYSTEM
opcache.memory_consumption “64” PHP_INI_SYSTEM
opcache.interned_strings_buffer “4” PHP_INI_SYSTEM
opcache.max_accelerated_files “2000” PHP_INI_SYSTEM
opcache.max_wasted_percentage “5” PHP_INI_SYSTEM
opcache.use_cwd “1” PHP_INI_SYSTEM
opcache.validate_timestamps “1” PHP_INI_ALL
opcache.revalidate_freq “2” PHP_INI_ALL
opcache.revalidate_path “0” PHP_INI_ALL
opcache.save_comments “1” PHP_INI_SYSTEM
opcache.load_comments “1” PHP_INI_ALL
opcache.fast_shutdown “0” PHP_INI_SYSTEM
opcache.enable_file_override “0” PHP_INI_SYSTEM
opcache.optimization_level “0xffffffff” PHP_INI_SYSTEM
opcache.inherited_hack “1” PHP_INI_SYSTEM
opcache.dups_fix “0” PHP_INI_ALL
opcache.blacklist_filename “” PHP_INI_SYSTEM
opcache.max_file_size “0” PHP_INI_SYSTEM
opcache.consistency_checks “0” PHP_INI_ALL
opcache.force_restart_timeout “180” PHP_INI_SYSTEM
opcache.error_log “” PHP_INI_SYSTEM
opcache.log_verbosity_level “1” PHP_INI_SYSTEM
opcache.preferred_memory_model “” PHP_INI_SYSTEM
opcache.protect_memory “0” PHP_INI_SYSTEM
opcache.mmap_base NULL PHP_INI_SYSTEM
opcache.restrict_api “” PHP_INI_SYSTEM

轉載:http://php.net/manual/zh/opcache.configuration.php


配置可被設定範圍

 這些模式決定著一個 PHP 的指令在何時何地,是否能夠被設定。手冊中的每個指令都有其所屬的模式。例如有些指令可以在 PHP 腳本中用 ini_set() 來設定,而有些則只能在 php.ini 或 httpd.conf 中。例如 output_buffering 指令是屬於 PHP_INI_PERDIR,因而就不能用 ini_set() 來設定。但是 display_errors 指令是屬於 PHP_INI_ALL 因而就可以在任何地方被設定,包括 ini_set()。

PHP_INI_* 模式的定義 模式 含義

模式含義
PHP_INI_USER 可在用戶腳本(例如 ini_set())或 Windows 註冊表(自 PHP 5.3 起)以及 .user.ini 中設定
PHP_INI_PERDIR 可在 php.ini,.htaccess 或 httpd.conf 中設定
PHP_INI_SYSTEM 可在 php.ini 或 httpd.conf 中設定
PHP_INI_ALL 可在任何地方設定
opcache.enable boolean
啟用操作碼緩存。如果禁用此選項,則不會優化和緩存代碼。 在運行期使用 ini_set() 函數只能禁用 opcache.enable 設置,不可以啟用此設置。 如果在腳本中嘗試啟用此設置項會產生警告。

opcache.enable_cli boolean
僅針對 CLI 版本的 PHP 啟用操作碼緩存。 通常被用來測試和調試。

opcache.memory_consumption integer
OPcache 的共享內存大小,以兆字節為單位。

opcache.interned_strings_buffer integer
用來存儲臨時字符串的內存大小,以兆字節為單位。 PHP 5.3.0 之前的版本會忽略此配置指令。

opcache.max_accelerated_files integer
  OPcache 哈希表中可存儲的腳本文件數量上限。 真實的取值是在質數集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個比設置值大的質數。 設置值取值範圍最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之後是 1000000。

opcache.max_wasted_percentage integer
 浪費內存的上限,以百分比計。 如果達到此上限,那麽 OPcache 將產生重新啟動續發事件。

opcache.use_cwd boolean
    如果啟用,OPcache 將在哈希表的腳本鍵之後附加改腳本的工作目錄, 以避免同名腳本沖突的問題。 禁用此選項可以提高性能,但是可能會導致應用崩潰。

opcache.validate_timestamps boolean
    如果啟用,那麽 OPcache 會每隔 opcache.revalidate_freq 設定的秒數 檢查腳本是否更新。 如果禁用此選項,你必須使用 opcache_reset() 或者 opcache_invalidate() 函數來手動重置 OPcache,也可以 通過重啟 Web 服務器來使文件系統更改生效。

opcache.revalidate_freq integer
    檢查腳本時間戳是否有更新的周期,以秒為單位。 設置為 0 會導致針對每個請求, OPcache 都會檢查腳本更新。
    如果 opcache.validate_timestamps 配置指令設置為禁用,那麽此設置項將會被忽略。

opcache.revalidate_path boolean
    如果禁用此選項,在同一個 include_path 已存在的緩存文件會被重用。 因此,將無法找到不在包含路徑下的同名文件。

opcache.save_comments boolean
    如果禁用,腳本文件中的註釋內容將不會被包含到操作碼緩存文件, 這樣可以有效減小優化後的文件體積。 禁用此配置指令可能會導致一些依賴註釋或註解的 應用或框架無法正常工作, 比如: Doctrine, Zend Framework 2 以及 PHPUnit。

opcache.load_comments boolean
    如果禁用,則即使文件中包含註釋,也不會加載這些註釋內容。 本選項可以和 opcache.save_comments 一起使用,以實現按需加載註釋內容。

opcache.fast_shutdown boolean
    如果啟用,則會使用快速停止續發事件。 所謂快速停止續發事件是指依賴 Zend 引擎的內存管理模塊 一次釋放全部請求變量的內存,而不是依次釋放每一個已分配的內存塊。

opcache.enable_file_override boolean
    如果啟用,則在調用函數 file_exists(), is_file() 以及 is_readable() 的時候, 都會檢查操作碼緩存,無論文件是否已經被緩存。 如果應用中包含檢查 PHP 腳本存在性和可讀性的功能,這樣可以提升性能。 但是如果禁用了 opcache.validate_timestamps 選項, 可能存在返回過時數據的風險。

opcache.optimization_level integer
    控制優化級別的二進制位掩碼。

opcache.inherited_hack boolean
    在 PHP 5.3 之前的版本,OPcache 會存儲代碼中使用 DECLARE_CLASS 操作碼 來實現繼承的位置。當文件被加載之後,OPcache 會嘗試使用當前環境來綁定被繼承的類。 由於當前腳本中可能並不需要 DECLARE_CLASS 操作碼,如果這樣的腳本需要對應的操作碼被定義時, 可能無法運行。
    在 PHP 5.3 及後續版本中,此配置指令會被忽略。

opcache.dups_fix boolean
    僅作為針對 “不可重定義類”錯誤的一種解決方案。

opcache.blacklist_filename string
    OPcache 黑名單文件位置。 黑名單文件為文本文件,包含了不進行預編譯優化的文件名,每行一個文件名。 黑名單中的文件名可以使用通配符,也可以使用前綴。 此文件中以分號(;)開頭的行將被視為註釋。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
簡單的黑名單文件可能如下所示:

; 將特定文件加入到黑名單
/var/www/broken.php
; 以字符 x 文件打頭的文件
/var/www/x
; 通配符匹配
/var/www/*-broken.php
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
opcache.max_file_size integer
    以字節為單位的緩存的文件大小上限。設置為 0 表示緩存全部文件。

opcache.consistency_checks integer
    如果是非 0 值,OPcache 將會每隔 N 次請求檢查緩存校驗和。 N 即為此配置指令的設置值。 由於此選項對於性能有較大影響,請盡在調試環境使用。

opcache.force_restart_timeout integer
    如果緩存處於非激活狀態,等待多少秒之後計劃重啟。 如果超出了設定時間,則 OPcache 模塊將殺除持有緩存鎖的進程, 並進行重啟。
    如果選項 opcache.log_verbosity_level 設置為 3 或者 3 以上的數值,當發生重啟時將在日誌中記錄一條錯誤信息。

opcache.error_log string
    OPcache 模塊的錯誤日誌文件。 如果留空,則視為 stderr, 錯誤日誌將被送往標準錯誤輸出 (通常情況下是 Web 服務器的錯誤日誌文件)。

opcache.log_verbosity_level integer
    OPcache 模塊的日誌級別。 默認情況下,僅有致命級別(0)及錯誤級別(1)的日誌會被記錄。 其他可用的級別有:警告(2),信息(3)和調試(4)。

opcache.preferred_memory_model string
    OPcache 首選的內存模塊。 如果留空,OPcache 會選擇適用的模塊, 通常情況下,自動選擇就可以滿足需求。
    可選值包括: mmap,shm, posix 以及 win32。

opcache.protect_memory boolean
    保護共享內存,以避免執行腳本時發生非預期的寫入。 僅用於內部調試。

opcache.mmap_base string
    在 Windows 平臺上共享內存段的基地址。 所有的 PHP 進程都將共享內存映射到同樣的地址空間。 使用此配置指令避免“無法重新附加到基地址”的錯誤。

opcache.restrict_api string
    僅允許路徑是以指定字符串開始的 PHP 腳本調用 OPcache API 函數。 默認值為空字符串 "",表示不做限制。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

轉載:http://php.net/manual/zh/opcache.configuration.php

二、PHP添加新的模塊

當我們PHP想添加新的擴張模塊時,可以使用一下方法。當然,以下方法是saltstack進行安裝拓展模塊的方法

項目一:saltstack 添加PHP memcached模塊

memcache-plugin:
  file.managed:
    - name: /usr/local/src/memcache-2.2.7.tgz
    - source: salt://php/files/memcache-2.2.7.tgz
    - user: root
    - group: root
    - mode: 755

  cmd.run:
    - name: cd /usr/local/src && tar zxf memcache-2.2.7.tgz && cd memcache-2.2.7&& /usr/local/php/bin/phpize && ./configure --enable-memcache --with-php-config=/usr/local/php/bin/php-config &&  make&& make install
    - unless: test -f /usr/local/php/lib/php/extensions/*/memcache.so
  require:
    - file: memcache-plugin
    - cmd: php-install

/usr/local/php/etc/php.ini:
  file.append:
    - text:
- extension=memcache.so
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

#溫馨提示:在saltstack中,不要安裝程序的時候直接復制原來的,會造成ID沖突memcache-plugin

步驟解釋:

1.下載 memcached軟件包

2.使用/usr/local/php/bin/phpize命令進行 phpize命令含義:phpize是用來擴展php擴展模塊的,通過phpize可以建立php的外掛模塊

3.在php.ini中添加一條extension=模塊名稱.so

4.重啟PHP即可

轉 [PHP] - 性能加速 - 開啟Opcache