Сегодня хочу рассказать об очередном интересном принятом RFC в PHP 8.4, который вводит две новых функций:
http_get_last_response_header(): ?array
http_clear_last_response_header(): void
которые можно использовать для получения и очистки HTTP-заголовков последнего ответа HTTP-обертки (wrapper), которые могут заменить историческую переменную $http_response_header.
Напоминаю, что когда вы зайдествуете слой stream'ов, в частности использование HTTP-wrappers (оберток) то всякий раз магически создается переменная $http_response_header в локальной области видмости. Одним из таких способов использования является получение содержимого по URL-адресу file_get_contents():
file_get_contents('https://sergeymukhin.com');
var_dump($http_response_header);
array (size=10)
0 => string 'HTTP/1.1 200 OK' (length=15)
1 => string 'Server: nginx' (length=13)
2 => string 'Date: Thu, 07 Mar 2024 07:34:18 GMT' (length=35)
3 => string 'Content-Type: text/html; charset=UTF-8' (length=38)
4 => string 'Connection: close' (length=17)
5 => string 'Vary: Accept-Encoding' (length=21)
6 => string 'Set-Cookie: PHPSESSID=uea9m7qcm0jgq4t2g3kfolm51h; path=/' (length=56)
7 => string 'Expires: Thu, 19 Nov 1981 08:52:00 GMT' (length=38)
8 => string 'Cache-Control: no-store, no-cache, must-revalidate' (length=50)
9 => string 'Pragma: no-cache' (length=16)Переменная $http_response_header будет содержать все заголовки HTTP, которые были обнаружены во время запроса.
Мотивация введения новых функций обусловлена более предсказуемый и интуитивно понятный код:
file_get_contents('https://sergeymukhin.com/blog/cto-novogo-v-php-84');
//$headers = $http_response_header;
$headers = http_get_last_response_headers(); //запросили заголовки
http_clear_last_response_headers(); //почистили за собойКстати, переменная $http_response_header не модифицируется этими новыми функциями. Т.е.
Очистка $http_response_header не влияет на возвращение значений из http_get_last_response_headers() (она продолжает возвращать все, что было доступно), а вызов http_clear_last_response_headers() не сбрасывает значение в переменной $http_response_header.