PHP中使用hidef扩展代替define提高性能


Posted in PHP onApril 09, 2015

网站需要新加一个常量,打开了本地的config.php文件,想到了几年前测试过的hidef以及apc提升define性能的方案。
我的程序中有对开发、测试、生产服务器分别做了不同的配置,在常量方面则使用了一个数组定义了所有需要定义的常量,然后检测是否有apc_load_constants函数,没有的话,批量define。使用apc时,每增加一个常量,还需要修改一下$key才能生效。

而现在测试、生产服务器php都升级到5.4后,opcode缓存就使用了Zend opcache,不再安装APC。因为有用到apc user cache,因此额外装了apcu,和apc用法一模样,完全不用改程序。而apcu不支持apc_load_constants和apc_define_constants,因此apc这个方案就无法用了。去官网装了最新版hidef 0.1.13,2012-7-12发布的stable,一年多了。

写了个简单程序测试define化的时间,大概运行1000次需要2.8ms。那么对于一个中型网站(例如一天php运行1000w次)来说,如果每页定义25个常量,大概每天需要化 10000000*25/1000*2.8=700000ms,就是700秒。差不多使用hidef可以一天节省700s的PHP运行时间。
再看看读的性能好了,测试读1w次一个常量,值都是1,分别是37ms和0.7ms。那么如果一天1000w次,每页平均使用20个常量,则需要740秒,而使用hidef是14秒,好吧,又一个700多秒。
一天省1400秒php运行时间,也许是还是微不足道,但总是好的,也是值的尝试的,毕竟define的参数变化的机率非常少。
当define参数需要修改时,修改配置文件,然后重载下php-fpm,就好了。

hidef具体安装方法参见:提高define性能的php扩展hidef的安装和使用

在百度里搜索“hidef”,排第3位的是一个copy我博文的网站:( 而我自己发布的提高define性能的php扩展hidef的安装和使用在前三页没有找到。显然是百度对原创的识别出了些偏差。

百度搜索“hidef php”,那个网址排第一,第二是官网,我的在第三。
gg搜索“hidef php”,第一官网,第3是另一篇原创,我的在第四。gg的识别就不错!

360搜索"hidef php",第一那个copy站,第二我的,第三另一篇原创。
因此有了这篇的诞生,看看能不能帮第一篇排上去或者这篇排上去也行。

附原配置常量的程序示例代码:

  if (function_exists('apc_load_constants')) {

            function define_array($key, $arr, $case_sensitive = false) {

                if (!apc_load_constants($key, $case_sensitive)) {

                    apc_define_constants($key, $arr, $case_sensitive);

                }
            }

        } else {

            function define_array($key, $arr, $case_sensitive = false) {

                foreach ($arr as $name => $value) {

                    define($name, $value, $case_sensitive);

                }

            }

        }
        $constants = array(

            'HX'   => 1,

            'BLOG_URL'   => 'https://3water.com/',

            'WWW_URL'   => 'https://3water.com/',

        );
        define_array('hx_defined',$constants);

附测试define速度的代码。

<?php
$t1 = microtime(1);
    $constants = array(

        'hx1'       => 1,

        'hx2'       => '2',

        'hx3'       => '3',

        'hx4'       => '4',

        'hx5'       => '5',

        'hx6'       => '6',

        'hx7'       => '7',

        'hx8'       => '8',

        'hx9'       => '9',

        'hx10'       => '10',

    );
    function define_array($key, $arr) {

        foreach ($arr as $name => $value) {

            define($name.$i, $value);

        }

    }

    

    for($i=0;$i<100;$i++) {

        define_array($i,$constants);

    }

    

    

$t2 = microtime(1);

echo ($t2-$t1)*1000;
//读性能

$t1 = microtime(1);

for($i=0;$i<10000;$i++) {

    $t = hx1;

}    

$t2 = microtime(1);

echo ' '.($t2-$t1)*1000;
$t1 = microtime(1);

for($i=0;$i<10000;$i++) {

    $t = HX;

}    

$t2 = microtime(1);

echo ' '.($t2-$t1)*1000;
PHP 相关文章推荐
php smarty函数扩展
Mar 15 PHP
PHP 字符串加密函数(在指定时间内加密还原字符串,超时无法还原)
Apr 28 PHP
如何突破PHP程序员的技术瓶颈分析
Jul 17 PHP
PHP filter_var() 函数 Filter 函数
Apr 25 PHP
2014过年倒计时示例
Jan 31 PHP
PHP图片处理之图片背景、画布操作
Nov 19 PHP
php 实现进制相互转换
Apr 07 PHP
PHP API接口必备之输出json格式数据示例代码
Jun 27 PHP
php通过header发送自定义数据方法
Jan 18 PHP
PHP正则表达式处理函数(PCRE 函数)实例小结
May 09 PHP
Laravel 关联模型-关联新增和关联更新的方法
Oct 10 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
Oct 17 PHP
PHP JSON格式的中文显示问题解决方法
Apr 09 #PHP
Laravel 5框架学习之用户认证
Apr 09 #PHP
PHP中把数据库查询结果输出为json格式简单实例
Apr 09 #PHP
Laravel 5框架学习之Eloquent 关系
Apr 09 #PHP
在html文件中也可以执行php语句的方法
Apr 09 #PHP
PHP统一页面编码避免乱码问题
Apr 09 #PHP
PHP生成静态HTML页面最简单方法示例
Apr 09 #PHP
You might like
桌面中心(一)创建数据库
2006/10/09 PHP
php递归函数中使用return的注意事项
2014/01/17 PHP
php判断类是否存在函数class_exists用法分析
2014/11/14 PHP
php获取服务器操作系统相关信息的方法
2016/10/08 PHP
thinkPHP+phpexcel实现excel报表输出功能示例
2017/06/06 PHP
ThinkPHP框架整合微信支付之Native 扫码支付模式一图文详解
2019/04/09 PHP
自动更新作用
2006/10/08 Javascript
js判断字符是否是汉字的两种方法小结
2014/01/03 Javascript
jQuery中index()方法用法实例
2014/12/27 Javascript
jquery读写cookie操作实例分析
2015/12/24 Javascript
BootStrap Datepicker 插件修改为默认中文的实现方法
2017/02/10 Javascript
html5+canvas实现支持触屏的签名插件教程
2017/05/08 Javascript
es6 字符串String的扩展(实例讲解)
2017/08/03 Javascript
js定时器实现倒计时效果
2017/11/05 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
jQuery简单实现根据日期计算星期几的方法
2019/01/09 jQuery
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
Vue项目部署的实现(阿里云+Nginx代理+PM2)
2019/03/26 Javascript
Python简单获取自身外网IP的方法
2016/09/18 Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
2018/01/02 Python
浅谈tensorflow1.0 池化层(pooling)和全连接层(dense)
2018/04/27 Python
浅谈Pandas:Series和DataFrame间的算术元素
2018/12/22 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
基于Python安装pyecharts所遇的问题及解决方法
2019/08/12 Python
python并发编程多进程 模拟抢票实现过程
2019/08/20 Python
pytorch实现seq2seq时对loss进行mask的方式
2020/02/18 Python
python+gdal+遥感图像拼接(mosaic)的实例
2020/03/10 Python
python opencv实现图像配准与比较
2021/02/09 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
预备党员转正思想汇报
2014/01/12 职场文书
《记承天寺夜游》教学反思
2014/02/16 职场文书
有创意的广告词
2014/03/18 职场文书
《月球之谜》教学反思
2014/04/10 职场文书
《第一朵杏花》教学反思
2014/04/16 职场文书
个人工作表现评价材料
2014/09/21 职场文书
2016基督教会圣诞节开幕词
2016/03/04 职场文书