Включает ли чтение файлы, замедляющие загрузку PHP скрипт?

Очень часто используются файлы include. Я считаю, что слишком сложно держать коды в порядке, не учитывая производительность. Для нескольких include s диск должен читать файлы, и поскольку мы чрезвычайно используем диск, это может быть медленный процесс. Однако это не основной медленный процесс или процесс ограничения скорости, так как загрузка файла с помощью file_get_contents выполняется в несколько раз быстрее.

Я думаю, что именно по этой причине крупные веб-сайты помещают javascripts в html файл, а не загружают их по файлу. В качестве альтернативы, может быть хорошей идеей разбить большой JS файл на несколько небольших JS файлов, поскольку параллельные HTTP-запросы могут быстрее загружать все JS-коды. Но это отличается от php файлов, так как php script читает файлы include один за другим во время процесса.

  • Прокомментируйте, насколько серьезной может быть эта проблема? Представьте, что веб-страница загружается в 0.60s, может ли include из 10 php файлов превратить ее в 0.70s?

  • Хотя этот эффект должен быть незначительным, я хочу знать, есть ли подходы к ускорению этого процесса. Я не имею в виду php-кэширование, например APC.

P.S. Этот вопрос не для практического применения (типичный случай), а теоретические соображения в целом.

Ответ 1

include и его ilk является необходимостью. Он похож на import на Java и python тем, что используется для определения классов и функций. include должен быть очень быстрым, но с его помощью будет задерживаться выполнение script по сравнению с тем, если его там не было. include полностью отличается от file_get_contents(). Последнее является функцией, а не конструкцией и возвращает строку. include фактически выполнит код прилагаемого файла.

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

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

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

Ответ 2

Да, да. Библиотеки, которые вы использовали, приведут к снижению производительности из-за большого количества включений. Лучший способ повысить производительность:

  • Соедините все включенные файлы в один
  • Использование ускорителя

Он может ускорить ваше решение в 22 раза. Подробнее Здесь

Ответ 3

Рассмотрим это:

(index.php)
for ($i=0; $i<100000; $i++) {
    include('somefile.php');
}

(somefile.php)
<?php
// nothing here

index.php занимает ~ 115 секунд (для меня) для обработки 100 000 итераций, включая somefile.php, хотя somefile.php ничего не имеет в нем.

Однако:

(index.php)
for ($i=0; $i<100000; $i++) {
    // no file included this time
}

index.php теперь занимает 0,002 секунды для завершения без конструкции include().

(index.php)
for ($i=0; $i<100000; $i++) {
    echo $i .'<br/>';
}

index.php занимает 0,02 секунды, чтобы эхо 100 000 итераций $i.

Конечно, это довольно экстремальный пример из-за большого количества итераций, но он показывает, что просто включив конструкцию include, script время выполнения может быть отложено довольно экспоненциально. Рассмотрим это в следующий раз, когда вы напишете процесс с большим количеством итераций, т.е. чтение/запись больших XML файлов и т.д. Лучше всего держать свой код в строгом, даже если это означает, что он менее "управляемый". Потому что вы не только добавляете ~ 115 секунд (~ 2 минуты) до script времени выполнения на каждые 100 000 итераций, просто включив include(), но подумайте, имели ли в include() (somefile.php) процессы его самостоятельно выполнять. Мой пример - просто добавить конструкцию include(). Вложенный файл ничего не содержит.

Теперь, включая файлы здесь и там для веб-страницы, время было бы незначительным. Я только указывал, что конструкция include() требует дополнительной обработки независимо от ее содержимого.

Ответ 4

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