首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 使用 hidef 擴展替代 define 提升常量定義效能

     編輯:PHP 綜合知識

專案需新增常量,打開本地 config.php 聯想到幾年前測試過的 hidef 與 APC 優化 define 效能的方案。舊架構針對開發、測試、正式環境分別配置,常量以陣列定義後批量 define;若偵測到 apc_load_constants 則改用 APC 快取。但每新增常量仍需修改 $key 才能生效。

隨著 PHP 升級至 5.4+,Opcode 快取改用 Zend OPcache,APC 不再安裝。雖額外裝了 APCu(用法與 APC 相同),但 APCu 不支援 apc_load_constants 與 apc_define_constants,原方案失效。遂安裝最新版 hidef 0.1.13(2012-07-12 發布)。

效能實測數據

定義常量耗時對比

簡單測試腳本跑 1000 次迴圈,define 耗時約 2.8 ms。對中型網站(日 PV 1000 萬,每頁定義 25 個常量)估算:

10000000 × 25 / 1000 × 2.8 = 700,000 ms = 700 秒/天

改用 hidef 可節省 約 700 秒 PHP 執行時間/天。

讀取常量耗時對比

讀取 1 萬次單一常量:define 版 37 ms,hidef 版 0.7 ms。同樣日 PV 1000 萬、每頁平均 20 常量:

define: 10000000 × 20 / 10000 × 37 = 740 秒/天
hidef:  10000000 × 20 / 10000 × 0.7 = 14 秒/天

讀取端再節省 700+ 秒/天。合計每天約 1400 秒 PHP 執行時間。雖微乎其微,但常量參數極少變動,值得嘗試。需修改時:改配置檔 → reload php-fpm 即可。

hidef 安裝與使用

詳細安裝步驟請參考:提高 define 效能的 PHP 擴展 hidef 安裝和使用

原配置常量程式碼範例

<?php
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://www.jb51.net/',
    'WWW_URL'  => 'https://www.jb51.net/',
);

define_array('hx_defined', $constants);

測試腳本(定義與讀取效能)

<?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;

搜尋引擎收錄小插曲
百度搜尋「hidef」第 3 位是盜文站,原創文前三頁找不到;搜尋「hidef php」Google 識別度較好(官網第 1、原創第 3、本文第 4);360 搜尋盜文站第 1、本文第 2。此文誕生即為助原創排名。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved