2011-12-08 18 views
6

Tôi đoán get_headers của PHP không cho phép ngữ cảnh, vì vậy tôi phải thay đổi ngữ cảnh luồng mặc định để chỉ nhận được HEAD của yêu cầu. Điều này gây ra một số vấn đề với các yêu cầu khác trên trang. Tôi dường như không thể tìm ra cách đặt lại ngữ cảnh luồng mặc định. Tôi đang thử một cái gì đó như:PHP: get_headers đặt tạm thời stream_context

$default = stream_context_get_default(); //Get default stream context so we can reset it 
stream_context_set_default(//Only fetch the HEAD 
     array(
    'http' => array(
     'method' => 'HEAD' 
    ) 
) 
); 
$headers = get_headers($url, 1); //Url can be whatever you want it to be 
//var_dump($headers); 
var_dump($default); 
stream_context_set_default($default); //This doesn't work as it expects an array and not a resource pointer 

Có ai biết sửa lỗi này không?

Tôi biết nó đã được đề xuất để sử dụng Curl, nhưng tôi không muốn cho cái này. Cảm ơn!

+0

get_headers Không thống nhất: http://stackoverflow.com/questions/12781795/get-headers-inconsistency – Baba

Trả lời

8

Tôi đã sử dụng chức năng stream_get_meta_data() để nhận tiêu đề HTTP.

Đây là cách tôi thực hiện nó:

function get_headers_with_stream_context($url, $context, $assoc = 0) { 
    $fp = fopen($url, 'r', null, $context); 
    $metaData = stream_get_meta_data($fp); 
    fclose($fp); 

    $headerLines = $metaData['wrapper_data']; 

    if(!$assoc) return $headerLines; 

    $headers = array(); 
    foreach($headerLines as $line) { 
     if(strpos($line, 'HTTP') === 0) { 
      $headers[0] = $line; 
      continue; 
     } 

     list($key, $value) = explode(': ', $line); 
     $headers[$key] = $value; 
    } 

    return $headers; 
} 

gọi là như thế này,

$context = stream_context_create(array('http' => array('method' => 'HEAD'))); 
$headers = get_headers_with_stream_context($url, $context, 1); 

nó mang lại cho bạn những gì bạn đang sau khi rời khỏi stream_context chuẩn chưa sửa đổi.

Xin lưu ý rằng chức năng này sẽ không thành công nếu vượt qua bất kỳ điều gì ngoài url http.

Có vẻ như là một feature request cho một đối số bổ sung cho get_headers(), nhưng trình theo dõi lỗi bị lỗi khi tôi đang viết điều này, vì vậy tôi không thể kiểm tra các giải pháp khác ở đó.

1

Thay vì câu trả lời được chấp nhận, tôi đã làm như sau, sẽ hoạt động trong PHP 5.3 trở lên, mặc dù tôi chưa thử nghiệm đầy đủ. (Ngoài ra còn có một stream_context_get_params($context) nhưng tôi nghĩ rằng điều này là đủ.)

$stream_context_defaults = stream_context_get_options(stream_context_get_default()); 
stream_context_set_default(
    array(
     'http' => array(
      'method' => 'HEAD' 
     ) 
    ) 
); 
for ($i = 1; $i <= 10; $i++) { 
    $headers = get_headers('http://www.example.org'); 
} 
stream_context_set_default($stream_context_defaults); // reset to defaults 
+1

Điều này sẽ không phải lúc nào cũng hoạt động, 'stream_context_set_default()' không thể được đặt lại "" với một mảng $ stream_context_defaults trống. – powtac

+1

Tài liệu này có ở đâu đó không? Tôi đăng điều này vì lợi ích của việc cố gắng làm việc xung quanh việc thiếu các đối số cho get_headers. Tôi nhận ra rằng nó có lẽ không phải là thông minh nhất để thiết lập mặc định hơn là tạo ra một bối cảnh mới, nhưng tôi muốn tái sử dụng phương thức get_headers. Sẽ tốt hơn nếu get_headers có khả năng truyền trong một bối cảnh tùy chỉnh, như file_get_contents. –

+0

Không thấy rõ trong tài liệu. Tìm ra bằng cách kiểm tra. – powtac

4

Tôi đã có một vấn đề tương tự nhưng tôi chỉ sử dụng các chức năng file_get_contents với dòng bối cảnh tùy chỉnh để thay thế.

Đây là cách tôi thực hiện nó:

$options = array(
       'http' => array(
        'method' => 'HEAD', 
        'follow_location' => 0 
       ) 
      ); 

$context = stream_context_create($options); 

@file_get_contents($url, NULL, $context); 

var_dump($http_response_header); 

Sử dụng bối cảnh này chỉ các tiêu đề sẽ được lấy bằng file_get_contents và sẽ cư biến $http_response_header PHP.