PHP file_get_contents () रिटर्न "स्ट्रीम खोलने में विफल: HTTP अनुरोध विफल!"


91

मुझे PHP कोड से एक url कॉल करने में समस्या हो रही है। मुझे अपने PHP कोड से एक क्वेरी स्ट्रिंग का उपयोग करके एक सेवा को कॉल करने की आवश्यकता है। यदि मैं किसी ब्राउज़र में url टाइप करता हूं, तो यह ठीक काम करता है, लेकिन यदि मैं कॉल करने के लिए फ़ाइल-प्राप्त सामग्री () का उपयोग करता हूं, तो मैं:

चेतावनी: फ़ाइल-प्राप्त सामग्री (http: // ....) स्ट्रीम खोलने में विफल: HTTP अनुरोध विफल! HTTP / 1.1 202 स्वीकृत ...

मैं जो कोड उपयोग कर रहा हूं वह है:

$query=file_get_contents('http://###.##.##.##/mp/get?mpsrc=http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv');
echo($query);

जैसा मैंने कहा - ब्राउज़र से कॉल करें और यह ठीक काम करता है। कोई सुझाव?

मैंने एक और यूआरएल के साथ भी कोशिश की है जैसे:

$query=file_get_contents('http://www.youtube.com/watch?v=XiFrfeJ8dKM');

यह ठीक काम करता है ... क्या यह हो सकता है कि मुझे कॉल करने के लिए उरेल में एक दूसरा http://है?

जवाबों:


111

CURL का उपयोग करके देखें।

<?php

$curl_handle=curl_init();
curl_setopt($curl_handle, CURLOPT_URL,'http://###.##.##.##/mp/get?mpsrc=http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv');
curl_setopt($curl_handle, CURLOPT_CONNECTTIMEOUT, 2);
curl_setopt($curl_handle, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl_handle, CURLOPT_USERAGENT, 'Your application name');
$query = curl_exec($curl_handle);
curl_close($curl_handle);

?>

11
यह तरीका बहुत जटिल है जब वास्तविक समस्या एम्परसेंड्स के भीतर होती है।
क्रिश्चियन

1
@ क्रिसियन, क्या आप विस्तृत कर सकते हैं?
vonUbisch

4
हर किसी के पास (लेकिन हालांकि नहीं होना चाहिए) cURL स्थापित है। यकीन है कि कई बार तेजी से होता है, लेकिन file_get_contents वह भी धीमा नहीं है , और आपको जब भी आप इसका उपयोग करते हैं, तो आपको सभी विकल्पों को याद रखने की आवश्यकता नहीं है।
क्रिश्चियन

1
यह CURLOPT_USERAGENTमेरे मामले में बहुत महत्वपूर्ण था, धन्यवाद!
भावुकता

मेरा मानना ​​है कि मेरी समस्या इसके साथ समयावधि थी और इसने इसे ठीक किया। धन्यवाद!
evadecaptcha

28

मुझे ओपी में वही त्रुटि थी, और यह मेरी समस्या थी - तर्कों में रिक्त स्थान। urlencode()GET पैरामीटर पर समस्या हल हो गई।
वॉल्ट डब्ल्यू

यदि आप CURL समाधान का उपयोग नहीं करना चाहते हैं, तो यह एक काम करता है! मापदंडों पर URLecnode का उपयोग करें।
एरोन गोंग

यही इस समस्या का वास्तविक समाधान है।
हेनरिक पेटर्सन

23
<?php

$lurl=get_fcontent("http://ip2.cc/?api=cname&ip=84.228.229.81");
echo"cid:".$lurl[0]."<BR>";


function get_fcontent( $url,  $javascript_loop = 0, $timeout = 5 ) {
    $url = str_replace( "&amp;", "&", urldecode(trim($url)) );

    $cookie = tempnam ("/tmp", "CURLCOOKIE");
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_USERAGENT, "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1" );
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_COOKIEJAR, $cookie );
    curl_setopt( $ch, CURLOPT_FOLLOWLOCATION, true );
    curl_setopt( $ch, CURLOPT_ENCODING, "" );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    curl_setopt( $ch, CURLOPT_AUTOREFERER, true );
    curl_setopt( $ch, CURLOPT_SSL_VERIFYPEER, false );    # required for https urls
    curl_setopt( $ch, CURLOPT_CONNECTTIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_TIMEOUT, $timeout );
    curl_setopt( $ch, CURLOPT_MAXREDIRS, 10 );
    $content = curl_exec( $ch );
    $response = curl_getinfo( $ch );
    curl_close ( $ch );

    if ($response['http_code'] == 301 || $response['http_code'] == 302) {
        ini_set("user_agent", "Mozilla/5.0 (Windows; U; Windows NT 5.1; rv:1.7.3) Gecko/20041001 Firefox/0.10.1");

        if ( $headers = get_headers($response['url']) ) {
            foreach( $headers as $value ) {
                if ( substr( strtolower($value), 0, 9 ) == "location:" )
                    return get_url( trim( substr( $value, 9, strlen($value) ) ) );
            }
        }
    }

    if (    ( preg_match("/>[[:space:]]+window\.location\.replace\('(.*)'\)/i", $content, $value) || preg_match("/>[[:space:]]+window\.location\=\"(.*)\"/i", $content, $value) ) && $javascript_loop < 5) {
        return get_url( $value[1], $javascript_loop+1 );
    } else {
        return array( $content, $response );
    }
}


?>

5
कोड के लिए धन्यवाद, ऐसा लगता है कि आपको यह मिल गया है: php.net/manual/en/ref.curl.php मुख्य समस्या यह है कि फ़ंक्शन कॉल get_urlवास्तव में होनी चाहिए get_fcontentक्योंकि आपने फ़ंक्शन का नाम ही बदल दिया है। यह वास्तव में एक पुनरावर्ती फ़ंक्शन कॉल है जो कुछ मापदंडों को बदलकर URL सामग्री प्राप्त करने का पुन: प्रयास करता है।
एसएसएच इस

आपको यह मिला! https की कोशिश कर रहा था और ठुकरा दिया जा रहा था। आप इसे किसी न किसी। UPVOTED;)
tony gil

21

file_get_contents()fopen()रैपर का उपयोग करता है , इसलिए यह allow_url_fopenphp.ini के विकल्प के माध्यम से यूआरएल तक पहुँचने से प्रतिबंधित है ।

आपको या तो इस विकल्प को चालू करने के लिए अपने php.ini को बदलना होगा या वैकल्पिक विधि का उपयोग करना होगा, अर्थात् cURL - अब तक का सबसे लोकप्रिय और, जो आप करने की कोशिश कर रहे हैं, उसे पूरा करने के लिए ईमानदार, मानक तरीका।


कोई बात नहीं, सिर्फ उन्होंने कहा कि file_get_contents()एक अलग URL पर काम किया। बहरहाल, इस मुद्दे पर दूसरों के लिए यह अभी भी एक अच्छा सुझाव है।
माइकल वेल्स

हां, Ive ने अन्य विकल्पों पर ध्यान दिया और देखा कि cURL जाने का मानक तरीका है लेकिन मैंने यह कोशिश की क्योंकि यह आसान था और अन्य यूआरएल के साथ काम किया, मुझे लगता है कि मुझे intsall cURL में अपाचे को फिर से शुरू करना होगा? और यह कैसे (एक और सवाल) करने के लिए पता नहीं कर सकते ... आपकी त्वरित प्रतिक्रिया के लिए धन्यवाद
अपरिचित

11

आपको मूल रूप से अनुरोध के साथ कुछ जानकारी भेजने की आवश्यकता होती है।

इसे इस्तेमाल करे,

$opts = array('http'=>array('header' => "User-Agent:MyAgent/1.0\r\n")); 
//Basically adding headers to the request
$context = stream_context_create($opts);
$html = file_get_contents($url,false,$context);
$html = htmlspecialchars($html);

इसने मेरे लिए काम किया


2
यह मेरे लिए भी काम किया! ऐसा लगता है कि इसे एक यूजर एजेंट की जरूरत है
bryan

यदि url ठीक से एन्कोडेड लगता है, तो यह बहुत अच्छा मुद्दा हो सकता है। कुछ साइट 'उपयोगकर्ता-एजेंट', शायद 'स्वीकार' पर भी रोक लगाएंगी।
जहमीम

1
सुपर जवाब। इस एक को बढ़ावा देने के लिए मतदान करें। सभी php में और https अनुरोध के लिए भी काम किया। सिर्फ दो अतिरिक्त लाइनें कोड। क्या होगा अगर साझा सर्वर कर्ल प्रदान करता है? यह बहुत मददगार है।
ndasusers

10

मैंने देखा कि आपके URL में जगह है। मुझे लगता है कि आमतौर पर एक बुरी चीज है। URL को एन्‍कोड करने का प्रयास करें

$my_url = urlencode("my url");

और फिर कॉलिंग

file_get_contents($my_url);

और देखें कि क्या आपके पास बेहतर भाग्य है।


4

मुझे इसी तरह की समस्या हुई, मैंने youtube url को पार्स किया। कोड है;

$json_is = "http://gdata.youtube.com/feeds/api/videos?q=".$this->video_url."&max-results=1&alt=json";
$video_info = json_decode ( file_get_contents ( $json_is ), true );     
$video_title = is_array ( $video_info ) ? $video_info ['feed'] ['entry'] [0] ['title'] ['$t'] : '';

तब मुझे पता चलता है कि $this->video_urlव्हाट्सएप शामिल है। मैंने उस प्रयोग को हल किया trim($this->video_url)

शायद यह आपकी मदद करेगा। शुभ लाभ


3

यदि मैं amazonaws पृष्ठ या # # # # के लिए निर्दिष्ट किया जाता है, तो मैं मापदंडों (mpaction, प्रारूप) के बारे में निश्चित नहीं हूं।

Urlencode () url करने का प्रयास करें ।


धन्यवाद - ये मीडियाप्लग उदाहरण के लिए परम हैं। अगर मैं urlencode url यह अभी भी काम नहीं करता है - मैं त्रुटि में बहुत विकृत url प्राप्त करता हूँ ... ??
अपरिभाषित

आपको केवल पैरामीटर स्ट्रिंग को एन्कोडिंग किया जाना चाहिए: "कन्वर्ट फॉर्मेट" "% 20format कन्वर्ट करें" (या वैकल्पिक रूप से "कन्वर्ट + फॉर्मेट") होना चाहिए।
बोबिन्स

2
$query=file_get_contents('http://###.##.##.##/mp/get?' . http_build_query(array('mpsrc' => 'http://mybucket.s3.amazonaws.com/11111.mpg&mpaction=convert format=flv')));

2

मुझे भी इसी तरह की समस्या हुई।

समय समाप्त होने के कारण!

टाइमआउट को इस तरह इंगित किया जा सकता है:

$options = array(
    'http' => array(
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'method'  => "POST",
        'content' => http_build_query($data2),
        'timeout' => 30,
    ),
);
$context = stream_context_create($options); $retour =
$retour = @file_get_contents("http://xxxxx.xxx/xxxx", false, $context);

योग्य है कि मेरी समस्या तय की, बहुत बहुत धन्यवाद!
निगो

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