2009-10-09 33 views
8

Tôi muốn gửi lệnh HEAD của Giao thức truyền siêu văn bản tới máy chủ trong PHP để truy xuất tiêu đề chứ không phải nội dung hoặc URL. Làm thế nào để tôi làm điều này một cách hiệu quả?Cách dễ nhất để sử dụng lệnh HEAD của HTTP trong PHP là gì?

Trường hợp sử dụng phổ biến nhất có thể là kiểm tra các liên kết web đã chết. Đối với điều này tôi chỉ cần mã trả lời của yêu cầu HTTP chứ không phải nội dung trang. Bắt các trang web trong PHP có thể được thực hiện dễ dàng bằng cách sử dụng file_get_contents("http://..."), nhưng với mục đích kiểm tra các liên kết, điều này thực sự không hiệu quả vì nó tải toàn bộ nội dung trang/hình ảnh/bất cứ điều gì.

Trả lời

15

Là một thay thế cuộn tròn, bạn có thể sử dụng các tùy chọn bối cảnh http để thiết lập phương thức yêu cầu đến HEAD. Sau đó, mở một dòng (http wrapper) với các tùy chọn này và tìm nạp dữ liệu meta.

$context = stream_context_create(array('http' =>array('method'=>'HEAD'))); 
$fd = fopen('http://php.net', 'rb', false, $context); 
var_dump(stream_get_meta_data($fd)); 
fclose($fd); 

also see:
http://docs.php.net/stream_get_meta_data
http://docs.php.net/context.http

+1

Tôi thích giải pháp này so với các giải pháp sử dụng curl, vì tôi thích sử dụng các chức năng tích hợp sẵn. Có lẽ ai đó khác có thể bình luận về hiệu suất của từng khả năng? – fuenfundachtzig

+0

Lưu ý rằng điều này sẽ gây ra lỗi cho mã phản hồi '401', trong khi curl cung cấp cho bạn phản hồi thực tế. –

+0

'stream_context_create()' cũng có thể được sử dụng với 'file_get_contents()'. Có thể 'get_headers()' được kết hợp tốt hơn với 'stream_context_set_default()' vào phương thức của yêu cầu tới HEAD. Xem http://php.net/manual/es/function.get-headers.php – cybmeta

17

Bạn có thể làm điều này gọn gàng với cURL:

<?php 
// create a new cURL resource 
$ch = curl_init(); 

// set URL and other appropriate options 
curl_setopt($ch, CURLOPT_URL, "http://www.example.com/"); 

// This changes the request method to HEAD 
curl_setopt($ch, CURLOPT_NOBODY, true); 

// grab URL and pass it to the browser 
curl_exec($ch); 

// Edit: Fetch the HTTP-code (cred: @GZipp) 
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

// close cURL resource, and free up system resources 
curl_close($ch); 
3

Thậm chí dễ dàng hơn curl - chỉ cần sử dụng PHP get_headers() chức năng mà trả về một mảng của tất cả các thông tin tiêu đề cho bất kỳ URL bạn chỉ định. Và một cách dễ dàng khác để kiểm tra sự tồn tại của tệp từ xa là sử dụng fopen() và cố gắng mở URL ở chế độ đọc (bạn sẽ cần phải bật allow_url_fopen cho điều này).

Chỉ cần xem hướng dẫn sử dụng PHP cho các chức năng này, tất cả đều có trong đó.

+1

'get_headers()' thực sự sẽ gửi yêu cầu 'GET' trừ khi bạn làm điều này trước: 'stream_context_set_default (array ('http' => mảng ('phương thức' => 'HEAD'))); ' – Octopus

Các vấn đề liên quan