list — PHP headers_list () не показывает все заголовки

Согласно документации: http://php.net/manual/en/function.headers-list.php, и этот комментарий: http://php.net/manual/en/function.headers-list.php#110330, PHP-код:

<?php var_dump(header_list()); ?>

Не показывает заголовки статуса.


Это странное поведение странно. Итак, есть два вопроса:

  1. Зачем? (Я не уверен, что этот вопрос основан на мнении, если он есть, и нет РЕАЛЬНОГО объяснения, пожалуйста, пропустите его. Я имею в виду, что иногда вопросы, основанные на мнении, не основаны на мнении, и действительно имеют объяснение, и это не может быть предсказано прежде чем их спросят).
  2. Я знаю, что могу использовать свою собственную функцию для установки заголовка, которая будет устанавливать заголовок и дополнительно помнить, что этот заголовок был установлен. Но это своего рода … обходной путь, так как header_list () вполне уверен ЗДЕСЬ, ДЛЯ ЭТОГО. Кроме того, эти заголовки находятся где-то в памяти механизма php, поэтому сохранение их во второй раз в скрипте неэффективно для памяти. Так… Что за черный ход, чтобы получить все заголовки, не так глупо, как обходной путь ниже? Это может быть полезно, например, как часть класса отладки / разработчика, который отображает все данные «разработчика» в виде HTML-комментариев в конце страницы. Конечно, я опускаю заголовок длины контента, который слишком рано прогнозировать.
  3. Похоже, что эта функция опускает все заголовки, которые не имеют двоеточия … Это правильно?

Чтобы опубликовать больше кода, простой обходной путь к функции заголовка (линейный, а не объект, использующий глобальные переменные, а не статический класс, просто чтобы показать идею). Предполагая, что функция заголовка опускает заголовки без двоеточий (что может быть не совсем верно …):

<?php
// Mechanism:
$headers = array();
function setHeader($header) {
header($header);
if (strpos($header, ':') === false) {
global $headers;
$headers[] = $header;
}
}
function getHeaders() {
global $headers;
return array_merge($headers, header_list());
}

// Example:
setHeader('HTTP/1.1 404 Not Found');
var_dump(getHeaders());
?>

2

Решение

Проверка источник двигателя для headers_list а также http_response_code, обратите внимание, что значения для общих заголовков и кода состояния разделены:

// headers_list
SG(sapi_headers).headers

// http_response_code
SG(sapi_headers).http_response_code

Но код ответа HTTP — не единственный заголовок с выделенным хранилищем: Content-Type тоже:

SG(sapi_headers).mimetype = NULL;

Так что здесь происходит? полный алгоритм header () специально проверяет следующие строки для корректировки состояния:

  • HTTP/
  • Content-Type
  • Content-Length
  • Location
  • WWW-Authenticate

HTTP/ проверяется именно потому, что так явно устанавливают код состояния до PHP 5.4: после этого http_response_code доступно и рекомендуется для наглядности. Тот header() был сбит с толку, по той причине, что вы задаете в этом вопросе и по общему принципу: http заголовок BNF явно не включает строку состояния:

header-field   = field-name ":" OWS field-value OWS

PHP обрабатывает остальные отдельно, потому что они являются заголовками с одним значением и / или их значение имеет значение для эффективности в последующих вычислениях.

TL; DR: HTTP/ установить с помощью header() не входит в headers_list() так как HTTP/ строки состояния не являются заголовками в строгом смысле RFC. Но для PHP < 5.4 ограничение, которое header() был единственный способ установить HTTP/ статус, это, вероятно, никогда не было бы запутанным вопросом.

1

Другие решения

Кажется, что только код состояния отсутствует в header_list,

Вы можете получить текущий код состояния (они, вероятно, перезаписывают друг друга), используя другую функцию: http_response_code.

1

По вопросам рекламы [email protected]