Откуда берутся заголовки при вызове echo в PHP?

Я вижу код из руководства по PHP

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET / HTTP/1.1\r\n";
    $out .= "Host: www.example.com\r\n";
    $out .= "Connection: Close\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}

писать заголовок по эхо, это будет работать?

когда просто вызываем простой код, подобный этому:

echo 'hello';

откуда заголовки http?

1 ответ

Решение

Что вы делаете в этом коде:

  1. Откройте сокет-соединение с удаленным HTTP-сервером (www.example.com на порту 80). Это устанавливает TCP-соединение с этим портом.
  2. Затем вы отправляете (через fwrite) HTTP-запрос по этому соединению. HTTP - это протокол поверх TCP, и вы вручную формулируете здесь заголовки протокола HTTP.
  3. Вы тогда читаете (через fgets) (HTTP) ответ удаленного сервера.

Я предполагаю, что вы хотите знать, почему вы видите заголовки HTTP в этом удаленном ответе, даже если вы только делаете echo 'hello'; на удаленном сервере. Ответ заключается в том, что веб-сервер, работающий на этом сервере, обрабатывает транзакцию HTTP. Вы не обрабатываете детали входящего HTTP-запроса в PHP, а также не обрабатываете детали исходящего ответа. Веб-сервер, на котором работает PHP (вероятно, Apache), делает это.

Весь стек включает в себя TCP-соединение, которое содержит HTTP-запрос, который состоит из HTTP-заголовков и тела HTTP. На сервере TCP-соединение обычно обрабатывается базовой операционной системой, которая делает соединение доступным в качестве сокета для веб-сервера, где веб-сервер "разворачивает" HTTP-запрос для его обработки и при необходимости вызывает PHP, а затем вся цепочка идет назад для ответа.

Другие вопросы по тегам