优化文件包括PHP中的内部函数

时间:2010-09-28 15:51:48

标签: php function file include

我有一个需要包含文件的函数,但是这个函数在200到300次的地方使用,这显然会导致效率问题,有没有办法在函数内部优化这个? (我知道有很多方法可以解决这个问题,但这会对整个应用程序产生太大的影响)

我只想举一个例子,这不是整个功能。

function getString(arrayName, strValue){
    inclue('stringArrays.php');
    return $$arrayName[strValue];
}

我尝试过使用include_once,但这也不起作用。

提前致谢。

7 个答案:

答案 0 :(得分:1)

您可以在函数中使用静态变量来保存您的值:

function getString($arrayName, $strValue){
static $string_arrays = array();
if (empty($string_arrays)) {
    include('stringArrays.php');
    $string_arrays = array_diff_key(get_defined_vars(), array(
        'string_arrays' => true,
        'arrayName' => true,
        'strValue' => true,
    ));
}
return $string_arrays[$arrayName][$strValue];

}

只应包含一次文件。

答案 1 :(得分:0)

你总是可以添加另一个参数,也许是一个布尔值来告诉函数是否包含它。

function getString(arrayName, strValue, includeFile)
{ 
    if (includeFile)
    {
        inclue('stringArrays.php');
    }

    return $$arrayName[strValue]; 
}

答案 2 :(得分:0)

您可以尝试全局化stringArrays.php中的内容,以便在包含文件之前检查是否已设置该全局变量。很难说没有看到stringArrays.php中的结构。

答案 3 :(得分:0)

如果你的函数只是包含一个文件,你应该首先评估是否应该首先调用该函数,或者让函数确定是否需要包含。如果你真的不需要它,基本上不要盲目地包含文件。 include_once会导致性能下降。

答案 4 :(得分:0)

安装APC,eAccelerator,XCache或任何其他代码加速器,这样PHP每次调用时都不需要从磁盘检索包含文件。代码加速器将文件保存在共享内存中。这将显着提高性能。

答案 5 :(得分:0)

是否有什么阻止您将当前“数组”数组包装在数组中,然后通过引用将该包装器数组传递给该函数?然后,您可以在函数外部执行单个require / include。或者,您可以将一组数组和函数包装在一个对象中,再次将您带到一个require / include。

答案 6 :(得分:0)

如果stringArrays.php只是一个数组的集合,那么在构造函数中创建一个包含stringArrays.php的stringHandler单例并将每个数组映射到一个类属性,然后一个简单的方法来从该类中获取你想要的任何一个。然后你的getString()函数只是引用stringHandler中的getter方法。

<强> stringArrays.php

<?php

$abc = array('def' => 'Hello',
             'ghi' => ' '
            );

$jkl = array('mno' => 'World',
             'pqr' => '.'
            );

?>

<强> stringHandler.php

<?php

class stringHandler
{
    private static $instance;

    private function __construct()
    {
        include('stringArrays.php');
        foreach(get_defined_vars() as $key => $val) {
            $this->{$key} = $val;
        }
    }

    public static function singleton()
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }

    public function getStringFromArray($arrayName, $strValue)
    {
        return $this->{$arrayName}[$strValue];
    }

}

function getString($arrayName, $strValue){
    return stringHandler::singleton()->getStringFromArray($arrayName, $strValue);
}


echo getString('abc','def');
echo getString('abc','ghi');
echo getString('jkl','mno');

?>

Kludgy,但不应该是一个很大的性能开销。