PHP中使用hidef擴(kuò)展代替define提高性能
網(wǎng)站需要新加一個(gè)常量,打開(kāi)了本地的config.php文件,想到了幾年前測(cè)試過(guò)的hidef以及apc提升define性能的方案。
我的程序中有對(duì)開(kāi)發(fā)、測(cè)試、生產(chǎn)服務(wù)器分別做了不同的配置,在常量方面則使用了一個(gè)數(shù)組定義了所有需要定義的常量,然后檢測(cè)是否有apc_load_constants函數(shù),沒(méi)有的話,批量define。使用apc時(shí),每增加一個(gè)常量,還需要修改一下$key才能生效。
而現(xiàn)在測(cè)試、生產(chǎn)服務(wù)器php都升級(jí)到5.4后,opcode緩存就使用了Zend opcache,不再安裝APC。因?yàn)橛杏玫絘pc user cache,因此額外裝了apcu,和apc用法一模樣,完全不用改程序。而apcu不支持apc_load_constants和apc_define_constants,因此apc這個(gè)方案就無(wú)法用了。去官網(wǎng)裝了最新版hidef 0.1.13,2012-7-12發(fā)布的stable,一年多了。
寫(xiě)了個(gè)簡(jiǎn)單程序測(cè)試define化的時(shí)間,大概運(yùn)行1000次需要2.8ms。那么對(duì)于一個(gè)中型網(wǎng)站(例如一天php運(yùn)行1000w次)來(lái)說(shuō),如果每頁(yè)定義25個(gè)常量,大概每天需要化 10000000*25/1000*2.8=700000ms,就是700秒。差不多使用hidef可以一天節(jié)省700s的PHP運(yùn)行時(shí)間。
再看看讀的性能好了,測(cè)試讀1w次一個(gè)常量,值都是1,分別是37ms和0.7ms。那么如果一天1000w次,每頁(yè)平均使用20個(gè)常量,則需要740秒,而使用hidef是14秒,好吧,又一個(gè)700多秒。
一天省1400秒php運(yùn)行時(shí)間,也許是還是微不足道,但總是好的,也是值的嘗試的,畢竟define的參數(shù)變化的機(jī)率非常少。
當(dāng)define參數(shù)需要修改時(shí),修改配置文件,然后重載下php-fpm,就好了。
hidef具體安裝方法參見(jiàn):提高define性能的php擴(kuò)展hidef的安裝和使用
在百度里搜索“hidef”,排第3位的是一個(gè)copy我博文的網(wǎng)站:( 而我自己發(fā)布的提高define性能的php擴(kuò)展hidef的安裝和使用在前三頁(yè)沒(méi)有找到。顯然是百度對(duì)原創(chuàng)的識(shí)別出了些偏差。
百度搜索“hidef php”,那個(gè)網(wǎng)址排第一,第二是官網(wǎng),我的在第三。
gg搜索“hidef php”,第一官網(wǎng),第3是另一篇原創(chuàng),我的在第四。gg的識(shí)別就不錯(cuò)!
360搜索"hidef php",第一那個(gè)copy站,第二我的,第三另一篇原創(chuàng)。
因此有了這篇的誕生,看看能不能幫第一篇排上去或者這篇排上去也行。
附原配置常量的程序示例代碼:
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' => 'http://www.dbjr.com.cn/',
'WWW_URL' => 'http://www.dbjr.com.cn/',
);
define_array('hx_defined',$constants);
附測(cè)試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;
相關(guān)文章
PHP編程實(shí)現(xiàn)的TCP服務(wù)端和客戶端功能示例
這篇文章主要介紹了PHP編程實(shí)現(xiàn)的TCP服務(wù)端和客戶端功能,結(jié)合實(shí)例形式分析了php基于socket實(shí)現(xiàn)TCP服務(wù)器端與客戶端通信功能的相關(guān)配置、定義與使用技巧,需要的朋友可以參考下2018-04-04PHP使用finfo_file()函數(shù)檢測(cè)上傳圖片類型的實(shí)現(xiàn)方法
這篇文章主要介紹了PHP使用finfo_file()函數(shù)檢測(cè)上傳圖片類型的實(shí)現(xiàn)方法,結(jié)合實(shí)例形式分析了finfo_file()函數(shù)的功能、使用方法及相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-04-04學(xué)習(xí)php開(kāi)源項(xiàng)目的源碼指南
這篇文章主要介紹了學(xué)習(xí)php開(kāi)源項(xiàng)目的源碼指南,需要的朋友可以參考下2014-12-12PHP寫(xiě)的加密函數(shù),支持私人密鑰(詳細(xì)介紹)
本篇文章是對(duì)PHP寫(xiě)的加密函數(shù)且支持私人密鑰進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06PHP實(shí)現(xiàn)無(wú)限極分類生成分類樹(shù)的方法
這篇文章主要介紹了PHP實(shí)現(xiàn)無(wú)限極分類生成分類樹(shù)的方法,結(jié)合實(shí)例形式簡(jiǎn)單分析了無(wú)限極分類的原理與實(shí)現(xiàn)方法,涉及PHP數(shù)組遍歷與判斷相關(guān)操作技巧,需要的朋友可以參考下2017-09-09