ob_start()
должно быть в верхней части страницы. в то время как session_start()
следует разместить в верхней части страницы. header()
должен быть помещен в начало страницы. include()
или require()
должен быть помещен в начало страницы. im запутался, что должно быть написано сверху и в каком порядке они помещены? и что значит на вершине ??? это
<html>
или <html>
или до <head>
или <head>
скажите, пожалуйста, что такое реальный порядок всех этих функций
подобно тому, как мы должны положить ob_end_flush (); и другую функцию в нижней части страницы после <html>
или после </body>
и каков порядок функций, которые появляются в нижней части страницы
Чтобы понять ценность написанных вами заявлений, вам необходимо иметь некоторое базовое понимание операций упомянутых вами функций. Я попытаюсь сломать их здесь.
Начнем с вызовов session_start()
и header()
:
Первая функция делает именно то, что подразумевает название; он начинает сеанс.
Из-за отсутствия состояния протокола HTTP нет необходимости в механизме, который может запоминать состояние между запросами страницы. Это может быть достигнуто с помощью сеансов. Хотя сеансы, в первые дни PHP, где иногда распространяются путем передачи идентификатора сеанса в ссылках ( someurl?sessionId=someSessionHash
), это, в настоящее время, считается плохой практикой.
В настоящее время сеансы преимущественно отслеживаются с помощью файла cookie (в ранние дни они широко используются также, не поймите меня неправильно). Этот сеансовый файл cookie (который, вопреки распространенному мнению, является не более чем обычным файлом cookie с просто идентификатором сеанса в нем, который (обычно) просто истекает после закрытия браузера) отправляется вместе с браузером с каждым последующим запросом страницы , И вот здесь улов: cookie отправляется как заголовок ответа (что означает перед фактическим телом), например:
// I've left out a lot of other headers for brevity HTTP/1.x 200 OK Date: Sun, 31 Jan 2010 09:37:35 GMT Cookie: SESSION=DRwHHwAAACpes38Ql6LlhGr2t70df // here is your Cookie header // after all response headers come the actual content: // the response body, for instance: <html> <head> </head> <body> </body> </html>
Теперь, поскольку заголовки ответов должны быть отправлены перед телом ответа, вам нужно поместить вызов session_start()
и header()
прежде чем будет выведено содержимое тела. Вот почему: если вы выведете любой контент тела ответа (может быть чем-то простым, как символ пробела) перед вызовом session_start()
или header()
, PHP автоматически выведет заголовки ответов. Это связано с тем, что ответ HTTP должен иметь заголовки ответов, отправленные сначала перед телом ответа. И именно это часто приводит к печально известному Warning: headers already sent
предупреждение в PHP. Другими словами; как только PHP отправил заголовки, потому что он также должен был отправить данные тела, он больше не может добавлять заголовки.
Итак, теперь, когда вы понимаете это по протоколу HTTP, есть некоторые измерения, которые вы можете предпринять, чтобы это не происходило. И здесь мы переходим к следующей функции:
ob_flush
, ob_flush
и т. д.:
В настройке по умолчанию PHP обычно выводит что-нибудь сразу. Поэтому, если вы выводите содержимое тела ответа, заголовки автоматически отправляются первыми.
Но PHP предлагает механизмы вывода буферизации. Это семейство функций ob_*
. С ob_start
вы скажете PHP, чтобы начать буферизацию. И с ob_flush
вы скажете PHP, чтобы ob_flush
буфер; другими словами, выводить текущее содержимое буфера на стандартный вывод.
С помощью этих механизмов буферизации вы можете добавлять заголовки в ответ, после того, как вы выведете данные тела, потому что вы еще не отправили данные тела, вы просто забуферили его, чтобы позже вывести вызов ob_flush
или ob_end_flush
и что У вас есть.
Имейте в виду, что использование функций ob_*
более чем часто является запахом кода. Другими словами (и именно поэтому важно делать определенные вещи наверху), тогда он используется для плохого дизайна. Кто-то забыл правильно настроить порядок операций и прибегает к буферизации вывода, чтобы обойти эту header
и session
драму.
Сказав все это, вы можете легко понять, почему вывод html и / или другого содержимого тела должен быть последним. Кроме того, я настоятельно рекомендую вам разделить PHP-код от выходного кода. Потому что его гораздо легче читать и понимать. И хороший способ начать делать это, когда фактический html приходит после основного блока кода <?php ?>
. Но есть и другие способы, выходящие за рамки этого вопроса.
Затем, наконец, о include
и require
вызовов. Как правило, их можно найти в верхней части ваших php-файлов. Он прекрасно сохраняет эти звонки в одном месте. Но имейте в виду, что если один из этих файлов выводит что-либо перед вызовом session_start()
или header()
без использования буферизации вывода, вы снова закручиваетесь.
«Верх страницы» означает перед любым выходом. «Нижняя часть страницы» означает после выхода.
Это просто означает, что перед любым другим персонажем, где «другое» означает «не PHP-код».
Весь код между <?php
и ?>
Не отправляется в браузер, поэтому он не учитывается. Таким образом, обычно «верх страницы» означает перед началом тега <html>
. Будьте осторожны, потому что, если у вас есть пустая строка или даже одно одиночное пробелы перед этим тегом (или даже до тега открытия PHP), это считается выходным.