«phpClub» — архив тем ("тредов"), посвящённых изучению PHP и веб-технологий.
Аноним 2021/08/13 09:53:27  №2126540 1
Как пыхыпы знает в какой части получать ответ?
Вот ты создаешь запрос, отправляешь, скрип останавливается и ждет ответа(ограниченное кол-во времени)
В ответ возвращается заголовок, типа от того-то, туда-то.
Вот что есть этот туда-то? То бишь в заголовке написано отправить на рут(url) MyController. А как этот контролер знает что данные заголовка надо кидануть в определенную часть скрипта, а не начать обрабатывать запрос с самого начала скрипта?
Ответы: >>2126779
Аноним 2021/08/13 12:27:36  №2126779 2
>>2126540

Извини, но я не очень понял, о какой ситуации идет речь: браузер отправляет HTTP-запрос на сервер, где работает PHP-скрипт, или PHP-скрипт отправляет запрос на другой сервер? Или речь (судя по слову контроллер) о каком-то фреймворке? Опиши подробнее, что за ситуация. Используется ли фреймворк или самописный код и кто кому отправляет запрос.

Если ты из скрипта отправляешь HTTP-запрос на другой сервер, то никакие контроллеры не вызываются. Ты просто отправляешь запрос и скрипт останавливается до получения ответа. После получения ответа он продолжает свою работу с того места, где остановился:

// эта строчка отправляет HTTP-запрос и скрипт останавливается до получения ответа
$result = curl_exec($ch);
Ответы: >>2126973
Аноним 2021/08/13 16:25:34  №2126973 3
>>2126779
PHP отправляет через curl, в процессе исполнения скрипта, ждет ответа.

Фреймворк пусть будет ларавел\симфони, но это не особо важно, у них под капотом таже пыха с адресом скрипта.

>останавливает
И как это происходит? Изнутри если? Как он знает с какого места продолжить исполнение?
Ответы: >>2127727
Аноним 2021/08/14 12:54:52  №2127727 4
>>2126973

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

У каждой команды есть адрес (номер). И есть счетчик команд, он хранит номер текущей выполняющейся команды. Счетчик увеличивается после выполнения каждой команды.

Команды выполняются строго по очереди. Допустим, программа выглядит так:

1) отправить запрос на http://example.com/page.html
2) сохранить ответ в переменную $x
3) вывести $x на экран

В этом случае сначала выполняется команда 1. Она отправляет запрос и ждет ответа. Пока она ждет, ничего не происходит и никакие другие команды не выполняются. Когда ответ приходит, начинает выполняться команда 2.

Как это работает на более низком уровне. Программа сама не может пересылать данные по сети. Этим занимается только операционная система (ОС). Программа, используя "системные вызовы", просит операционную систему сделать ту или иную сетевую операцию. При этом, пока операция выполняется, программа "стоит на месте" и ничего не делает.

Вот, например, как выглядит отправка запроса к http://example.com на более низком уровне:

1) сформировать HTTP-запрос, собрав вместе все нужные заголовки
2) попросить ОС установить соединение с сервером example.com
3) попросить ОС передать HTTP-запрос на сервер example.com
4) попросить ОС принять данные от сервера
5) разобрать пришедший ответ и извлечь из него нужные данные (заголовки, тело ответа и тд)

Операции 2, 3 и 4 "блокирующие" - то есть, пока они выполняются, программа ничего не делает. Как только операция выполнится, программа продолжает работу.

Как это работает на еще более низком уровне: у каждой команды в программе есть адрес (номер), и есть "счетчик команд", он хранит номер текущей выполняемой команды. Когда завершается выполнение операции и управление возвращается программе, она продолжает выполнение с того номера, который записан в счетчике команд.

> Как он знает с какого места продолжить исполнение?

Номер команды, на которой остановилось выполнение, записан в счетчике команд.