PHP file_get_contents (), "akış açılamadı: HTTP isteği başarısız oldu!"


91

PHP kodundan bir url çağırırken sorun yaşıyorum. PHP kodumdan bir sorgu dizesi kullanarak bir hizmeti çağırmam gerekiyor. URL'yi bir tarayıcıya yazarsam, sorunsuz çalışır, ancak aramayı yapmak için file-get-content () kullanırsam şunu alırım:

Uyarı: file-get-content (http: // ....) akışı açamadı: HTTP isteği başarısız oldu! HTTP / 1.1 202 Kabul edildi ...

Kullandığım kod:

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

Dediğim gibi - tarayıcıdan arayın ve iyi çalışıyor. Herhangi bir öneri?

Ayrıca başka bir url ile denedim:

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

Bu iyi çalışıyor ... aramam gereken url'de bir saniye http://olabilir mi?

Yanıtlar:


111

CURL kullanmayı deneyin.

<?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
Gerçek sorun "ve" işaretleri arasında olduğunda bu çok karmaşıktır.
Christian

1
@Christian, detaylandırır mısın?
vonUbisch

4
Herkes cURL'ye sahip değil (ama yüklenmeli). cURL pek çok kez daha hızlıdır, ancak file_get_contents da o kadar yavaş değildir ve her kullandığınızda tüm seçenekleri hatırlamanızı gerektirmez.
Christian

1
Bu CURLOPT_USERAGENTbenim durumumda çok önemliydi, teşekkürler!
emotality

Sanırım sorunum zaman aşımına uğradı ve bu sorunu çözdü. Teşekkür ederim!
evadecaptcha


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
Kod için teşekkürler, onu şu adresten almışsınız gibi görünüyor: php.net/manual/en/ref.curl.php Asıl sorun, işlev çağrısının get_urlaslında get_fcontentişlevin adını değiştirdiğinizden beri olması gerektiğidir . Bu aslında, bazı parametreleri değiştirerek URL içeriklerini yeniden almaya çalışan özyinelemeli bir işlev çağrısıdır.
SSH Bu

anladın! https yapmaya çalışıyordu ve reddediliyordu. başardın. YÜKSELTİLDİ;)
tony gil

21

file_get_contents()fopen()sarmalayıcıları kullanır , bu nedenle allow_url_fopenphp.ini içerisindeki seçenekle URL'lere erişimi kısıtlanır .

Ya bu seçeneği açmak için php.ini'nizi değiştirmeniz gerekecek ya da alternatif bir yöntem, yani cURL - en popüler ve dürüst olmak gerekirse, yapmaya çalıştığınız şeyi başarmanın standart yolu.


Boşver, sadece file_get_contents()farklı bir URL üzerinde çalıştığını söylediğini fark ettim . Bununla birlikte, bu sorunu yaşayanlar için bu hala iyi bir ipucu.
Michael Wales

evet, diğer seçeneklere baktım ve cURL'nin gitmenin standart yolu olduğunu gördüm, ancak bunu daha kolay olduğu ve diğer url'lerle çalıştığı için denedim, sanırım apache'yi intsall cURL'ye yeniden başlatmam gerekiyor? ve bunun nasıl yapılacağını çözemiyorum (başka bir soru) ... hızlı cevabınız için teşekkürler
tanımsız

11

Temel olarak taleple birlikte bazı bilgiler göndermeniz gerekir.

Bunu dene,

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

Bu benim için çalıştı


2
Bu benim için de çalıştı! Bir kullanıcı aracısına ihtiyacı var gibi görünüyor
bryan

URL doğru şekilde kodlanmış görünüyorsa, sorun bu olabilir. Bazı siteler 'Kullanıcı-Aracı' ile kısıtlanır, belki 'Kabul Et' de.
Jahmic

1
süper cevap. bunu zirveye çıkarmak için oy verin. hepsi php'de ve https isteği için de çalıştı. sadece iki ekstra satır kodu. paylaşılan sunucu curl sağlıyorsa ne olur? bu çok yardımcı.
ndasusers

10

URL'nizin içinde boşluklar olduğunu fark ettim. Bunun genellikle kötü bir şey olduğunu düşünüyorum. URL'yi şununla kodlamayı deneyin:

$my_url = urlencode("my url");

ve sonra arıyor

file_get_contents($my_url);

ve daha iyi şansın olup olmadığına bak.


4

Benzer bir sorunla karşılaştım, youtube URL'sini çözümledim. Kod;

$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'] : '';

Sonra $this->video_urlbunun beyaz boşluğu da içerdiğini fark ettim . Bunu kullanarak çözdüm trim($this->video_url).

Belki sana yardımcı olur. İyi şanslar


3

Amazonaws sayfası için mi yoksa ##. ## için mi belirtilmişse, parametrelerden (mpaction, format) emin değilim.

URL'yi urllencode () yapmayı deneyin .


teşekkürler - bunlar mediaplug örneği için parametrelerdir. URL'yi url kodluyorsam hala çalışmıyor - Hatada çok bozuk bir url alıyorum ... ??
tanımsız

Yalnızca parametre dizesini kodlamalısınız: "convert format", "convert% 20format" (veya alternatif olarak "convert + format") olmalıdır.
bobince

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

Benzer bir problemim var.

Zaman aşımı nedeniyle!

Zaman aşımı şu şekilde gösterilebilir:

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

lol bu sorunumu çözdü, çok teşekkür ederim!
Niggo

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.