2009-03-30 11 views
58

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

चेतावनी: फ़ाइल-मिल-सामग्री (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:// उस में है?

उत्तर

85

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

?> 
+4

यह समस्या बहुत जटिल है जब वास्तविक समस्या ampersands के भीतर होती है। – Christian

+0

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

+4

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

2

मुझे पैरामीटर (एमपीएक्शन, प्रारूप) के बारे में निश्चित नहीं है, अगर वे अमेज़ॅन पेज या ## ## के लिए निर्दिष्ट हैं।

यूआरएल urlencode() पर आज़माएं।

+0

धन्यवाद मेरे लिए बाहर काम किया - इन mediaplug उदाहरण के लिए पैरामीटर हैं। अगर मैं url को urlencode करता हूं तो यह अभी भी काम नहीं करता है - मुझे त्रुटि में बहुत गड़बड़ यूआरएल मिलता है ... ?? – undefined

+0

किस तरह की त्रुटि? urlencode यूआरएल garble नहीं है। – SilentGhost

+0

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

20

क्या यह आपकी समस्या हो सकती है?

Note: If you're opening a URI with special characters, such as spaces, you need to encode the URI with urlencode().

+0

मुझे ओपी की एक ही त्रुटि थी, और यह मेरी समस्या थी - तर्कों में रिक्त स्थान। जीईटी पैरामीटर पर 'urlencode() 'मुद्दा हल किया। –

+0

यदि आप कर्ल समाधान का उपयोग नहीं करना चाहते हैं, तो यह काम करता है! पैरामीटर पर URLecnode का प्रयोग करें। –

+0

ओहह आदमी बहुत बहुत धन्यवाद – Umair

5

मुझे लगता है कि अपने URL उस में रिक्त स्थान है नोटिस। मुझे लगता है कि आमतौर पर एक बुरी बात है।

$my_url = urlencode("my url"); 

साथ यूआरएल एन्कोडिंग और फिर बुला

file_get_contents($my_url); 

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

16

file_get_contents()fopen() रैपर का उपयोग करता है, इसलिए यह php.ini के भीतर allow_url_fopen विकल्प के माध्यम से URL तक पहुंचने से प्रतिबंधित है।

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

+0

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

+0

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

19
<?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

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

+0

आपको मिल गया! https की कोशिश कर रहा था और बंद हो रहा था। आप इसे किसी न किसी। नवीनीकृत;) –

2

मैं एक ऐसी ही समस्या है, मैं यूट्यूब यूआरएल पार्स। कोड है;

$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

उपयोग इस

file_get_contents($my_url,null,null); 
3

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

इस प्रयास करें,

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

यह

+1

यह मेरे लिए भी काम करता है! ऐसा लगता है कि इसे उपयोगकर्ता एजेंट – bryan

+1

की आवश्यकता है यह मेरे लिए भी काम करता है, धन्यवाद! – Fwolf

संबंधित मुद्दे