Как я могу ускорить включение PHP на 1800 строк? Это замедляет загрузку моей страницы до 10 секунд / просмотр - PullRequest
4 голосов
/ 05 мая 2010

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

Я называю это в других файлах PHP - например, процессорами AJAX - с простым "require_once (" codeBank.php ")".

Я обнаружил, что загрузка всех этих функций занимает около 10 секунд, хотя у меня есть только несколько глобальных массивов и куча других функций. Например, основной код процессора AJAX занимает 8 секунд только для простой проверки синтаксиса (операционная функция которого хранится в codeBank.php).

Когда я закомментирую require_once, мое время отклика AJAX увеличивается с 10 секунд до 40 мс, поэтому совершенно очевидно, что PHP пытается что-то сделать с этими 1800 строками функций. Это даже с установленным APC, что удивительно.

Что мне нужно сделать, чтобы скорость моего кода вернулась на уровень ниже 100 мс? Я как-то не получаю выгоду от кеша? Нужно ли разрезать этот отдельный файл банка функций на разные части? Есть ли другие тонкие вещи, которые я мог бы сделать, чтобы испортить мое время отклика?

Или, если не считать всего этого, какие инструменты можно еще глубже понять, какие операции PHP наносят удары по скорости?

==========================

[РЕД.] Разрешено.

==========================

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

Как только я убил эту строку, все вернулось к быстрым 30 мс ответам. Что остается для меня странным, так это то, что require_once () открывает php-файл каждый раз, когда вызывается AJAX-скрипт. Но это я не в форме и забыл, что каждый раз, когда скрипт AJAX завершается, он закрывается, и каждый раз открывается и перекомпилируется.

Ответы [ 6 ]

6 голосов
/ 05 мая 2010

У вас может быть файл с 100 000 строк кода, и загрузка по-прежнему не займет 10 секунд.

Возможно, там есть какой-то код инициализации, который, как вы не подозреваете, работает. Взгляните на профилировщик (xdebug или Zend Studio) и выясните, что именно вызывает замедление, прежде чем идти по пути оптимизации. Если вы думаете, что это просто потому, что длина файла составляет 1800 строк, значит, вы на неправильном пути.

1 голос
/ 05 мая 2010

убедитесь, что там нет функции sleep () :) также используйте apc для кеширования файла после его обработки, если он все еще медленный, когда apc кеширует файл, проблема кроется в другом месте. Я включил файлы с 20 000 строк без проблем.

0 голосов
/ 05 мая 2010

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

0 голосов
/ 05 мая 2010

Очень удивительно, что включение (даже 1800 строк) может так сильно его замедлить. Во-первых, возможно, вам следует просмотреть код, чтобы убедиться, что он не выполняет ненужную обработку. На самом деле анализ файла не должен быть таким узким местом.

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

// include/ajaxlib.php
class AjaxLib {
    public static function renderResponse($data) {
        // whatever
    }
}

// a common include file:
function __autoload($class) {
    require 'include/' . strtolower($class) . '.php';
}

// your code:
AjaxLib::renderResponse($foo);
0 голосов
/ 05 мая 2010

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

0 голосов
/ 05 мая 2010

Можете ли вы сгруппировать функции в файлы меньшего размера и загрузить по требованию?

Являются ли они глобальными функциями или классами, возможно, со статическими методами?

Если это так, вы можете воспользоваться автозагрузкой PHP. Посмотрите на __autoload() или для более гибкого решения, посмотрите на spl_autoload_register().

...