PHP file_get_contents () ส่งคืน“ ล้มเหลวในการเปิดสตรีม: คำขอ HTTP ล้มเหลว!”


91

ฉันมีปัญหาในการเรียก url จากโค้ด PHP ฉันต้องการเรียกใช้บริการโดยใช้สตริงการสืบค้นจากรหัส PHP ของฉัน ถ้าฉันพิมพ์ url ลงในเบราว์เซอร์ก็ใช้ได้ แต่ถ้าฉันใช้ file-get-contents () โทรออกฉันจะได้รับ:

คำเตือน: file-get-contents (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://อยู่ในนั้น?

คำตอบ:


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

ฉันมีข้อผิดพลาดเดียวกันกับที่ OP มีและนี่คือปัญหาของฉัน - ช่องว่างในอาร์กิวเมนต์ urlencode()ในพารามิเตอร์ GET ช่วยแก้ปัญหาได้
Walt W

หากคุณไม่ต้องการใช้โซลูชัน CURL อันนี้ใช้ได้! ใช้ URLecnode กับพารามิเตอร์
Aaron Gong

นี่คือวิธีแก้ปัญหาที่แท้จริงของปัญหานี้
Henrik Petterson

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


?>

6
ขอบคุณสำหรับรหัสดูเหมือนว่าคุณได้มาจาก: php.net/manual/en/ref.curl.phpปัญหาหลักคือการเรียกใช้ฟังก์ชันget_urlควรจะเป็นget_fcontentเพราะคุณเปลี่ยนชื่อของฟังก์ชันเอง นี่คือการเรียกใช้ฟังก์ชันแบบวนซ้ำซึ่งพยายามรับเนื้อหา URL อีกครั้งโดยเปลี่ยนพารามิเตอร์บางอย่าง
SSH

คุณเข้าใจแล้ว! พยายามที่จะ https และถูกปฏิเสธ คุณตอกมัน UPVOTED;)
tony gil

21

file_get_contents()ใช้fopen()Wrapper ดังนั้นจึงถูก จำกัด ไม่ให้เข้าถึง URL ผ่านทางallow_url_fopenตัวเลือกภายใน php.ini

คุณอาจจะต้องเปลี่ยน php.ini ของคุณเพื่อเปิดใช้งานตัวเลือกนี้หรือใช้วิธีอื่นนั่นคือcURLซึ่งเป็นวิธีที่ได้รับความนิยมมากที่สุดและตามความจริงแล้วเป็นวิธีมาตรฐานในการบรรลุสิ่งที่คุณพยายามทำ


ไม่เป็นไรเพิ่งสังเกตว่าเขาบอกว่าfile_get_contents()ทำงานกับ URL อื่น อย่างไรก็ตามนี่ยังคงเป็นเคล็ดลับที่ดีสำหรับผู้อื่นที่มีปัญหานี้
Michael Wales

ใช่ฉันได้ดูตัวเลือกอื่น ๆ และเห็นว่า cURL เป็นวิธีมาตรฐานที่จะไป แต่ฉันลองแล้วเพราะมันง่ายกว่าและทำงานกับ URL อื่นฉันคิดว่าฉันต้องรีสตาร์ท apache เพื่อ intsall cURL หรือไม่? และคิดไม่ออกว่าจะทำอย่างไร (อีกคำถาม) ... ขอบคุณสำหรับการตอบกลับอย่างรวดเร็วของคุณ
undefined

11

ฉันสังเกตเห็นว่า URL ของคุณมีช่องว่างอยู่ ฉันคิดว่ามักจะเป็นสิ่งที่ไม่ดี ลองเข้ารหัส URL ด้วย

$my_url = urlencode("my url");

แล้วโทร

file_get_contents($my_url);

และดูว่าคุณมีโชคดีขึ้นหรือไม่


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 ดูเหมือนเข้ารหัสอย่างถูกต้องนี่อาจเป็นปัญหาได้ บางไซต์จะ จำกัด เฉพาะ 'User-Agent' บางทีอาจเป็น 'Accept' ด้วย
Jahmic

1
คำตอบสุดยอด โหวตให้คนนี้ไปด้านบน ทั้งหมดใน php และทำงานสำหรับคำขอ https ด้วย โค้ดพิเศษสองบรรทัด จะเกิดอะไรขึ้นถ้าเซิร์ฟเวอร์ที่ใช้ร่วมกันให้ curl? สิ่งนี้มีประโยชน์มาก
ndasusers

4

ฉันพบปัญหาที่คล้ายกันฉันแยกวิเคราะห์ URL ของ youtube รหัสคือ;

$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

ฉันไม่แน่ใจเกี่ยวกับพารามิเตอร์ (mpaction, format) ว่ามีการระบุไว้สำหรับหน้า amazonaws หรือ ##. ##.

พยายามurlencode () url


ขอบคุณ - นี่คือพารามิเตอร์สำหรับอินสแตนซ์ mediaplug ถ้าฉัน urlencode URL มันยังใช้ไม่ได้ - ฉันได้รับ url ที่อ่านไม่ออกในข้อผิดพลาด ... ??
ไม่ได้กำหนด

คุณควรเข้ารหัสเฉพาะสตริงพารามิเตอร์: "แปลงรูปแบบ" ควรเป็น "convert% 20format" (หรืออีกทางเลือกหนึ่งคือ "convert + format")
bobince


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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.