Включает ли чтение файлы, замедляющие загрузку 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 или включенном. Полагать, что это включить, вероятно, не имеет значения. Скорость диска не имеет никакого значения, поскольку он будет кэшироваться после первого раза.