Zend引擎是PHP的编译引擎和实行引擎,当它实行一段PHP脚本时,会依次按照如下步骤实行:
Scan:扫描,将PHP代码转换成措辞片段。Parse:解析,将措辞片段组合成故意义的表达式。Complie:编译,将表达式编译程OpCode。Excute:实行,顺次实行OpCode。Nginx或其他Web做事器把HTTP要求转发给PHP-FPM, PHP-FPM再把要求交给某个PHP子进程处理,PHP进程找到PHP脚本后实行,把脚本编译为OpCode后天生相应。我们从图中看到PHP脚本被编译为Zend Opcode后天生内容,然后被发送到浏览器客户端。
如果每次要求一个PHP脚本都要编译一次Zend OpCode,然后实行字节码,就会花费很多资源。如果每次HTTP要求PHP都必须不断解析、编译和实行PHP脚本,花费的资源更多。如果有一个工具能缓存预报编译好的字节码,减少运用的相应韶光,降落系统资源压力,这当然便是我们想要的办法—字节码缓存。

字节码缓存的共通特性便是能够存储预先编译的Zend OpCode,利用OpCode缓存后,当要求一个PHP脚本时,不用再读取、解析和编译PHP代码。PHP阐明器会从内存中读取预先编译好的字节码,立即实行。这样就能节省很多韶光,极大提升运用的性能。
Zend Opcache
在PHP5.5往后,Zend OpCache虽然被内置,但默认没有启用,须要显式指定启用Zend OpCache。
如果是自己编译的PHP运行环境,须要在configure命令时包含如下:
–enable -opcache编译好,须在php.ini文件中配置Zend OpCache。
zend_extension=opcache.so[opcache];开启opcacheopcache.enable=1 ;CLI环境下,PHP启用OPcacheopcache.enable_cli=1;OPcache共享内存存储大小,单位MBopcache.memory_consumption=128 ;PHP利用了一种叫做字符串驻留(string interning)的技能来改进性能。例如,如果你在代码中利用了1000次字符串“foobar”,在PHP内部只会在第一利用这个字符串的时候分配一个不可变的内存区域来存储这个字符串,其他的999次利用都会直接指向这个内存区域。这个选项则会把这个特性提升一个层次——默认情形下这个不可变的内存区域只会存在于单个php-fpm的进程中,如果设置了这个选项,那么它将会在所有的php-fpm进程中共享。在比较大的运用中,这可以非常有效地节约内存,提高运用的性能。这个选项的值因此兆字节(megabytes)作为单位,如果把它设置为16,则表示16MB,默认是4MBopcache.interned_strings_buffer=8;这个选项用于掌握内存中最多可以缓存多少个PHP文件。这个选项必须得设置得足够大,大于你的项目中的所有PHP文件的总和。设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。也便是说在200到1000000之间。opcache.max_accelerated_files=4000;设置缓存的过期韶光(单位是秒),为0的话每次都要检讨opcache.revalidate_freq=60;从字面上理解便是“许可更快速关闭”。它的浸染是在单个要求结束时供应一种更快速的机制来调用代码中的析构器,从而加快PHP的相应速率和PHP进程资源的回收速率,这样运用程序可以更快速地相应下一个要求。把它设置为1就可以利用这个机制了。opcache.fast_shutdown=1;如果启用(设置为1),OPcache会在opcache.revalidate_freq设置的秒数去检测文件的韶光戳(timestamp)检讨脚本是否更新。如果这个选项被禁用(设置为0),opcache.revalidate_freq会被忽略,PHP文件永久不会被检讨。这意味着如果你修正了你的代码,然后你把它更新到做事器上,再在浏览器上要求更新的代码对应的功能,你会看不到更新的效果强烈建议你在生产环境中设置为0,更新代码后,再平滑重启PHP和web做事器。opcache.validate_timestamps=0 ;开启Opcache File Cache(实验性), 通过开启这个, 我们可以让Opcache把opcode缓存缓存到外部文件中, 对付一些脚本, 会有很明显的性能提升.这样PHP就会在/tmp目录下Cache一些Opcode的二进制导出文件, 可以跨PHP生命周期存在.opcache.file_cache=/tmp
重启PHP FPM,利用phpinfo函数查看,确认Zend OpCache是否正常事情,如图所示:
A/B测试
现在我们对开启Opcache效果进行A/B测试,以要求phpinfo.php为例。
未开启:
Document Path: /phpinfo.phpDocument Length: 94760 bytesConcurrency Level: 100Time taken for tests: 39.205 secondsComplete requests: 10000Failed requests: 880 (Connect: 0, Receive: 0, Length: 880, Exceptions: 0)Total transferred: 949419025 bytesHTML transferred: 947599025 bytesRequests per second: 255.07 [#/sec] (mean)Time per request: 392.054 [ms] (mean)Time per request: 3.921 [ms] (mean, across all concurrent requests)Transfer rate: 23648.95 [Kbytes/sec] received
未开启状态下,TPS:255/s。
开启后:
Document Path: /phpinfo.phpDocument Length: 99540 bytesConcurrency Level: 100Time taken for tests: 35.199 secondsComplete requests: 10000Failed requests: 9041 (Connect: 0, Receive: 0, Length: 9041, Exceptions: 0)Total transferred: 997228816 bytesHTML transferred: 995408816 bytesRequests per second: 284.10 [#/sec] (mean)Time per request: 351.995 [ms] (mean)Time per request: 3.520 [ms] (mean, across all concurrent requests)Transfer rate: 27666.80 [Kbytes/sec] received
开启后,TPS: 284/s, 性能提升11.4%, 开启后效果还是非常棒的。