Предположим, что выполнился запрос такой запрос http://site.ru/?welcome=vsemPrivet, сервер подгрузил какой-то php скрипт, а в в скрипте всего одна строчка, например Код (Text): echo $_GET['welcome'] . Собственно, мне интересно узнать, какие выполняются операции после работы интерпритатора до отправки http ответа. Довольно долго искал информацию, но что-то безуспешно.
Парсится тело запроса, парсится скрипт, выполняются команды. С некоторых пор выполняется just-in-time компиляция. О парсинге пхп-скриптов можно сложить мнение благодаря встроенной функции, которая парсит строку, возвращает кучу токенов.
@igordata а какие данные после компиляции php передает серверу? php формирует ответ или сервер на основе переданных формирует ответ?
@Rezovskij PHP по FCGI/CGI или другим методом передаёт результат своей работы веб-серверу, обычно веб-сервер может добавить в заголовки размер ответа, может ещё заниматься сжатием данных.
@denis01@Fell-x27, Правильно ли я понимаю, php по завершению компиляции формирует какое-то сообщение серверу, а на основе этого сообщения сервер уже формирует ответ на запрос и добавляет некоторую информацию в заголовках?
По завершению "компиляции php" скрипт для начала начинает работу. Скрипт php сегодня исполняется не построчно в процессе интерпретации, а, все же, тут есть JIT. На этой особенности основаны всякие аккселераторы, которые позволяют сохранять скопилированный php в памяти, и, при последующих вызовах сразу запускать исполнение, а не тратить время на повторную интерпретацию. В ходе работы php открывает поток и пишет в буфер вывода сервера все, что ты там внутри скрипта эхаешь, принтишь, вардампишь и тд. Если ты пользуешься буфером вывода php, то тогда наружу, во время работы, до ее окончания, будут слаться только заголовки. Весь остальной контент будет набиваться в буфер вывода php. Когда скрипт закончит работу, он прокинет весь свой буфер вывода в поток, из которого читает сервер. Таким образом контент будет отдан строго после заголовков. После этого сервер уже берет то, что получилось, дописывает, если надо собственных заголовков, типа длины контента, сжимает это все, если ты указал это в настройках, и прокидывает клиенту. --- Добавлено --- Так-то у тебя под сервером может быть даже чистый C или ассемблер вместо php Главное, чтобы выполнялись CGI-договоренности. Сервер просто проксирует запрос и открывает поток на чтение. Ему совершенно плевать, кто в этот поток пишет.
@Rezovskij про потоки почитай. типа "стандартные потоки ввода-вывода" https://ru.wikipedia.org/wiki/Стандартные_потоки тут три абзаца-то всего. Препод тебя поцалюит. буфер может быть, а может не быть. Можно быть уверенным только в том, что пишет в поток так или иначе.