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.MVC的模板标签系统(一)
Sep 05 PHP
透析PHP的配置文件php.ini
Oct 09 PHP
php数组函数序列之each() - 获取数组当前内部指针所指向元素的键名和键值,并将指针移到下一位
Oct 31 PHP
Linux fgetcsv取得的数组元素为空字符串的解决方法
Nov 25 PHP
php递归使用示例(php递归函数)
Feb 14 PHP
在PHP模板引擎smarty生成随机数的方法和math函数详解
Apr 24 PHP
php限制文件下载速度的代码
Oct 20 PHP
微信支付开发维权通知实例
Jul 12 PHP
php自定义函数转换html标签示例
Sep 29 PHP
PHP编程实现微信企业向用户付款的方法示例
Jul 26 PHP
PHP基于递归算法解决兔子生兔子问题
May 11 PHP
laravel框架中表单请求类型和CSRF防护实例分析
Nov 23 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
解决FireFox下[使用event很麻烦]的问题
2006/11/26 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
利用jQuery的deferred对象实现异步按顺序加载JS文件
2013/03/17 Javascript
javascript-简单的日历实现及Date对象语法介绍(附图)
2013/05/30 Javascript
JS防止用户多次提交的简单代码
2013/08/01 Javascript
jQuery中unwrap()方法用法实例
2015/01/16 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
利用CSS3在Angular中实现动画
2016/01/15 Javascript
js中遍历Map对象的方法
2016/07/27 Javascript
BootStrap Validator对于隐藏域验证和程序赋值即时验证的问题浅析
2016/12/01 Javascript
AngularJS中$injector、$rootScope和$scope的概念和关联关系深入分析
2017/01/19 Javascript
Vue生命周期示例详解
2017/04/12 Javascript
JavaScript中document.referrer的用法详解
2017/07/04 Javascript
vue 文件目录结构详解
2017/11/24 Javascript
基于Vuex无法观察到值变化的解决方法
2018/03/01 Javascript
微信小程序外卖选购页实现切换分类与数量加减功能案例
2019/01/15 Javascript
用Fundebug插件记录网络请求异常的方法
2019/02/21 Javascript
深入理解基于vue-cli的webpack打包优化实践及探索
2019/10/14 Javascript
JS监听组合按键思路及实现过程
2020/04/17 Javascript
JavaScript实现点击自制菜单效果
2021/02/02 Javascript
[27:28]Ti4 冒泡赛第二天 iG vs NEWBEE 1
2014/07/15 DOTA
Python中的连接符(+、+=)示例详解
2017/01/13 Python
python模拟表单提交登录图书馆
2018/04/27 Python
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
如何安装多版本python python2和python3共存以及pip共存
2018/09/18 Python
Python中垃圾回收和del语句详解
2018/11/15 Python
使用python实现学生信息管理系统
2021/02/25 Python
Blancsom美国/加拿大:服装和生活用品供应商
2018/07/27 全球购物
韩国保养品、日本药妆购物网:小三美日
2018/12/30 全球购物
写一个函数返回1+2+3+…+n的值(假定结果不会超过长整型变量的范围)
2014/09/05 面试题
应届生财务管理求职信
2013/11/06 职场文书
安全承诺书范文
2014/03/26 职场文书
大学生活自我评价
2014/04/09 职场文书
军训后的感想
2015/08/07 职场文书
2019年图书室自查报告范本
2019/10/12 职场文书
python3中apply函数和lambda函数的使用详解
2022/02/28 Python