2009-03-30 38 views
58

Tôi đang gặp sự cố khi gọi url từ mã PHP. Tôi cần phải gọi một dịch vụ bằng cách sử dụng một chuỗi truy vấn từ mã PHP của tôi. Nếu tôi nhập url vào trình duyệt, nó hoạt động ok, nhưng nếu tôi sử dụng tệp-get-contents() để thực hiện cuộc gọi, tôi nhận được:PHP file_get_contents() trả về "không thể mở luồng: yêu cầu HTTP không thành công!"

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

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 như:

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

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

Trả lời

85

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

?> 
+4

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

+0

@Christian, bạn có thể xây dựng không? – vonUbisch

+4

Không phải ai cũng có (nhưng mặc dù) cURL được cài đặt. cURL chắc chắn nhanh gấp nhiều lần, nhưng file_get_contents không phải là * mà * chậm, và không yêu cầu bạn nhớ tất cả các tùy chọn bất cứ khi nào bạn sử dụng nó. – Christian

2

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

Cố gắng urlencode() url.

+0

nhờ - đây là những params cho dụ mediaplug. Nếu tôi url urlode url nó vẫn không hoạt động - Tôi nhận được một url rất bị cắt xén trong các lỗi ... ?? – undefined

+0

loại lỗi nào? urlencode không thu gọn url. – SilentGhost

+0

Bạn chỉ nên mã hóa chuỗi tham số: "định dạng chuyển đổi" phải là "chuyển đổi% 20format" (hoặc cách khác là "chuyển đổi + định dạng"). – bobince

20
+0

Tôi đã gặp lỗi tương tự như OP, và đây là vấn đề của tôi - không gian trong các đối số. 'urlencode()' trên các tham số GET đã giải quyết được vấn đề. –

+0

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

+0

Ohhh cảm ơn người đàn ông rất nhiều – Umair

5

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

$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.

16

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

Bạn cần thay đổi php.ini để bật tùy chọn này hoặc sử dụng phương pháp thay thế, cụ thể là cURL - cách phổ biến nhất và trung thực để đạt được những gì bạn đang cố gắng thực hiện.

+0

Nevermind, chỉ cần nhận thấy ông nói 'file_get_contents()' làm việc trên một URL khác nhau. Tuy nhiên, đây vẫn là một mẹo tốt cho những người khác gặp vấn đề này. –

+0

vâng, Ive nhìn vào các tùy chọn khác và thấy rằng cURL là cách tiêu chuẩn để đi nhưng tôi đã thử điều này vì nó đã được dễ dàng hơn và làm việc với các url khác, tôi nghĩ rằng tôi phải khởi động lại apache để intsall cURL? và không thể tìm ra cách để làm điều này (một câu hỏi khác) ... cảm ơn phản ứng nhanh chóng của bạn – 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

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

+0

bạn đã nhận được nó! đã cố gắng https và đã bị từ chối. bạn đóng đinh nó. UPVOTED;) –

2

Tôi có một vấn đề tương tự, tôi phân tích cú pháp url youtube. Mã này 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 thấy rằng $this->video_url bao gồm khoảng trắng. Tôi đã giải quyết bằng cách sử dụng trim($this->video_url).

Có thể nó sẽ giúp bạn.Good Luck

-3

Sử dụng này

file_get_contents($my_url,null,null); 
3

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

Hãy thử điều 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); 

này làm việc ra cho tôi

+1

Đ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

+1

Điều này cũng phù hợp với tôi! – Fwolf

Các vấn đề liên quan