2009-03-30 42 views
58

PHPコードからのURLの呼び出しに問題があります。 PHPコードからクエリ文字列を使ってサービスを呼び出す必要があります。ブラウザにURLを入力しても問題ありませんが、ファイル取得コンテンツ()を使用して電話をかけると、次のようになります。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); 

私が言ったように - ブラウザから呼び出し、それが正常に動作します。助言がありますか?

私はまた、別のURLなどを試してみました:これは正常に動作します

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

...それは私が呼び出す必要がURLはその中の二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

実際の問題がアンパサンド内にある場合、これはあまりにも複雑です。 – Christian

+0

@Christian、あなたは詳しく説明できますか? – vonUbisch

+4

誰もがcURLをインストールしているわけではありません。 cURLは何倍も高速ですが、file_get_contentsはそれも遅くなく、いつでもすべてのオプションを覚えておく必要はありません。 – Christian

2

amazonawsページまたは##。##に指定されている場合は、パラメータ(mpaction、format)についてわかりません。

URLにurlencode()を試してください。

+0

感謝を働きました。私はURLをurlencodeすれば、それはまだ動作しません - 私はエラーで非常に文字化けしたURLを取得... ?? – undefined

+0

どのような種類のエラー? urlencodeはURLを無効にしません。 – SilentGhost

+0

"convert format"は "convert%20format"(あるいは "convert + format")でなければなりません。 – bobince

20
+0

私はOPが持っていたのと同じエラーがありました。これは私の問題でした - 引数のスペース。 GETパラメータの 'urlencode()'はこの問題を解決しました。 –

+0

CURLソリューションを使用したくない場合は、これが動作します!パラメータにURLecodeを使用します。 –

+0

Ohhh man thanks alot – Umair

5

私はあなたのURLがそれにスペースを持っていることに気づきます。私は通常それが悪いことだと思う。

file_get_contents($my_url); 

$my_url = urlencode("my url"); 

でURLをコードしてから呼び出してみて、あなたはより良い運を持っているかどうかを確認します。

16

file_get_contents()fopen()ラッパーを使用しているため、php.ini内のallow_url_fopenオプションでURLにアクセスすることはできません。

このオプションを有効にするには、php.iniを変更するか、別の方法(cURL)を使用する必要があります。これは、最も一般的な、正直なところ、あなたがしようとしていることを達成するための標準的な方法です。

+0

Nevermindは、別のURLで働いていた 'file_get_contents()'と言いました。それにもかかわらず、これはまだこの問題を抱えている人にとっては良いヒントです。 –

+0

はい、Iveは他のオプションを見て、cURLが標準的な方法であることを確認しましたが、これは簡単で他のURLと一緒に作業したので、私はintsall cURLにApacheを再起動する必要があると思いますか?これを行う方法を理解できません(別の質問)...あなたの素早い応答のためにありがとう – 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'でなければなりません。関数自体の名前。実際には、いくつかのパラメータを変更してURLの内容を取得しようとする再帰的な関数呼び出しです。 –

+0

あなたはそれを持っています! httpsにしようとしていて、拒否されていた。あなたはそれを釘付けにした。 UPVOTED;) –

2

私はユーチューブのURLを解析され、同様の問題を得ました。コードは次のとおりです。

次に、私は$this->video_urlに空白が含まれていることを認識しています。私はtrim($this->video_url)を使って解決しました。

多分それはあなたを助けるでしょう。グッドラック

-3

あなたは基本的に要求していくつかの情報を送信するために必要とされるこの

file_get_contents($my_url,null,null); 
3

を使用してください。これらはmediaplug例えばのparamsある -

$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

関連する問題