如何在PHP中优化全局语言数组

时间:2017-01-14 16:29:48

标签: php

我有一个语言文件,其中包含一个大约3k行的数组$phrases

$phrases = array();
$phrases['hello'] = 'bonjour';

我创建了一个从这个数组中检索值的函数。

function phrase($identifier) {
   global $phrases;
   return $phrases['identifier'];
}

我使用如下:

function some_view() {
   $intro = phrase('hello') . $firstname;
}

如何在语言文件随时间增长的情况下优化此代码以保证性能?

2 个答案:

答案 0 :(得分:2)

使用数组的本地化既简单又快速,但它缺乏您将来可能需要的一些功能(例如处理日期格式,货币或复数)。

这里有一个article,可以很好地解释你的可能性,你可以认为哪一个更适合你的项目。

就个人而言,如果项目足够大,我总是坚持使用Symfony的Translator组件:http://symfony.com/doc/current/components/translation.html

答案 1 :(得分:1)

您将为这大量语言行支付的代价可能会在编译/运行时进行评估,而不是在语言字符串查找操作期间进行评估。如果您想对其进行优化,我建议您将语言字符串拆分为较小的部分或其他内容,并仅根据需要加载每个部分。

我做了一些测试。只是为数组赋值不需要花费太多时间。此函数生成随机$ key值并指定关联数组$ key => $ key一些次。

function get_str() {
    $retval = "";
    for($j=0; $j<10; $j++) {
            $retval .= chr(mt_rand(ord("A"), ord("Z")));
    }
    return $retval;
}

$arr = array();
$el1 = 0;
for($i=0; $i<1000000; $i++) {
    $key = get_str();
    $start = microtime(TRUE);
    $arr[$key] = $key;
    $el1 += (microtime(TRUE) - $start);
}
var_dump($el1);

结果:

10 elements         1.1920928955078E-5
100 elements        9.4175338745117E-5
1,000 elements      0.00090622901916504 // less than a millisecond
1,000,000 elements  1.0554702281952
这不是一个非常重的惩罚。我添加了一些代码来执行1,000次查找:

$el2 = 0;
for($i=0; $i<1000; $i++) {
    $lookup = get_str();
    $start = microtime(TRUE);
    $val = (isset($arr[$lookup]) ? $arr[$lookup] : "");
    $el2 += (microtime(TRUE) - $start);
}
var_dump($el2);

我将数组中的元素数量从10变为1,000,000,并在每个数组大小上执行1,000次查找。结果:

10 elements         0.00072717666625977
100 elements        0.00070691108703613
1000 elements       0.00071167945861816 // less than a millisecond
1,000,000 elements  0.0008540153503418 // still less than a millisecond

如您所见,关联哈希查找保持高效,即使对于非常大的数据结构也是如此