Оптимизация включения файлов внутри функций в PHP - PullRequest
1 голос
/ 28 сентября 2010

У меня есть функция, которая должна включать файл, однако эта функция используется в местах от 200 до 300 раз, это, очевидно, вызывает проблемы эффективности, есть ли способ оптимизировать это внутри функции?(Я знаю, что есть много способов исправить это, но это окажет слишком большое влияние на все приложение)

Я просто приведу небольшой пример, это не вся функция.1004 *

Я пытался использовать include_once, но это тоже не сработало.

Заранее спасибо.

Ответы [ 7 ]

1 голос
/ 28 сентября 2010

Вы можете использовать статическую переменную в функции для хранения ваших значений:

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

}

Должен включать файл только один раз.

0 голосов
/ 28 сентября 2010

Если stringArrays.php - это просто набор массивов, как насчет создания синглтона stringHandler, который включает в себя stringArrays.php внутри конструктора и отображает каждый массив в свойство класса, тогда это простой метод для получения того, что вы хотите от этого класса , Тогда ваша функция getString () просто ссылается на метод получателя в stringHandler.

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');

?>

Глупо, но не должно быть слишком большой производительности.

0 голосов
/ 28 сентября 2010

Что-нибудь мешает вам обернуть ваш текущий "набор" массивов в массив, а затем передать этот массив-обертку в функцию по ссылке? Затем вы можете выполнить одно требование / включить вне функции. Кроме того, вы можете обернуть как наборы массивов, так и функцию внутри объекта, снова приведя вас к одному требованию / включению.

0 голосов
/ 28 сентября 2010

Установите APC, eAccelerator, XCache или любой другой ускоритель кода, чтобы PHP не требовал извлекать включаемый файл с диска при каждом его вызове. Ускорители кода сохраняют файл в общей памяти. Это значительно улучшит производительность.

0 голосов
/ 28 сентября 2010

Если ваша функция не делает ничего, кроме включения файла, вы должны сначала оценить, должна ли эта функция вызываться в первую очередь или заставить функцию определять, требуется ли включение. По сути, не включайте файл вслепую, если он вам действительно не нужен. include_once повлечет за собой снижение производительности.

0 голосов
/ 28 сентября 2010

Вы можете попробовать глобализовать то, что находится в stringArrays.php, чтобы вы могли проверить, установлена ​​ли эта глобальная переменная, прежде чем включать файл. Трудно сказать, не видя, что структура в stringArrays.php.

0 голосов
/ 28 сентября 2010

Вы всегда можете добавить другой параметр, возможно, логический, чтобы указать функции, включать ли ее.

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

    return $$arrayName[strValue]; 
}
...