Làm cách nào để kiểm tra tiêu đề từ phản hồi trong PHP?

Tiêu đề HTTP rất quan trọng để trao đổi thông tin giữa trình duyệt và máy chủ. Chúng có hai loại - tiêu đề yêu cầu và tiêu đề phản hồi. Bài viết này bao gồm các tiêu đề phản hồi

Cách gửi tiêu đề phản hồi HTTP

Vì các tiêu đề phản hồi được gửi bởi máy chủ, nên cần phải sử dụng các công cụ ngôn ngữ lập trình, ví dụ: các cơ sở PHP. Nó có các chức năng đặc biệt để làm việc với các tiêu đề. Để gửi tiêu đề - chức năng tiêu đề

Bạn chỉ có thể gửi tiêu đề nếu chưa có dữ liệu nào được gửi. Trước khi gọi chức năng này, không được có thẻ HTML, dòng trống, v.v. , bao gồm trong các tập tin bao gồm. Nghĩa là, các tiêu đề được gửi trước, sau đó là chính dữ liệu

Ví dụ gửi tiêu đề tới PHP tới trình duyệt

  header ['HTTP / 1.1 404 Not Found'];
header ['Status: 404 Not Found'];
header ['Location:  // example.com'];  

Cách nhận tiêu đề phản hồi HTTP

Các chức năng sau đây có sẵn cho việc này

  • get_headers - trả về tất cả các tiêu đề từ phản hồi của máy chủ đối với yêu cầu HTTP;
  • apache_response_headers - Trả về danh sách tất cả các tiêu đề phản hồi HTTP của Apache;
  • http_response_code - nhận hoặc đặt mã phản hồi HTTP;
  • headers_list - Trả về danh sách các tiêu đề đã gửi [hoặc sẵn sàng gửi]

Bạn cũng có thể sử dụng thư viện CURL. Làm cách nào để nhận tiêu đề phản hồi bằng CURL?

  if [$ curl = curl_init ['//example.com']] {
curl_setopt [$ curl, CURLOPT_RETURNTRANSFER, true];
curl_setopt [$ curl, CURLOPT_NOBODY, true];
curl_setopt [$ curl, CURLOPT_HEADER, true];
$ out = curl_exec [$ curl];
echo $ out;
curl_close [$ curl];
}  

Cách xóa tiêu đề phản hồi HTTP

Có thể xóa tiêu đề bằng chức năng đặc biệt - header_remove. Trước tiên, bạn cần kiểm tra xem các tiêu đề đã được gửi chưa

  if [! headers_sent []] {
    header_remove ['Content-Type'];
}  

Như bạn có thể thấy từ bài viết, rất dễ làm việc với các tiêu đề phản hồi HTTP ở phía máy chủ

Khi sử dụng file_get_contents để thực hiện các yêu cầu HTTP, các tiêu đề phản hồi của máy chủ được lưu trữ trong một biến dành riêng sau mỗi yêu cầu thành công;

2291 lượt xem

Bởi. Jacob

Đã chỉnh sửa. 2022-03-18 11. 51

Khi bạn đang sử dụng các hàm tệp PHP dựng sẵn để thực hiện các yêu cầu HTTP, các tiêu đề phản hồi sẽ tự động được cung cấp trong một biến đặc biệt, $http_response_header; . Trong hướng dẫn này, bạn sẽ học cách phân tích cú pháp các tiêu đề yêu cầu bất kể bạn đang sử dụng cURL hay các hàm tệp như file_get_contents

Hơi lạ là các tiêu đề được lưu trữ dưới dạng một mảng được lập chỉ mục, thay vì một mảng kết hợp thân thiện với người dùng hơn;

Để phân tích các tiêu đề phản hồi và tạo một mảng kết hợp, chúng ta có thể sử dụng giải pháp này cho các hàm tệp tích hợp

$response_headers = [];
$status_message = array_shift[$http_response_header];
foreach [$http_response_header as $value] {
  if[false !== [$matches = explode[':', $value, 2]]] {
    $response_headers["{$matches[0]}"] = trim[$matches[1]];
  }                
}

Và cái này khi sử dụng thư viện cURL

// Define the $response_headers array for later use
$response_headers = [];

// Get the first line [The Status Code]
$line = strtok[$headers, "\r\n"];
$status_code = trim[$line];

// Parse the string, saving it into an array instead
while [[$line = strtok["\r\n"]] !== false] {
    if[false !== [$matches = explode[':', $line, 2]]] {
      $response_headers["{$matches[0]}"] = trim[$matches[1]];
    }  
}

Làm điều này giúp bạn có thể dễ dàng kiểm tra xem một tiêu đề đã cho có tồn tại hay không, chỉ đơn giản bằng cách sử dụng isset trên khóa mảng

if [isset[$response_headers["content-type"]]] {
  echo '

The "content-type" header was found, and the content is:

'
; echo $response_headers["content-type"]; exit[]; }

tập tin chức năng

Như đã đề cập trước đó, để có được các tiêu đề phản hồi bằng cách sử dụng các hàm tệp dựng sẵn của PHP, bạn có thể lặp qua biến $http_response_header;

Các chức năng được sử dụng để thực hiện các yêu cầu HTTP bằng cách sử dụng các hàm tệp thường bao gồm file_get_contents, stream_context_create và stream_get_contents — cách sử dụng chúng sẽ được trình bày trong các hướng dẫn khác

Phần tử đầu tiên trong mảng $http_response_header luôn là mã trạng thái HTTP — ngay cả khi đọc các tiêu đề thô, mã trạng thái luôn xuất hiện trước. Có thể hữu ích khi lưu trữ mã trạng thái trong một biến riêng biệt

$status_message = array_shift[$http_response_header];

Hàm array_shift phục vụ hai mục đích ở đây

  1. Nó trả về phần tử đầu tiên trong mảng
  2. Nó loại bỏ phần tử đầu tiên khỏi mảng

Tất cả các khóa dãy số cũng sẽ được cập nhật tương ứng, vì vậy sẽ không có bất kỳ khóa nào bị thiếu

Các tiêu đề HTTP được tạo bởi khóa. cặp giá trị, nhưng chúng ta không thể chuyển đổi chúng thành một mảng bằng dấu hai chấm [. ], vì các giá trị tiêu đề cũng có thể chứa dấu hai chấm. Vì vậy, những gì chúng ta có thể làm, mà không cần dùng đến biểu thức chính quy, là tách chuỗi theo dấu hai chấm đầu tiên trong chuỗi, vì dấu hai chấm luôn xuất hiện sau tên khóa

Ghi chú. Mặc dù sử dụng biểu thức chính quy sẽ dễ dàng hơn, nhưng sẽ nhanh hơn khoảng 10% đến 68% nếu sử dụng kết hợp giữa sọc và chất nền hoặc phát nổ - điều đó không quan trọng lắm trong thực tế - tuy nhiên, tôi nghĩ chúng ta nên tuân theo những gì

Tất cả các cách tiếp cận sau đây thực sự khá dễ sử dụng, vì vậy nên sử dụng cách nào có lẽ nên tùy theo cách nào hiệu quả nhất

Giải pháp 1

Sử dụng chức năng phát nổ nhanh hơn khoảng 68% so với sử dụng preg_match

$headers = array[];
$status_message = array_shift[$http_response_header];
foreach [$http_response_header as $value] {
  if[false !== [$matches = explode[':', $value, 2]]] {
    $headers["{$matches[0]}"] = trim[$matches[1]];
  }                
}

Giải pháp 2

Đây là cách sử dụng stripos và substr, nhanh hơn khoảng 10% so với sử dụng biểu thức chính quy

________số 8_______

Giải pháp 3

Nếu vì lý do nào đó bạn thích sử dụng cụm từ thông dụng hơn, vui lòng làm như vậy; . Đây là cách sử dụng preg_match để làm điều tương tự

$headers = array[];
$status_message = array_shift[$http_response_header];
foreach [$http_response_header as $value] {
  if [preg_match['/^[[^:]+]:[[^\n]+]/', $value, $matches]] {
    $headers["{$matches[1]}"] = trim[$matches[2]];
  }  
}
print_r[$headers];

Tất nhiên chúng ta cũng có thể loại bỏ hàm trim khi sử dụng biểu thức chính quy;

Cách điểm chuẩn được thực hiện

Mỗi bài kiểm tra được thực hiện bằng cách phân tích cú pháp các tiêu đề 1 triệu lần như thế này

$start_time = microtime[true];
$repeat = 0;
$status_message = array_shift[$http_response_header];
while [$repeat 

Chủ Đề