PHP7已經(jīng)發(fā)布了, 作為PHP10年來(lái)最大的版本升級(jí), 最大的性能升級(jí), PHP7在多放的測(cè)試中都表現(xiàn)出很明顯的性能提升
在開(kāi)啟opcache之前,我們先介紹一下編譯與解釋
編譯器是把源程序的每一條語(yǔ)句都編譯成機(jī)器語(yǔ)言,并保存成二進(jìn)制文件,這樣運(yùn)行時(shí)計(jì)算機(jī)可以直接以機(jī)器語(yǔ)言來(lái)運(yùn)行此程序,速度很快;
而解釋器則是只在執(zhí)行程序時(shí),才一條一條的解釋成機(jī)器語(yǔ)言給計(jì)算機(jī)來(lái)執(zhí)行,所以運(yùn)行速度是不如編譯后的程序運(yùn)行的快的.
解釋型語(yǔ)言的實(shí)現(xiàn)中,翻譯器并不產(chǎn)生目標(biāo)機(jī)器代碼,而是產(chǎn)生易于執(zhí)行的中間代碼,這種中間代碼與機(jī)器代碼是不同的,中間代碼的解釋是由軟件支持的,不能直接使用硬件,軟件解釋器通常會(huì)導(dǎo)致執(zhí)行效率較低。用解釋型語(yǔ)言編寫(xiě)的程序是由另一個(gè)可以理解中間代碼的解釋程序執(zhí)行的。與編譯程序不同的是,解釋程序的任務(wù)是逐一將源程序的語(yǔ)句解釋成可執(zhí)行的機(jī)器指令,不需要將源程序翻譯成目標(biāo)代碼后再執(zhí)行。對(duì)于解釋型Basic語(yǔ)言,需要一個(gè)專(zhuān)門(mén)的解釋器解釋執(zhí)行
在很多時(shí)候我們成為編譯,但是它實(shí)際是進(jìn)行解釋的
對(duì)于一個(gè)編譯型程序,它的編譯和執(zhí)行是分開(kāi)的,先編譯成二進(jìn)制可執(zhí)行文件,然后在次執(zhí)行。
對(duì)于PHP、Python屬于解釋型語(yǔ)言,不產(chǎn)生機(jī)器碼,而是產(chǎn)生中間碼(中間碼是不能直接執(zhí)行,這個(gè)中間嗎只有解釋器可以識(shí)別到,中間碼要靠解析器來(lái)進(jìn)行執(zhí)行)
比如說(shuō)PHP的解析器是Zend,PHP使用Zend引擎,中間碼我們也稱(chēng)作為操作碼(opcode)
Basic程序,每條語(yǔ)言只有在執(zhí)行才被翻譯。這種解釋型語(yǔ)言每執(zhí)行一次就翻譯一次,因而效率低下。
1、編輯:用編輯軟件(EDIT.EXE或記事本)形成源程序(.ASM),如:LX.ASM;
2、匯編:用匯編程序(MASM.EXE)對(duì)源程序進(jìn)行匯編,形成目標(biāo)文件(.OBJ),格式如下:MASM LX.ASM;
3、連接:用連接程序(LINK.EXE)對(duì)目標(biāo)程序進(jìn)行連接,形成可執(zhí)行文件(.EXE),格式如下:LINK LX.OBJ;
4、執(zhí)行:如果結(jié)果在屏幕在顯示,則直接執(zhí)行可執(zhí)行文件。
5、調(diào)試:用調(diào)試程序(DEBUG.EXE)對(duì)可執(zhí)行文件進(jìn)行調(diào)試,格式如下:DEBUG LX.EXE
鳥(niǎo)哥在博客中說(shuō),提高PHP 7性能的幾個(gè)tips,第一條就是開(kāi)啟opache,引用下原文:
記得啟用Zend Opcache, 因?yàn)镻HP7即使不啟用Opcache速度也比PHP-5.6啟用了Opcache快,
所以之前測(cè)試時(shí)期就發(fā)生了有人一直沒(méi)有啟用Opcache的事情
開(kāi)啟opcache方法
PHP 5.5+版本以上的,可以使用PHP自帶的opcache開(kāi)啟性能加速(默認(rèn)是關(guān)閉的),PHP5.5之后opcache可以直接--enable-opcache
。對(duì)于PHP 5.5以下版本的,需要使用APC來(lái)進(jìn)行緩存
PHP5.5之前需要使用APC來(lái)進(jìn)行緩存,
PHP opcache 中文手冊(cè)
1. 打開(kāi)php.ini文件
我使用的是PHP7,關(guān)于php7安裝可以查看我的另一篇文章
http://theartemis.cn/article/24436
路徑是在編譯的時(shí)候安裝的
2. 找到:[opcache]
,設(shè)置為:
[opcache] ; 開(kāi)關(guān)打開(kāi) opcache.enable=1 ; 設(shè)置共享內(nèi)存大小, 單位為:Mb opcache.memory_consumption=128 ;如果啟用,那么 OPcache 會(huì)每隔 opcache.revalidate_freq 設(shè)定的秒數(shù) 檢查腳本是否更新。 如果禁用此選項(xiàng),你必須使用 opcache_reset() 或者 opcache_invalidate() 函數(shù)來(lái)手動(dòng)重置 OPcache,也可以 通過(guò)重啟 Web 服務(wù)器來(lái)使文件系統(tǒng)更改生效。 opcache.validate_timestamps=60 #提示:在opcache使用軟連接的情況下,會(huì)存在opcache沒(méi)有被清除的情況.可以使用重啟fastcgi來(lái)解決這個(gè)問(wèn)題.
windows中打開(kāi)php.ini,查找下 opcache,將代碼設(shè)置為:
[opcache] ; dll地址 zend_extension=php_opcache.dll ; 開(kāi)關(guān)打開(kāi) opcache.enable=1 ; 開(kāi)啟CLI opcache.enable_cli=1 ; 可用內(nèi)存, 酌情而定, 單位為:Mb opcache.memory_consumption=528 ; Zend Optimizer + 暫存池中字符串的占內(nèi)存總量.(單位:MB) opcache.interned_strings_buffer=8 ; 對(duì)多緩存文件限制, 命中率不到 100% 的話, 可以試著提高這個(gè)值 opcache.max_accelerated_files=10000 ; Opcache 會(huì)在一定時(shí)間內(nèi)去檢查文件的修改時(shí)間, 這里設(shè)置檢查的時(shí)間周期, 默認(rèn)為 2, 定位為秒 opcache.revalidate_freq=1 ; 打開(kāi)快速關(guān)閉, 打開(kāi)這個(gè)在PHP Request Shutdown的時(shí)候回收內(nèi)存的速度會(huì)提高 opcache.fast_shutdown=1
3. 添加opcache.so
在php.ini最后一行添加opcache.so
主要作用是用來(lái)引用opcache
[root@abcdocker ~]# tail /etc/php.ini zend_extension="opcache.so"
4. 重啟Nginx和php
5. 測(cè)試
配置完成后,可以使用如下代碼查詢opcache:
<?php phpinfo();?>
注意:我們需要在nginx目錄下配置phpinfo
測(cè)試文件
訪問(wèn)頁(yè)面得到如下界面:
我們除了可以在phpinfo
上查看,還可以在php-fpm -m
命令進(jìn)行查看
[root@abcdocker ~]# /usr/local/php/sbin/php-fpm -m[PHP Modules] .... [Zend Modules]Zend OPcache
以下是opcache的配置說(shuō)明:
OPcache 配置選項(xiàng)
名字 | 默認(rèn) | 可修改范圍 |
---|---|---|
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 |
轉(zhuǎn)載:http://php.net/manual/zh/opcache.configuration.php
配置可被設(shè)定范圍
這些模式?jīng)Q定著一個(gè) PHP 的指令在何時(shí)何地,是否能夠被設(shè)定。手冊(cè)中的每個(gè)指令都有其所屬的模式。例如有些指令可以在 PHP 腳本中用 ini_set() 來(lái)設(shè)定,而有些則只能在 php.ini 或 httpd.conf 中。例如 output_buffering 指令是屬于 PHP_INI_PERDIR,因而就不能用 ini_set() 來(lái)設(shè)定。但是 display_errors 指令是屬于 PHP_INI_ALL 因而就可以在任何地方被設(shè)定,包括 ini_set()。
PHP_INI_* 模式的定義 模式 含義
模式 | 含義 |
---|---|
PHP_INI_USER | 可在用戶腳本(例如 ini_set())或 Windows 注冊(cè)表(自 PHP 5.3 起)以及 .user.ini 中設(shè)定 |
PHP_INI_PERDIR | 可在 php.ini,.htaccess 或 httpd.conf 中設(shè)定 |
PHP_INI_SYSTEM | 可在 php.ini 或 httpd.conf 中設(shè)定 |
PHP_INI_ALL | 可在任何地方設(shè)定 |
opcache.enable boolean 啟用操作碼緩存。如果禁用此選項(xiàng),則不會(huì)優(yōu)化和緩存代碼。 在運(yùn)行期使用 ini_set() 函數(shù)只能禁用 opcache.enable 設(shè)置,不可以啟用此設(shè)置。 如果在腳本中嘗試啟用此設(shè)置項(xiàng)會(huì)產(chǎn)生警告。 opcache.enable_cli boolean 僅針對(duì) CLI 版本的 PHP 啟用操作碼緩存。 通常被用來(lái)測(cè)試和調(diào)試。 opcache.memory_consumption integer OPcache 的共享內(nèi)存大小,以兆字節(jié)為單位。 opcache.interned_strings_buffer integer 用來(lái)存儲(chǔ)臨時(shí)字符串的內(nèi)存大小,以兆字節(jié)為單位。 PHP 5.3.0 之前的版本會(huì)忽略此配置指令。 opcache.max_accelerated_files integer OPcache 哈希表中可存儲(chǔ)的腳本文件數(shù)量上限。 真實(shí)的取值是在質(zhì)數(shù)集合 { 223, 463, 983, 1979, 3907, 7963, 16229, 32531, 65407, 130987 } 中找到的第一個(gè)比設(shè)置值大的質(zhì)數(shù)。 設(shè)置值取值范圍最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。 opcache.max_wasted_percentage integer 浪費(fèi)內(nèi)存的上限,以百分比計(jì)。 如果達(dá)到此上限,那么 OPcache 將產(chǎn)生重新啟動(dòng)續(xù)發(fā)事件。 opcache.use_cwd boolean 如果啟用,OPcache 將在哈希表的腳本鍵之后附加改腳本的工作目錄, 以避免同名腳本沖突的問(wèn)題。 禁用此選項(xiàng)可以提高性能,但是可能會(huì)導(dǎo)致應(yīng)用崩潰。 opcache.validate_timestamps boolean 如果啟用,那么 OPcache 會(huì)每隔 opcache.revalidate_freq 設(shè)定的秒數(shù) 檢查腳本是否更新。 如果禁用此選項(xiàng),你必須使用 opcache_reset() 或者 opcache_invalidate() 函數(shù)來(lái)手動(dòng)重置 OPcache,也可以 通過(guò)重啟 Web 服務(wù)器來(lái)使文件系統(tǒng)更改生效。 opcache.revalidate_freq integer 檢查腳本時(shí)間戳是否有更新的周期,以秒為單位。 設(shè)置為 0 會(huì)導(dǎo)致針對(duì)每個(gè)請(qǐng)求, OPcache 都會(huì)檢查腳本更新。 如果 opcache.validate_timestamps 配置指令設(shè)置為禁用,那么此設(shè)置項(xiàng)將會(huì)被忽略。 opcache.revalidate_path boolean 如果禁用此選項(xiàng),在同一個(gè) include_path 已存在的緩存文件會(huì)被重用。 因此,將無(wú)法找到不在包含路徑下的同名文件。 opcache.save_comments boolean 如果禁用,腳本文件中的注釋內(nèi)容將不會(huì)被包含到操作碼緩存文件, 這樣可以有效減小優(yōu)化后的文件體積。 禁用此配置指令可能會(huì)導(dǎo)致一些依賴(lài)注釋或注解的 應(yīng)用或框架無(wú)法正常工作, 比如: Doctrine, Zend Framework 2 以及 PHPUnit。 opcache.load_comments boolean 如果禁用,則即使文件中包含注釋?zhuān)膊粫?huì)加載這些注釋內(nèi)容。 本選項(xiàng)可以和 opcache.save_comments 一起使用,以實(shí)現(xiàn)按需加載注釋內(nèi)容。 opcache.fast_shutdown boolean 如果啟用,則會(huì)使用快速停止續(xù)發(fā)事件。 所謂快速停止續(xù)發(fā)事件是指依賴(lài) Zend 引擎的內(nèi)存管理模塊 一次釋放全部請(qǐng)求變量的內(nèi)存,而不是依次釋放每一個(gè)已分配的內(nèi)存塊。 opcache.enable_file_override boolean 如果啟用,則在調(diào)用函數(shù) file_exists(), is_file() 以及 is_readable() 的時(shí)候, 都會(huì)檢查操作碼緩存,無(wú)論文件是否已經(jīng)被緩存。 如果應(yīng)用中包含檢查 PHP 腳本存在性和可讀性的功能,這樣可以提升性能。 但是如果禁用了 opcache.validate_timestamps 選項(xiàng), 可能存在返回過(guò)時(shí)數(shù)據(jù)的風(fēng)險(xiǎn)。 opcache.optimization_level integer 控制優(yōu)化級(jí)別的二進(jìn)制位掩碼。 opcache.inherited_hack boolean 在 PHP 5.3 之前的版本,OPcache 會(huì)存儲(chǔ)代碼中使用 DECLARE_CLASS 操作碼 來(lái)實(shí)現(xiàn)繼承的位置。當(dāng)文件被加載之后,OPcache 會(huì)嘗試使用當(dāng)前環(huán)境來(lái)綁定被繼承的類(lèi)。 由于當(dāng)前腳本中可能并不需要 DECLARE_CLASS 操作碼,如果這樣的腳本需要對(duì)應(yīng)的操作碼被定義時(shí), 可能無(wú)法運(yùn)行。 在 PHP 5.3 及后續(xù)版本中,此配置指令會(huì)被忽略。 opcache.dups_fix boolean 僅作為針對(duì) “不可重定義類(lèi)”錯(cuò)誤的一種解決方案。 opcache.blacklist_filename string OPcache 黑名單文件位置。 黑名單文件為文本文件,包含了不進(jìn)行預(yù)編譯優(yōu)化的文件名,每行一個(gè)文件名。 黑名單中的文件名可以使用通配符,也可以使用前綴。 此文件中以分號(hào)(;)開(kāi)頭的行將被視為注釋。
簡(jiǎn)單的黑名單文件可能如下所示: ; 將特定文件加入到黑名單 /var/www/broken.php ; 以字符 x 文件打頭的文件 /var/www/x ; 通配符匹配 /var/www/*-broken.php
opcache.max_file_size integer 以字節(jié)為單位的緩存的文件大小上限。設(shè)置為 0 表示緩存全部文件。 opcache.consistency_checks integer 如果是非 0 值,OPcache 將會(huì)每隔 N 次請(qǐng)求檢查緩存校驗(yàn)和。 N 即為此配置指令的設(shè)置值。 由于此選項(xiàng)對(duì)于性能有較大影響,請(qǐng)盡在調(diào)試環(huán)境使用。 opcache.force_restart_timeout integer 如果緩存處于非激活狀態(tài),等待多少秒之后計(jì)劃重啟。 如果超出了設(shè)定時(shí)間,則 OPcache 模塊將殺除持有緩存鎖的進(jìn)程, 并進(jìn)行重啟。 如果選項(xiàng) opcache.log_verbosity_level 設(shè)置為 3 或者 3 以上的數(shù)值,當(dāng)發(fā)生重啟時(shí)將在日志中記錄一條錯(cuò)誤信息。 opcache.error_log string OPcache 模塊的錯(cuò)誤日志文件。 如果留空,則視為 stderr, 錯(cuò)誤日志將被送往標(biāo)準(zhǔn)錯(cuò)誤輸出 (通常情況下是 Web 服務(wù)器的錯(cuò)誤日志文件)。 opcache.log_verbosity_level integer OPcache 模塊的日志級(jí)別。 默認(rèn)情況下,僅有致命級(jí)別(0)及錯(cuò)誤級(jí)別(1)的日志會(huì)被記錄。 其他可用的級(jí)別有:警告(2),信息(3)和調(diào)試(4)。 opcache.preferred_memory_model string OPcache 首選的內(nèi)存模塊。 如果留空,OPcache 會(huì)選擇適用的模塊, 通常情況下,自動(dòng)選擇就可以滿足需求。 可選值包括: mmap,shm, posix 以及 win32。 opcache.protect_memory boolean 保護(hù)共享內(nèi)存,以避免執(zhí)行腳本時(shí)發(fā)生非預(yù)期的寫(xiě)入。 僅用于內(nèi)部調(diào)試。 opcache.mmap_base string 在 Windows 平臺(tái)上共享內(nèi)存段的基地址。 所有的 PHP 進(jìn)程都將共享內(nèi)存映射到同樣的地址空間。 使用此配置指令避免“無(wú)法重新附加到基地址”的錯(cuò)誤。 opcache.restrict_api string 僅允許路徑是以指定字符串開(kāi)始的 PHP 腳本調(diào)用 OPcache API 函數(shù)。 默認(rèn)值為空字符串 "",表示不做限制。
轉(zhuǎn)載:http://php.net/manual/zh/opcache.configuration.php
當(dāng)我們PHP想添加新的擴(kuò)張模塊時(shí),可以使用一下方法。當(dāng)然,以下方法是saltstack進(jìn)行安裝拓展模塊的方法
項(xiàng)目一: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
#溫馨提示:在saltstack中,不要安裝程序的時(shí)候直接復(fù)制原來(lái)的,會(huì)造成ID沖突memcache-plugin
步驟解釋?zhuān)?/span>
1.下載 memcached軟件包
2.使用/usr/local/php/bin/phpize命令進(jìn)行 phpize命令含義:phpize是用來(lái)擴(kuò)展php擴(kuò)展模塊的,通過(guò)phpize可以建立php的外掛模塊
3.在php.ini中添加一條extension=模塊名稱(chēng).so
4.重啟PHP即可
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答!! 點(diǎn)擊進(jìn)入論壇