Как создать быструю библиотеку PHP? - PullRequest
1 голос
/ 18 сентября 2008

Для нашей онлайн-игры мы написали тонны классов и функций PHP, сгруппированных по темам в файлах, а затем в папках. В конце концов, теперь у нас есть весь наш внутренний код (уровни логики и доступа к БД) в наборе файлов, которые мы называем libs , и мы включаем наши библиотеки в наш графический интерфейс (веб-страницы, уровень представления), используя include_once ( 'pathtolib / file.inc') .

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

Это оказывает существенное влияние на производительность. Поэтому, что было бы лучшим решением?

  • Удалить все операторы include из файла libs и вызвать только нужный из веб-страниц?
  • Делать что-то еще?

Сервер использует классический стек LAMP (PHP5).

РЕДАКТИРОВАТЬ: У нас есть сочетание простых функций (унаследованная причина и большая часть кода) и классов. Так что автозагрузки будет недостаточно.

Ответы [ 8 ]

3 голосов
/ 18 сентября 2008
  • Управлять всеми включениями вручную, только при необходимости
  • Установите ваш include_path только там, где он должен быть, по умолчанию это что-то вроде. set_include_path
  • Не используйте автозагрузку, она медленная и делает работу APC и эквивалентных кешей намного сложнее
  • Вы можете отключить "stat" -операцию в APC, но затем вам придется очищать кеш вручную каждый раз, когда вы обновляете файлы
3 голосов
/ 18 сентября 2008

Если вы хотите получить действительно хардкорное ядро, проведите некоторый статический анализ и выясните, какие именно библиотеки нужны, и включайте их только.

Если вы используете include, а не include_once, то здесь также есть некоторая экономия скорости.

Все, что сказано, ответ Мэтта о Zend Optimizer прямо на деньги. Если хотите, попробуйте Advanced PHP Cache (APC), который является кешем кода операции и бесплатный. Это должно быть в хранилище PECL.

3 голосов
/ 18 сентября 2008

Если вы сделали свое программирование объектно-ориентированным способом, вы можете использовать функцию autoload , которая будет загружать классы из их исходных файлов по требованию при их вызове.

Редактировать : Я заметил, что кто-то отклонил оба ответа, относящиеся к автозагрузке. Мы не правы? Не слишком ли высока нагрузка на функцию __autoload, чтобы использовать ее в целях производительности? Если я что-то не понимаю в этой технике, мне было бы интересно узнать, что это такое.

2 голосов
/ 19 сентября 2008

То, что вы ищете, это Расширение PECL для Automap .

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

Подробнее об этом можно прочитать здесь .

2 голосов
/ 18 сентября 2008

Вы можете использовать spl_autoload_register () или __autoload () для создания любых правил, которые вам нужны для включения файлов, которые вам нужны для классов, однако автозагрузка вносит свои ограничения в производительность. Вам нужно будет убедиться, что все, что вы используете, будет добавлено ко всем страницам графического интерфейса пользователя с помощью настройки php.ini или конфигурации apache.

Для ваших файлов с общими функциями я бы предложил вам обернуть их в служебный класс и выполнить простой поиск и замену, чтобы заменить все ваши вызовы функции () на util :: function (), что затем позволит вам автозагрузка этих функций (опять же, при вызове метода накладываются накладные расходы, а не глобальная функция).

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

.

Вот пример способа динамической загрузки материала

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}
1 голос
/ 19 сентября 2008

Используйте профилировщик . Если вы пытаетесь оптимизировать, не имея мер, вы работаете вслепую.

1 голос
/ 18 сентября 2008

Используйте кэш байт-кода (в идеале APC), чтобы PHP не анализировал библиотеки при каждой загрузке страницы. Имейте в виду, что использование автозагрузки сведет на нет преимущества использования кэша байт-кода (подробнее об этом здесь ).

1 голос
/ 18 сентября 2008

Прошло много времени с тех пор, как я использовал php, но разве Zend Optimizer или Cache не помогут в этом случае? Php все еще загружает и компилирует каждый включенный файл снова для каждого запроса?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...