Включает ли чтение файлов замедление загрузки php-скрипта?


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

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

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

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

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

Author: Googlebot, 2011-10-25

5 answers

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

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

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

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

 16
Author: Explosion Pills, 2011-10-25 06:22:29

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

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

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

 6
Author: idm, 2011-10-25 07:27:15

Подумайте об этом:

(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(), но и учитываете, включает ли это() (somefile.php ) имел свои собственные процессы для выполнения. Мой пример - просто добавление конструкции include().. включенный файл ничего не содержал.

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

 6
Author: Marcus, 2015-01-25 18:15:50

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

 4
Author: Ariel, 2011-10-25 06:46:15

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

Решения

Вы можете ускорить свой скрипт, используя следующие методы:

  • Изменение архитектуры кодирования и включение некоторых файлов, когда они необходимы.
  • Использование жесткого диска SSD диск и достаточно оперативной памяти.
  • Добавление всех включений в один файл . По-своему я добавил файл включения в файл с именем engine.php и использую его, включив его с помощью маршрутизатора.
  • Кэширование данных - это еще один способ предотвратить включение данных.
  • Вы можете изменить свой компилятор и использовать компилятор php 7.x, который в 10 раз быстрее php 5.x благодаря этой ссылке . Некоторый сравнительный тест здесь показывает, что php 7.2 быстрее, чем компилятор HHVM тоже.
 1
Author: Amir Forsati, 2018-09-26 08:03:56