PHP file_get_contents ()가 "스트림 열기 실패 : HTTP 요청 실패!"를 반환합니다.


91

PHP 코드에서 URL을 호출하는 데 문제가 있습니다. 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
실제 문제가 앰퍼샌드 내에있을 때 이것은 너무 복잡합니다.
Christian

1
@Christian, 자세히 설명해 주시겠습니까?
vonUbisch

4
모든 사람이 cURL을 설치 한 것은 아닙니다. cURL은 확실히 여러 배 빠르지 만 file_get_contents도 그렇게 느리지 않으며 사용할 때마다 모든 옵션을 기억할 필요가 없습니다.
Christian

1
이것은 CURLOPT_USERAGENT제 경우에 매우 중요했습니다. 감사합니다!
emotality

내 문제가 시간 초과로 인해 해결되었다고 생각합니다. 감사합니다!
evadecaptcha

28

나는 OP와 같은 오류가 있었고 이것이 내 문제였습니다-인수의 공백. urlencode()GET 매개 변수에 대한 문제가 해결되었습니다.
Walt W

CURL 솔루션을 사용하지 않으려면이 솔루션이 작동합니다! 매개 변수에 URLecnode를 사용하십시오.
아론 공

이것이이 문제에 대한 실제 해결책입니다.
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
코드를 보내 주셔서 감사합니다. php.net/manual/en/ref.curl.php 주요 문제는 함수 자체의 이름을 변경했기 때문에 get_url실제로 함수 호출이 발생 해야한다는 get_fcontent것입니다. 이것은 실제로 일부 매개 변수를 변경하여 URL 내용을 가져 오려고 다시 시도하는 재귀 함수 호출입니다.
SSH This

맞아요! https를 시도하고 거절당했습니다. 니가 끝냈어. UPVOTED;)
tony gil

21

file_get_contents()사용 fopen()래퍼를, 따라서는 연결 URL에 액세스 제한 allow_url_fopenphp.ini 파일 내에서 옵션을 선택합니다.

이 옵션을 켜려면 php.ini를 변경하거나 cURL 이라는 대체 방법을 사용해야합니다 . 가장 인기 있고 솔직히 말해서 수행하려는 작업을 수행하는 표준 방법입니다.


신경 쓰지 마세요. 그가 file_get_contents()다른 URL에서 작업 했다고 말한 것을 알아 차 렸습니다 . 그럼에도 불구하고 이것은 여전히이 문제를 가진 다른 사람들에게 좋은 팁입니다.
Michael Wales

예, 다른 옵션을 살펴보고 cURL이 표준 방법이라는 것을 확인했지만 더 쉽고 다른 URL로 작업했기 때문에 이것을 시도했습니다. 내가 cURL을 삽입하려면 아파치를 다시 시작해야한다고 생각합니까? 그리고이 작업을 수행하는 방법을 알 수 없습니다 (다른 질문) ... 빠른 응답에 감사드립니다
undefined

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
이것은 나에게도 효과적이었습니다! 그것과 같은 사용자 에이전트 필요
브라이언

URL이 올바르게 인코딩 된 것 같으면 이것이 문제 일 수 있습니다. 일부 사이트는 '사용자 에이전트', 아마도 '수락'을 제한합니다.
Jahmic

1
슈퍼 대답. 이 항목을 상단으로 홍보하기 위해 투표하십시오. 모두 PHP에서 https 요청을 위해 일했습니다. 두 줄만 추가하면됩니다. 공유 서버가 컬을 제공하면 어떨까요? 이것은 매우 도움이됩니다.
ndasusers

10

귀하의 URL에 공백이 있습니다. 나는 그것이 보통 나쁜 것이라고 생각합니다. 다음으로 URL 인코딩을 시도하십시오.

$my_url = urlencode("my url");

그리고 전화

file_get_contents($my_url);

행운이 있는지 확인하세요.


4

비슷한 문제가 발생하여 YouTube URL을 구문 분석했습니다. 코드는 다음과 같습니다.

$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

amazonaws 페이지 또는 ##. ##에 지정된 경우 매개 변수 (mpaction, format)에 대해 잘 모르겠습니다.

URL 을 urlencode () 시도하십시오 .


감사합니다-이들은 mediaplug 인스턴스에 대한 매개 변수입니다. URL을 urlencode하면 여전히 작동하지 않습니다. 오류에 매우 잘못된 URL이 표시됩니다 ... ??
undefined

매개 변수 문자열 만 인코딩해야합니다. "convert format"은 "convert % 20format"(또는 "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

비슷한 문제가 있습니다.

시간 초과로 인해!

시간 초과는 다음과 같이 표시 될 수 있습니다.

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

제 문제를 해결 해주신 ㅋㅋ 정말 감사합니다!
Niggo

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.