PHP file_get_contents () trả về "không thể mở luồng: Yêu cầu HTTP không thành công!"


91

Tôi đang gặp sự cố khi gọi url từ mã PHP. Tôi cần gọi một dịch vụ bằng chuỗi truy vấn từ mã PHP của mình. Nếu tôi nhập url vào trình duyệt, nó hoạt động tốt, nhưng nếu tôi sử dụng tệp-get-content () để thực hiện cuộc gọi, tôi nhận được:

Cảnh báo: file-get-content (http: // ....) không mở được luồng: Yêu cầu HTTP không thành công! HTTP / 1.1 202 Được chấp nhận trong ...

Mã tôi đang sử dụng là:

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

Như tôi đã nói - gọi từ trình duyệt và nó hoạt động tốt. Bất kỳ đề xuất?

Tôi cũng đã thử với một url khác như:

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

Điều này hoạt động tốt ... có thể là url tôi cần gọi có một giây http://trong đó?

Câu trả lời:


111

Hãy thử sử dụng 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);

?>

10
Đây là cách quá phức tạp khi vấn đề thực sự nằm trong ký hiệu và.
Christian

1
@Christian, bạn có thể nói rõ hơn không?
vonUbisch

4
Không phải ai cũng có (nhưng nên cài đặt) cURL. cURL chắc chắn là nhanh hơn nhiều lần, nhưng đào tạo Quản lý là không chậm một trong hai, và không yêu cầu bạn phải nhớ tất cả các tùy chọn bất cứ khi nào bạn sử dụng nó.
Christian

1
Điều này CURLOPT_USERAGENTrất quan trọng trong trường hợp của tôi, cảm ơn!
emotality

Tôi tin rằng vấn đề của tôi là quá thời gian và điều này đã khắc phục được. Cảm ơn bạn!
evadecaptcha

28

Tôi đã gặp phải lỗi tương tự mà OP đã mắc phải và đây là vấn đề của tôi - khoảng trắng trong các đối số. urlencode()trên các tham số GET đã giải quyết được vấn đề.
Walt W

Nếu bạn không muốn sử dụng giải pháp CURL, giải pháp này hoạt động! Sử dụng URLecnode trên các tham số.
Aaron Gong

Đây là giải pháp thực tế cho vấn đề này.
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 );
    }
}


?>

5
Cảm ơn vì mã, có vẻ như bạn đã lấy nó từ: php.net/manual/en/ref.curl.php Vấn đề chính là lệnh gọi hàm get_urlthực sự phải như vậy get_fcontentvì bạn đã thay đổi tên của chính hàm. Đây thực sự là một lệnh gọi hàm đệ quy cố gắng lấy lại nội dung URL bằng cách thay đổi một số tham số.
SSH này

bạn hiểu rồi! đang cố gắng truy cập https và đã bị từ chối. bạn đã đóng đinh nó. ĐÃ CẬP NHẬT;)
tony gil

21

file_get_contents()sử dụng các trình fopen()bao bọc, do đó nó bị hạn chế truy cập URL thông qua allow_url_fopentùy chọn trong php.ini.

Bạn sẽ cần phải thay đổi php.ini của mình để bật tùy chọn này hoặc sử dụng một phương pháp thay thế, cụ thể là cURL - cho đến nay là cách phổ biến nhất và thành thật mà nói, là cách tiêu chuẩn để hoàn thành những gì bạn đang cố gắng làm.


Đừng bận tâm, chỉ cần nhận thấy rằng anh ấy nói file_get_contents()đã hoạt động trên một URL khác. Tuy nhiên, đây vẫn là một mẹo hay cho những người khác gặp vấn đề này.
Michael Wales

vâng, tôi đã xem xét các tùy chọn khác và thấy rằng cURL là cách tiêu chuẩn để thực hiện nhưng tôi đã thử điều này vì nó dễ dàng hơn và hoạt động với các url khác, tôi nghĩ tôi phải khởi động lại apache để intsall cURL? và không thể tìm ra cách thực hiện điều này (một câu hỏi khác) ... cảm ơn vì phản hồi nhanh của bạn
không xác định

11

Về cơ bản, bạn được yêu cầu gửi một số thông tin với yêu cầu.

Thử cái này,

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

Điều này đã làm việc cho tôi


2
Điều này cũng làm việc cho tôi! Có vẻ như nó cần một tác nhân người dùng
bryan

Nếu url có vẻ được mã hóa đúng cách, đây rất có thể là vấn đề. Một số trang web sẽ hạn chế đối với 'Tác nhân người dùng', có thể là 'Chấp nhận'.
Jahmic

1
câu trả lời siêu. bỏ phiếu cho việc quảng bá cái này lên hàng đầu. tất cả trong php và cũng hoạt động cho yêu cầu https. chỉ cần thêm hai dòng mã. điều gì xảy ra nếu máy chủ chia sẻ cung cấp curl? Điều này rất hữu ích.
ndasusers

9

Tôi nhận thấy rằng URL của bạn có khoảng trắng trong đó. Tôi nghĩ rằng đó thường là một điều xấu. Hãy thử mã hóa URL bằng

$my_url = urlencode("my url");

và sau đó gọi

file_get_contents($my_url);

và xem nếu bạn có may mắn hơn.


4

Tôi gặp sự cố tương tự, tôi đã phân tích cú pháp url youtube. Mã là;

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

Sau đó, tôi nhận ra rằng $this->video_urlbao gồm khoảng trắng. Tôi đã giải quyết điều đó bằng cách sử dụngtrim($this->video_url) .

Có thể nó sẽ giúp được bạn . Chúc may mắn


3

Tôi không chắc về các tham số (mpaction, format), nếu chúng được chỉ định cho trang amazonaws hoặc ##. ##.

Cố gắng urlencode () url.


cảm ơn - đây là các thông số cho phiên bản mediaplug. Nếu tôi urlencode url nó vẫn không hoạt động - tôi nhận được một url rất bị cắt xén do lỗi ... ??
không xác định

Bạn chỉ nên mã hóa chuỗi tham số: "convert format" phải là "convert% 20format" (hoặc cách khác là "convert + format").
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

Tôi gặp một vấn đề tương tự.

Do hết giờ!

Thời gian chờ có thể được chỉ định như thế này:

$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 đó đã khắc phục sự cố của tôi, cảm ơn bạn rất nhiều!
Niggo

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.