Jump to content
  • 0

include или require


Serjinio
 Share

Question

13 answers to this question

Recommended Posts

  • 0

Можно еще прочувстовать разницу между ними если знать как ПХП обрабатывает файлы. Допустим мы запросили файл index.php - в корне сайта. ПХП считывает его, разбирая синтаксис. После анализа формирует в памяти внутреннее предсатвление считанного файла в виде конкретных инструкций. И затем выполняет их последовательно. В результате получаем ХТМЛ ответ. Если попадается инструкция include - парсер ПХП останавливает обработку текущего файла, и переключается на тот который в инклуде. Например include("news.php") - ищет и разбирает по строкам файл новостей. Потом опять возвращается к Индекс. Если не ошибаюсь то для всех обрабатываемых файлов создаются отдельные таблицы внутреннего для ПХП представления переменных и функций. Что приводит к некоторым накладным расходам.

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

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

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

Link to comment
Share on other sites

  • 0

На днях экспериментировал, подключал все файлы бмблиотеки Zend Framework в один файл рекурсивным обходом каталогов.

Холостой обход получился 0,5 сек, включение всех файлов 3,0 сек, отсюда время чистой компиляции ? 2,5 сек.

Решил поставить эксперимент, собрал тем-же рекурсивным обходм все файлы в один, получил на его компиляцию 0,6 сек. Как минимум это значит, что require само по себе дает наклодные расходы больше чем время компиляции кода в этих файлах, что не очень хорошо.

Link to comment
Share on other sites

  • 0

по идее вообще оптимальнее использовать include вместо require - так мы делаем вместо фатальной ошибки и прекращения работы скрипта его выполнение в любом случае.

для файлов, которые просто обязаны быть для корректной работы, просто проверяем удалось ли проинклюдить:

$inc_errs .= !include(файл) ? 'Не удалось подключить файл такой-то'."n" : null;

в результате этот лог ошибок инклюда потом обрабатываем как удобнее, проверив, что он непустой. если необходимо - отправляем на почту админу через mail. если надо чтоб пользователь видел - опять же ему будет приятнее увидеть какие-то сообщения типа "извините, технические проблемы: не могу прочитать необходимый файл", чем стандартное fatal error

Link to comment
Share on other sites

  • 0

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

Link to comment
Share on other sites

  • 0
Если надо подключить немного файлов -то разницы по большому счету нет - и include и require дадут одинаковый результат. ошибки вылезут в случае отсутствия файла. А если файлов много - то конешна рекуайр.

Позвольте не согласиться. Все надо использовать когда уместно. если мне надо включить десяток простых html страничек с выводом значением допустим одной переменной, то да require() то что нужно. Но если у меня есть ветвистый алгоритм и эта сотня страничек в свою очеред содержит дальнейшее ветвление и выполнение операций, то тащить их все require() в первоначальный файл не имеет смысла. только память забиваем и увеличиваем время распарсивания. потому что то что подключено require(), еще не значит что может понадобиться. а парсер по ненужному содержанию все-равно пройдется.

Link to comment
Share on other sites

  • 0
hummermania, по вашему рассказу должно такое работать:

if ($if) {
requite('req.php');
}

req.php:

 print 1;
} else {
print 2;

По идее должно. Парсер вначале считает код в память, потом содержимое файла рек.пхп и включит в памяти как продолжение -НЕЗАВИСИМО от того сработает ли условие. Т.е. на этапе непосредственно парсинга, обработки, а не на этапе исполнения кода.

Link to comment
Share on other sites

  • 0
Если надо подключить немного файлов -то разницы по большому счету нет - и include и require дадут одинаковый результат. ошибки вылезут в случае отсутствия файла. А если файлов много - то конешна рекуайр.

Позвольте не согласиться. Все надо использовать когда уместно. если мне надо включить десяток простых html страничек с выводом значением допустим одной переменной, то да require() то что нужно. Но если у меня есть ветвистый алгоритм и эта сотня страничек в свою очеред содержит дальнейшее ветвление и выполнение операций, то тащить их все require() в первоначальный файл не имеет смысла. только память забиваем и увеличиваем время распарсивания. потому что то что подключено require(), еще не значит что может понадобиться. а парсер по ненужному содержанию все-равно пройдется.

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

Link to comment
Share on other sites

  • 0
hummermania, по вашему рассказу должно такое работать:

if ($if) {
requite('req.php');
}

req.php:

 print 1;
} else {
print 2;

Ни разу не должно. PHP минимально реализует модульность включаемых файлов. Это значит, что любой файл самодостаточен, более того вот это выведется в браузер.

 print 1;
} else {
print 2;

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy