У меня возникают проблемы с вызовом 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://
?
Попробуйте использовать 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);
?>
<?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( "&", "&", 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 );
}
}
?>
get_url
должен быть на самом деле get_fcontent
поскольку вы изменили имя самой функции. На самом деле это рекурсивный вызов функции, который повторно пытается получить содержимое URL путем изменения некоторых параметров.
Это может быть ваша проблема?
urlencode()
на параметрах GET решил проблему.
file_get_contents()
использует обертки fopen()
, поэтому он не имеет доступа к URL-адресам через allow_url_fopen
в php.ini.
Вам нужно либо изменить ваш php.ini, чтобы включить этот параметр, либо использовать альтернативный метод, а именно cURL - безусловно самый популярный и, если честно, стандартный способ выполнить то, что вы пытаетесь сделать.
file_get_contents()
работает с другим URL. Тем не менее, это все еще хороший совет для других, имеющих эту проблему.
Я заметил, что ваш URL содержит пробелы. Я думаю, что это обычно плохо. Попробуйте кодировать URL-адрес с помощью
$my_url = urlencode("my url");
а затем вызов
file_get_contents($my_url);
и посмотрите, есть ли у вас больше удачи.
В основном вам необходимо отправить некоторую информацию с запросом.
Попробуйте это,
$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);
Это сработало для меня
Я не уверен в параметрах (mpaction, format), если они указаны для страницы amazonaws или ##. ##.
Попробуйте urlencode() URL.
У меня возникла аналогичная проблема, я проанализировал 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)
.
Возможно, это поможет вам. Удачи
Используйте этот
file_get_contents($my_url,null,null);