PHP file_get_contents () và thiết lập tiêu đề yêu cầu


121

Với PHP, có thể gửi tiêu đề HTTP bằng file_get_contents()không?

Tôi biết bạn có thể gửi tác nhân người dùng từ php.initệp của bạn . Tuy nhiên, bạn cũng có thể gửi các thông tin khác như HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEHTTP_CONNECTIONvới file_get_contents()?

Hoặc là có một chức năng khác sẽ thực hiện điều này?

Câu trả lời:


319

Trên thực tế, khi đọc thêm về file_get_contents()hàm:

// Create a stream
$opts = [
    "http" => [
        "method" => "GET",
        "header" => "Accept-language: en\r\n" .
            "Cookie: foo=bar\r\n"
    ]
];

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$file = file_get_contents('http://www.example.com/', false, $context);

Bạn có thể làm theo mô hình này để đạt được những gì bạn đang tìm kiếm, cá nhân tôi chưa thử nghiệm điều này. (và nếu nó không hoạt động, vui lòng xem câu trả lời khác của tôi)



18
này là câu trả lời duy nhất hữu ích trên trang này
Gordon

9
Tôi ước nhiều người ở đây sẽ đưa ra câu trả lời thực sự cho câu hỏi này thay vì chỉ trỏ vào trang cURL. Cảm ơn.
Merijn 17/12/12

3
đột nhiên tò mò: tác nhân người dùng mặc định của là file_get_contents()gì? nó chỉ định một?
Raptor

5
@Raptor ini_set('user_agent', 'SomeBrowser v42.0.4711');đi đến user-agent.me và sao chép của bạn từ đó .. hoặc chỉnh sửa php.ini để thay đổi nó trên toàn cầu
jaggedsoft

88

Đây là những gì đã làm việc cho tôi (Dominic chỉ ngắn một dòng).

$url = "";

$options = array(
  'http'=>array(
    'method'=>"GET",
    'header'=>"Accept-language: en\r\n" .
              "Cookie: foo=bar\r\n" .  // check function.stream-context-create on php.net
              "User-Agent: Mozilla/5.0 (iPad; U; CPU OS 3_2 like Mac OS X; en-us) AppleWebKit/531.21.10 (KHTML, like Gecko) Version/4.0.4 Mobile/7B334b Safari/531.21.102011-10-16 20:23:10\r\n" // i.e. An iPad 
  )
);

$context = stream_context_create($options);
$file = file_get_contents($url, false, $context);

6
Bạn không nên mạo danh tác nhân người dùng của trình duyệt. Thay vào đó, hãy tạo chuỗi Tác nhân người dùng cho công cụ của bạn. www-archive.mozilla.org/build/revised-user-agent-strings.html có thể đưa ra một số ý tưởng về định dạng.
Dereckson

1
@Vì tôi nghĩ rằng nó có thể hoạt động theo cả hai cách trong một số trường hợp nhất định. Thiết lập các tiêu đề đại lý như vậy, như là một chuỗi, làm việc trong trường hợp của tôi (WAF cần user agent trống không cho yêu cầu để vượt qua)
dhaupin

3
@Vince Tài liệu PHP nói rằng cả hai đều có thể được sử dụng và "Tác nhân người dùng" headersẽ ghi đè user_agentphần tử mảng, nếu cả hai đều được chỉ định.
MrWhite

LƯU Ý: Không bao giờ sử dụng các dấu ngoặc kép với các chuỗi chứa các ký tự đặc biệt như \ n hoặc \ r. PHP sẽ không diễn giải chúng một cách chính xác và trong trường hợp gửi tiêu đề, tiêu đề của bạn sẽ không được gửi chính xác.
ak93,

1
@Fanky đơn giản nhất có thể là "YourTool / 1.0.0". Khi bạn phát hành phiên bản mới, bạn cũng có thể thay đổi phiên bản tác nhân người dùng, "YourTool / 1.3.5".
Dereckson

39

Bạn có thể sử dụng biến này để truy xuất các tiêu đề phản hồi sau file_get_contents()hàm.

Mã:

  file_get_contents("http://example.com");
  var_dump($http_response_header);

Đầu ra:

array(9) {
  [0]=>
  string(15) "HTTP/1.1 200 OK"
  [1]=>
  string(35) "Date: Sat, 12 Apr 2008 17:30:38 GMT"
  [2]=>
  string(29) "Server: Apache/2.2.3 (CentOS)"
  [3]=>
  string(44) "Last-Modified: Tue, 15 Nov 2005 13:24:10 GMT"
  [4]=>
  string(27) "ETag: "280100-1b6-80bfd280""
  [5]=>
  string(20) "Accept-Ranges: bytes"
  [6]=>
  string(19) "Content-Length: 438"
  [7]=>
  string(17) "Connection: close"
  [8]=>
  string(38) "Content-Type: text/html; charset=UTF-8"
}

6
điều này không trả lời câu hỏi nào cả.
Gordon

32
Có thể không, nhưng nó trả lời câu hỏi ngược lại được ngụ ý trong tiêu đề, đó là cách đọc tiêu đề phản hồi từ file_get_contents. Và đây là nơi Google tiếp cận khi điều tra câu hỏi ĐÓ.
Rich Remer vào

0

Đúng.

Khi gọi file_get_contentsmột URL, người ta nên sử dụng stream_create_contexthàm, được ghi lại khá đầy đủ trên php.net.

Điều này ít nhiều được đề cập chính xác trên trang sau tại php.net trong phần nhận xét của người dùng: http://php.net/manual/en/ Chức năng.stream-context-create.php


-1

Sử dụng thư viện cURL php có lẽ sẽ là cách phù hợp để sử dụng, vì thư viện này có nhiều tính năng hơn là đơn giản file_get_contents(...).

Một ví dụ:

<?php
$ch = curl_init();
$headers = array('HTTP_ACCEPT: Something', 'HTTP_ACCEPT_LANGUAGE: fr, en, da, nl', 'HTTP_CONNECTION: Something');

curl_setopt($ch, CURLOPT_URL, "http://localhost"); # URL to post to
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1 ); # return into a variable
curl_setopt($ch, CURLOPT_HTTPHEADER, $header ); # custom headers, see above
$result = curl_exec( $ch ); # run!
curl_close($ch);
?>

5
Đoạn mã bạn hiển thị cũng rất dễ đạt được file_get_contentsvà tôi vẫn chưa gặp Trường hợp sử dụng mà bạn chỉ có thể đạt được với cURL.
Gordon

-1

Nếu bạn không cần HTTPS và curl không có sẵn trên hệ thống của bạn, bạn có thể sử dụng fsockopen

Chức năng này mở ra một kết nối mà từ đó bạn có thể vừa đọc vừa ghi như cách bạn làm với một tay cầm tệp thông thường.


2
có, nhưng nó cũng có nghĩa là OP phải thực hiện giao thức HTTP bằng tay. Ngoài ra, OP đã không hỏi về các lựa chọn thay thế file_get_contentsnên đây là một câu trả lời hơi lạc đề.
Gordon

-3

Thật không may, có vẻ như nó không file_get_contents()thực sự cung cấp mức độ kiểm soát đó. Phần mở rộng cURL thường là phần mở rộng đầu tiên xuất hiện, nhưng tôi thực sự khuyên bạn nên sử dụng phần mở rộng PECL_HTTP ( http://pecl.php.net/package/pecl_http ) cho các yêu cầu HTTP rất đơn giản và dễ hiểu. (nó dễ làm việc hơn nhiều so với cURL)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.