Замедляет ли чтение включаемых файлов загрузку скрипта php? - PullRequest
12 голосов
/ 25 октября 2011

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

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

  1. Пожалуйста, прокомментируйте, насколько серьезной может быть эта проблема? Представьте, что веб-страница загружается за 0,60 с, может include из 10 файлов php превратить ее в 0,70 с?

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

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

Ответы [ 5 ]

16 голосов
/ 25 октября 2011

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

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

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

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

6 голосов
/ 25 января 2015

Учтите это:

(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 время выполнения скрипта может быть отложено довольно экспоненциально. Учтите это в следующий раз, когда вы напишите процесс с большим количеством итераций, т.е. чтение / запись больших XML-файлов и т. д. Лучше сохранять свой код встроенным, даже если это означает, что он менее «управляем». Потому что вы не только добавляете ~ 115 секунд (~ 2 минуты) к времени выполнения скрипта на каждых ~ 100 000 итераций, просто включив include (), но и подумайте, есть ли в этом include () (somefile.php) собственные процессы для выполнить. Мой пример - просто добавление конструкции include (). Включенный файл ничего не содержал.

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

6 голосов
/ 25 октября 2011

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

  1. Объедините все включенные файлы в один
  2. Используйте ускоритель

Это может ускорить решение за счет22 разаЧитать дальше Здесь

4 голосов
/ 25 октября 2011

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

1 голос
/ 30 августа 2018

Так что, конечно, включение файлов может замедлить работу php-скрипта. Иногда вам нужно включить файлы, чтобы уточнить структуру кода, архитектуру и дизайн. Но есть несколько методов и решений для улучшения скорости php-скрипта, которые включают в себя больше.

* Решения 1003 * Вы можете ускорить ваш скрипт, используя следующие методы: Изменение архитектуры кодирования и добавление некоторых файлов, когда они необходимы. Использование жесткого диска SSD и достаточное количество оперативной памяти. Добавление всех включений в один файл . По-своему я добавил включаемый файл в файл с именем engine.php и использую его, включив в него маршрутизатор. Кэширование данных - это еще один способ предотвращения включения данных. Вы можете изменить свой компилятор и использовать компилятор php 7.x, который в 10 раз быстрее, чем php 5.x из-за этой ссылки . Некоторые тесты здесь показывают, что php 7.2 быстрее, чем компилятор HHVM .

...