За последние 24 часа нас посетили 70934 программиста и 1617 роботов. Сейчас ищут 905 программистов ...

Работа header() в PHP

Тема в разделе "PHP для новичков", создана пользователем intel, 28 янв 2018.

  1. intel

    intel Новичок

    С нами с:
    25 янв 2018
    Сообщения:
    27
    Симпатии:
    4
    Привет, пэхэпэшники :)

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

    Читая документацию я столкнулся вот с таким описанием:
    1. header — Отправка HTTP-заголовка.
    2. Помните, что функцию header() можно вызывать только если клиенту еще не передавались данные.

    И вот эти две строки почему-то заставляют меня думать, что когда парсер PHP встречает, например header('Location: http://www.example.com/'); то он сразу отправляет браузеру этот заголовок, типа отдельно от остального файла (разными пакетами, вначале один пакет с этим заголовком, а потом второй пакет с остальным содержимым).

    Но конечно же это все бред, например если отправлять через header() информацию о кодировке содержимого документа, а он отправит его отдельно, то эта кодировка будет говорить о содержимом прошлого пакета.

    А теперь ближе к сути моего вопроса:
    1.
    Когда интерпретатор PHP начинает обрабатывать скрипт, то он как бы создает дополнительный временный файл (какой-то объект, для хранения информации во время обработки, до передачи его клиенту, нужно ведь где-то хранить обработанную информацию) в который добавляет обработанную информацию, которая будет отправлена клиенту для обработки браузером. И когда интерпретатор PHP встречается с header() он его обрабатывает точно таким же образом, как и другие языковые конструкции, а именно он записывает этот заголовок в итоговый файл и продолжает работу скрипта (если конечно же header() правильно используется, если, например до этой языковой конструкции будут другие HTML символы, то парсер PHP, выдаст ошибку после анализа), дополняя этот итоговый файл другой информацией, которую необходимо будет передать клиенту, включая другие заголовки и сам HTML документ. И только, когда скрипт закончит работу, то передаст этот итоговый файл (с информацией для клиента), веб-серверу, а тот в свою очередь передаст его браузеру, и все это будет передано в одном HTTP-сообщении (HTTP-ответе).

    2. Если я правильно понял и правильно отписал работу всего выше изложенного в пункте 1, то возникает такой вопрос: если к примеру у нас будет такой вот скрипт:
    PHP:
    1. <?php
    2. // допустим этот скрипт должен выводить админам e-mail из БД всех зарегистрированных пользователей на какой-нибудь курс.
    3.  
    4. if ( !is_admin() )  {
    5.          header("Location: http://www.site.com/"); // если пользователь не является админом, то переводим его на гл. страницу сайта
    6.          // я специально не стал использовать тут exit();
    7. }
    8. ?>
    9. <!-- И тут допустим у нас наши e-mail адреса -->
    то получается, если эту страницу будет запрашивать пользователь, который не является админом, то этот скрипт всё равно отправит список e-mail адресов в HTML-ответе, но пользователь не увидит их потому-что браузер сразу выполнит переход на "http://www.site.com/", но содержимое страницы все-равно ведь будет содержать эти e-mail адреса, т.к header() просто добавляет в HTML-ответ заголовок и продолжает работу скрипта. И допустим, если в браузере каким-то образом отключить обработку этого заголовка с переходом, то пользователь все же увидит весь этот список e-mail адресов, т.к. заголовок мы проигнорируем, а все остальное содержимое HTTP-ответа, мы обработаем.

    Правильно ли я понял работу всего, что описал в этих двух пунктах?
     
    #1 intel, 28 янв 2018
    Последнее редактирование: 28 янв 2018
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    Да, всё, что после header, будет выведено. И есть способы сделать, чтоб можно было header вызывать когда угодно, а он выводился всё равно правильно (буферезация вывода, в том числе включается из настроек). Посему просто набивай автоматизм: если пишешь header("Location: xxx"), следующим оператором пиши die или exit (синонимы), чтобы больше ничего в ответе не было полезного. Можно это спрятать в функцию под названием redirect(), чтоб не забывать:
    PHP:
    1. function redirect($url) {
    2.     header("Location: $url");
    3.     die;
    4. }  
    И вызывать везде функцию redirect. Если бы я писал на чистом PHP, так бы и сделал, наверное.
     
    intel нравится это.
  3. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.128
    Симпатии:
    1.248
    Адрес:
    там-сям
    чтобы не изобретать новую реальность, начни с изучения как работает обмен сообщениями http.
    пхп всего-лишь помошник на этом пути. новых понятий в http он не вводит.

    матчасть:
    https://ru.wikipedia.org/wiki/HTTP
    https://habrahabr.ru/post/215117/
    --- Добавлено ---
    https://ru.wikipedia.org/wiki/Список_заголовков_HTTP
    --- Добавлено ---
    https://ru.wikipedia.org/wiki/HTTP_location
     
    25517 и intel нравится это.