PHP file_get_contents () और अनुरोध हेडर सेट करें


121

PHP के साथ, क्या HTTP हेडर भेजना संभव है file_get_contents()?

मुझे पता है कि आप अपनी php.iniफ़ाइल से उपयोगकर्ता एजेंट भेज सकते हैं । हालांकि, अगर आप भी इस तरह के रूप में अन्य जानकारी भेज सकते हैं HTTP_ACCEPT, HTTP_ACCEPT_LANGUAGEऔर HTTP_CONNECTIONसाथ file_get_contents()?

या कोई और कार्य है जो इसे पूरा करेगा?

जवाबों:


319

दरअसल, file_get_contents()समारोह में आगे पढ़ने पर :

// 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);

आप इस पैटर्न का पालन करने में सक्षम हो सकते हैं जिसे आप प्राप्त करना चाहते हैं, हालांकि मैंने व्यक्तिगत रूप से इसका परीक्षण नहीं किया है। (और अगर यह काम नहीं करता है, तो मेरे अन्य उत्तर की जांच करने के लिए स्वतंत्र महसूस करें)


1
यह भी देखें: docs.php.net/context और docs.php.net/stream_context_create
VolkerK

18
इस पेज पर इसका एकमात्र उपयोगी उत्तर है
गॉर्डन

9
मैं चाहता हूं कि यहां के और अधिक लोग इस सवाल का वास्तविक जवाब दें, बजाय केवल cURL पेज को इंगित करने के। धन्यवाद।
मेरिजिन

3
अचानक उत्सुक: डिफ़ॉल्ट उपयोगकर्ता एजेंट क्या है file_get_contents()? क्या यह एक निर्दिष्ट करता है?
रैप्टर

5
@Raptor user-agent.me ini_set('user_agent', 'SomeBrowser v42.0.4711');पर जाएं और वहां से अपनी कॉपी करें .. या php.ini को इसे विश्व स्तर पर बदलने के लिए संपादित करें
jaggedsoft

88

यहाँ मेरे लिए काम किया है (डोमिनिक सिर्फ एक लाइन छोटा था)।

$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
आपको किसी ब्राउज़र के उपयोगकर्ता एजेंट को प्रतिरूपण नहीं करना चाहिए। इसके बजाय, अपने टूल के लिए एक यूजर-एजेंट स्ट्रिंग बनाएं। www-archive.mozilla.org/build/revised-user-agent-strings.html प्रारूप के बारे में कुछ विचार दे सकता है।
डेरेकसन

1
@ मुझे लगता है कि यह कुछ परिस्थितियों में दोनों तरह से काम कर सकता है। एजेंट हेडर को उस तरह सेट करना, जैसा कि एक स्ट्रिंग के रूप में, मेरे मामले में काम किया (WAF पास करने के लिए अनुरोध के लिए गैर खाली उपयोगकर्ता एजेंट की आवश्यकता है)
dhaupin

3
@Vince PHP डॉक्स बताता है कि दोनों का उपयोग किया जा सकता है और "उपयोगकर्ता-एजेंट" सरणी तत्व headerको ओवरराइड करेगा user_agent, यदि दोनों निर्दिष्ट हैं।
19

नोट: कभी भी एकल वर्णों का उपयोग न करें जिसमें विशेष वर्णों जैसे \ n या \ r के तार हों। PHP उन्हें सही ढंग से व्याख्या नहीं करेगा और हेडर भेजने के मामले में, आपके हेडर सही तरीके से नहीं भेजे जाएंगे।
अका ३

1
@ सबसे आसान "YourTool / 1.0.0" हो सकता है। जब आप एक नया संस्करण जारी करते हैं, तो आप उपयोगकर्ता-एजेंट संस्करण को भी टक्कर दे सकते हैं, "YourTool / 1.3.5"।
डेरेकॉन

39

आप file_get_contents()फ़ंक्शन के बाद प्रतिक्रिया हेडर प्राप्त करने के लिए इस चर का उपयोग कर सकते हैं ।

कोड:

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

आउटपुट:

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
यह प्रश्न का उत्तर नहीं देता है।
गॉर्डन

32
शायद नहीं, लेकिन यह शीर्षक में निहित विपरीत प्रश्न का उत्तर देता है, जो कि file_get_contents से प्रतिक्रिया शीर्षलेखों को पढ़ना है। और यह वह जगह है जहाँ Google भूमि की जाँच करते हैं।
रिच रेमर

0

हाँ।

file_get_contentsURL पर कॉल करते समय, किसी को stream_create_contextफ़ंक्शन का उपयोग करना चाहिए , जो कि php.net पर काफी अच्छी तरह से प्रलेखित है।

यह उपयोगकर्ता कमेंट सेक्शन में php.net पर अगले पेज पर कमोबेश सटीक रूप से कवर किया गया है: http://php.net/manual/en/function.stream-context-create.php


-1

Php cURL पुस्तकालयों का उपयोग करना संभवतः जाने का सही तरीका होगा, क्योंकि इस पुस्तकालय में सरल से अधिक विशेषताएं हैं file_get_contents(...)

एक उदाहरण:

<?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
आपके द्वारा दिखाए जाने वाले स्निपेट के साथ-साथ प्राप्त करना आसान है file_get_contentsऔर मुझे अभी तक एक उपयोग केस में आना बाकी है जिसे आप केवल cURL के साथ प्राप्त कर सकते हैं।
गॉर्डन

-1

यदि आपको HTTPS की आवश्यकता नहीं है और कर्ल आपके सिस्टम पर उपलब्ध नहीं है जिसका आप उपयोग कर सकते हैं fsockopen

यह फ़ंक्शन एक कनेक्शन खोलता है जिसमें से आप पढ़ और लिख सकते हैं जैसे आप एक सामान्य फ़ाइल हैंडल के साथ करेंगे।


2
हां, लेकिन इसका मतलब यह भी होगा कि ओपी को HTTP प्रोटोकॉल को हाथ से लागू करना होगा। इसके अलावा, ओपी ने विकल्पों के बारे में नहीं पूछा, file_get_contentsइसलिए यह कुछ हद तक एक विषय का जवाब है।
गॉर्डन

-3

दुर्भाग्य से, ऐसा नहीं लगता है कि file_get_contents()वास्तव में नियंत्रण की डिग्री प्रदान करता है। CURL एक्सटेंशन आमतौर पर आने वाला पहला है, लेकिन मैं बहुत सरल और सीधे HTTP अनुरोधों के लिए PECL_HTTP एक्सटेंशन ( http://pecl.php.net/package/pecl_http ) की अत्यधिक अनुशंसा करूंगा । (यह cURL की तुलना में काम करना बहुत आसान है)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.