php编译称opcode文件,PHP源码保护和性能加速

什么是Opcache?

每一次执行 PHP 脚本的时候,该脚本都需要被编译成字节码,而 Opcache 可以对该字节码进行缓存,这样,下次请求同一个脚本的时候,该脚本就不需要重新编译,这极大节省了脚本的执行时间,从而让应用运行速度更快,同时也节省了服务器的开销。

Opcache 的执行流程大致如下:

d76a4ba5aba75cb16b251ac7894b9916.png

PHP解释器从文件系统读取文件、扫描其词典和表达式、解析文件、创建要执行的计算机代码(称为Opcode),最后执行Opcode。每一次请求PHP脚本都会执行一遍以上步骤,如果PHP源代码没有变化,则Opcode也不会发生变化。因此,如果将Opcode缓存下来,以后直接访问缓存的Opcode,可以加快PHP的执行效率。

PHP7之前的Opcache只支持共享内存缓存,不支持文件缓存。PHP7新增了文件缓存功能,在储存共享内存缓存的同时,可将每个PHP源文件生成的Opcode导出为相应的PHP文件对应的Opcode文件,后缀为.bin。

默认情况下内存缓存的优先级高于文件缓存,当发起PHP脚本请求时,PHP解释器首先检查内存缓存中是否存在当前所请求的PHP脚本对应的Opcode,若有,则直接执行。若没有,则到指定目录中寻找当前所请求的PHP脚本对应的Opcode文件,若存在相应的Opcode文件,则将该文件导入内存中,执行。否则,说明内存缓存和文件缓存中均不存在相应PHP脚本的Opcode,需要重新解析文件。

听起来很牛逼,不过怎么使用呢?

一、找到opcache文件

5cfa9c0c988ecb0350d1d4106d228251.png

二、配置opcache

;opcachezend_extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/opcache.so

opcache.enable=1

;OPcache 的共享内存大小,以兆字节为单位。opcache.memory_consumption=128

;用来存储预留字符串的内存大小,以兆字节为单位。 opcache.interned_strings_buffer=8

;哈希表中可存储的脚本文件数量上限。设置值取值范围最小值是 200,最大值在 PHP 5.5.6 之前是 100000,PHP 5.5.6 及之后是 1000000。opcache.max_accelerated_files=10000

;opcache不保存注释opcache.save_comments=0;关闭PHP文件时间戳验证opcache.validate_timestamps=0;每60秒验证php文件时间戳是否更新;opcache.revalidate_freq=60

;打开快速关闭, 打开这个在PHP Request Shutdown的时候回收内存的速度会提高opcache.fast_shutdown=1

;注意,PHP7下命令行执行的脚本也会被 opcache.file_cache 缓存.opcache.enable_cli=;设置不缓存的黑名单;opcache.blacklist_filename=/www/server/opcache_blacklist

;设置字节码保存路径opcache.file_cache=/www/server/opcache_file_cache

;启用或禁用在共享内存中的 opcode 缓存。

opcache.file_cache_only=0

三、生成文件缓存

可通过运行脚本或者opcache_compile_file () 函数将php编译后的机器码保存在opcache.file_cache目录下,就可以加速脚本了。

如在项目根目录文件加上 opcache.php<?phpfunction  getfiles($path, &$files = array()){

if (!is_dir($path)) return null;

$handle = opendir($path);

while (false !== ($file = readdir($handle))) {

if ($file != '.' && $file != '..') {

$path2 = $path . '/' . $file;

if (is_dir($path2)) {

getfiles($path2, $files);

} else {

if (preg_match('%\.php$%', $file)) {

$files[] = $path2;

}

}

}

}

return $files;}// 获取指定目录及其子目录下的所有PHP文件$files = getfiles('/home/wwwroot/website');foreach ($files as $file) {

//编译PHP文件生成opcode

opcache_compile_file($file);

//清空原来的PHP脚本

file_put_contents($file, '');}

发布代码后请求文件使缓存生效

如需保护php源码则可在缓存机器码后将网站目录PHP脚本内容变更为任意内容(不可删除文件),运行的也是保存在opcache_cache目录下的机器码了。

生成的缓存机器码如下图:

6beff98fabdfec18f113b6672a5eb8a1.png

打开文件内容如下:

44223f9d0cdae836ae6a38ff850023ab.png

四、简单测试

未开启 opcache 情况

cde1ab8b36a04f534cc4364ca71aa3fa.png

e7e1224c7ca0bcbe0b9d7466307a3538.png

3230c1fd74edc92edd91eebac89bb769.png

开启 opcache 情况

c636c4b4823c4560a12c48c299127bb7.png

1232d84e6aea62f7372af2ac035edfdd.png

从上面的截图中就可以看出,未开启 opcache 的情况下,基本稳定在 70-90 左右,但是开启 opcache 后,请求基本都稳定在 50ms 左右,所以可以看出提升性能还是很明显的。

这样,既保护了你的源码,又加速了你的应用,赶紧去试一下吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/430979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PHP的pm、pm.max_requests、memory_limit

1、php-fpm.conf中的pm pm是来控制php-fpm的工作进程数到底是一次性产生固定不变&#xff08;static&#xff09;还是在运行过程中随着需要动态变化&#xff08;dynamic&#xff09;。众所周知&#xff0c;工作 进程数与服务器性能息息相关&#xff0c;太少则不能及时处理请求&…

结构体数组排序

要求&#xff1a;结构体变量中有两个数据&#xff0c;一个是index&#xff0c;另一个是max 按照index的从小到大的顺序排序。 struct student { int index; double max; }seq[length]; void _seq() {int i,j,k,tmp;double tmp_2;for(i0;i<length;i){ki;for(ji1;j<length;…

9553下载站java,java se development kit11最新版 64位

java se development kit11&#xff0c;简称java11&#xff0c;是一款专门进行java开发的编程软件&#xff0c;这款软件还拥有applet和组件的开发环境等操作&#xff0c;是程序员们进行java开发的飞铲不错软件&#xff0c;如果你喜欢这款软件&#xff0c;那就来下载基本介绍自从…

python源码编译 mingw_在windows上用gcc(mingw32)从命令行编译Cython扩展

我正在尝试在win32上测试一个小的cython模块&#xff0c;但是我在构建它时遇到了困难。在文件名为linalg_赛顿.pyx包括以下内容&#xff1a;from __future__ import absolute_import, division, print_functionimport numpy as npcimport numpy as npimport cython#cython.boun…

php ldap支付,php – 实现LDAP合规性

我正在专门研究一个包含联系人和其他数据的php Web应用程序.我想知道使用LDAP协议将这些数据提供给外部程序有多难.那里有专门的工具吗&#xff1f;我真的找不到任何东西,但我无法想象我是第一个想到这一点的人.编辑1&#xff1a;我正在寻找的是让应用程序(如邮件客户端)能够使…

java sleep方法_一文搞懂 Java 线程中断!

在之前的一文《如何”优雅”地终止一个线程》详细说明了 stop 终止线程的坏处及如何优雅地终止线程&#xff0c;那么还有别的可以终止线程的方法吗&#xff1f;答案是肯定的&#xff0c;它就是我们今天要分享的——线程中断。下面的这断代码大家应该再熟悉不过了&#xff0c;线…

java 观察者模式_图解Java设计模式之观察者模式

图解Java设计模式之观察者模式天气预报项目需求天气预报设计方案 1 - 普通方案观察者模式&#xff08;Observer&#xff09;原理观察者模式解决天气预报需求观察者模式在JDK应用的源码分析天气预报项目需求1&#xff09;气象站可以将每天测量到的湿度、温度、气压等等以公告的形…

matlab中mapshow,函数式编程 - MATLAB中的Map函数?

函数式编程 - MATLAB中的Map函数&#xff1f;我对MATLAB没有地图功能感到有些惊讶&#xff0c;所以我自己一起攻击了一个&#xff0c;因为它是我无法生存的东西。 那里有更好的版本吗&#xff1f; 有没有一个有点标准的MATLAB函数式编程库我缺少&#xff1f;function results …

linux 定时java程序,Linux操作系统上定时运行Java程序的方法

运行crontab -e编辑一个job。例如0 30 * * * /home/your_login/bin/java_PRogram | | | | | | | | | | | | | | —day of the week (0-6 with 0Sunday). | | | —— month of the year (1-12), | | |_____day of the month (1-31), | | | |____hour (0-23), | minute (0-59),更…

怎么在同一页中分页_分库分表业界难题,跨库分页的几种常见方案

为什么需要研究跨库分页&#xff1f;互联网很多业务都有分页拉取数据的需求&#xff0c;例如&#xff1a;(1)微信消息过多时&#xff0c;拉取第N页消息&#xff1b;(2)京东下单过多时&#xff0c;拉取第N页订单&#xff1b;(3)浏览58同城&#xff0c;查看第N页帖子&#xff1b;…

content add tpl.php,phpcms后台批量上传添加图片文章方法详解(一)

注&#xff1a;以下所有代码中&#xff0c;红色部分为增加部分。一、在后台增加批量添加按钮打开“phpcms\modules\content\templates\content_list.tpl.php”文件搜索“$category[‘catname‘]));?>”在这句话的后天的添加&#xff1a;a echo"" href":;&q…

sap 供应商表_财务人员学习SAP的路线图

有许多网友在公众号给我们留言&#xff0c;咨询财务人员学习SAP的事情&#xff0c;如何才能快速掌握SAP&#xff0c;有没有捷径什么的。今天就给大家分享一下财务人员学习SAP的经验&#xff0c;希望能够为财务人员揭开SAP神秘的面纱&#xff0c;学习SAP少走弯路。刚接触SAP的财…

nodejs搭配phantomjs highcharts后台生成图表

简单分享一下&#xff0c;后台使用nodejs结合highcharts、phantomjs生成报表图片的方法。这主要应用在日报邮件。 主要参考以下资料&#xff1a; http://www.highcharts.com/component/content/article/2-news/52-serverside-generated-charts#phantom_usagehttps://bitbucket.…

mysql4函数,mysql笔记4_函数_MySQL

常用函数&#xff1a;concat 连接函数 Lower 转小写 upper 转大写 Length 长度 substr 子串 now 当前时间 Year 当前年份...流程函数&#xff1a;ifnull(column,result1,result2) 判定字段为空则返回result2&#xff0c;不为空则result1。case...when...then...else...end 分支…

python实战扫码下载_实例:用 Python 做一个扫码工具

原标题&#xff1a;实例&#xff1a;用 Python 做一个扫码工具来自公众号&#xff1a; 新建文件夹X链接&#xff1a;https://blog.csdn.net/ZackSock/article/details/108610957Python实现扫码工具二维码作为一种信息传递的工具&#xff0c;在当今社会发挥了重要作用。从手机用…

前端小问题4

爱、喜悦、和平。 1、文字一个一个显示 js代码 <script type"text/javascript">window.οnlοadfunction(){var story document.getElementById(sto);var s document.getElementById(show);var a story.innerHTML.slice("");var i 0;timersetInt…

matlab解带参数的积分方程组,方程组求解问题:方程组中有带参数的积分函数,求参数...

吴老师&#xff0c;您好&#xff01;请教您一个问题。我想求下面方程组的解&#xff1a;quadl((x) exp(a(1)a(2)*xa(3)*x.^2a(4)*x.^3a(5)*x.^4),-100,100)-1;quadl((x) x.*exp(a(1)a(2)*xa(3)*x.^2a(4)*x.^3a(5)*x.^4),-100,100)-m1;quadl((x) x.^2.*exp(a(1)a(2)*xa(3)*x.^2a…

vue 页面切换动画_Flutter Hero动画让你的APP页面切换充满动效 不一样的体验 不一样的细节处理...

优美的应用体验 来自于细节的处理&#xff0c;更源自于码农的自我要求与努力&#xff0c;当然也需要码农年轻灵活的思维。本文章实现的Demo效果&#xff0c;如下图所示&#xff1a;class HeroHomePage extends StatefulWidget { override _TestPageState createState() > …

自定义左右侧滑菜单

实现效果&#xff1a; 左右侧滑菜单&#xff0c;侧滑栏占主屏比为60%监听触控&#xff0c;自定义滑动动画&#xff0c;当侧边栏滑动超过50%松开触控将自动滑动到60%&#xff0c;未超过50%松开触控回归侧边栏隐藏为主屏设置蒙版效果&#xff0c;根据侧滑菜单的占屏比设置主屏蒙版…

秦九韶算法matlab程序,数值分析matlab程序实例.doc

数值分析matlab程序实例1&#xff0c;秦九韶算法&#xff0c;求出P(x3)24x5x^22x^3的值clear?all;x3;n3;a(1)2;a(2)4;a(3)5;a(4)2v(1)a(n1);for k2:(n1);v(k)x*v(k-1)a(n-k2);end?pv(n1)p ,1132&#xff0c;一次线型插值程序&#xff1a;利用100.121.求115的开方。clear all;…