1
0
Fork 0
oldhaven/php-bak/core/classes/files/RemoteFile.class.php

168 lines
5.4 KiB
PHP
Raw Normal View History

2011-03-31 02:01:16 +00:00
<?php
/*****************************************************************
Пример использования:
RemoteFile::setHeaders(array(
'X-Requested-With: XMLHttpRequest',
'Origin: http://vkontakte.ru',
'Content-Type: application/x-www-form-urlencoded'
));
$headers = RemoteFile::getHeaders('http://cs4603.vkontakte.ru/u50132690/audio/432e2b109b94.mp3');
$html = RemoteFile::getData('http://vkontakte.ru/audio', array(
'act' =>'search',
'q' => urlencode($this->_query)
))
*****************************************************************/
/**
* Класс для работы с удаленными файлами
* Реализован через библиотеку cURL
*
* @package classes
* @author chez
**/
class RemoteFile {
private static $_timeout = 5; // Таймаут ответа от сервера
private static $_headers = array(); // Заголовки для отправки на сервер
/**
* Отправка запроса и получение ответа от сервера
* Умеет возвращать текст ответа или заголовки
*
* @param string $url URL запроса
* @param bool $headers Флаг: возвращать заголовки, а не текст
* @param array $post_params Массив POST-параметров, если установлен, то метод меняется на POST
* @return string Ответ от сервера
* @author chez
**/
private static function _exec($url, $headers = false, $post_params = array()) {
if (count($post_params) > 0) {
$p = '';
foreach ($post_params as $key => $val) {
$p .= '&'. $key .'='. $val;
}
$post_params = substr($p, 1);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HTTPHEADER, self::$_headers);
if ($headers) {
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
}
if (is_string($post_params)) {
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_params);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, self::$_timeout);
$result = curl_exec($ch);
if (curl_errno($ch) !== 0) {
curl_close($ch);
return false;
}
curl_close($ch);
return $result;
}
/**
* Получение HTTP-заголовков ответа от сервера
*
* @param string $url URL запроса
* @param array $post_params Массив POST-параметров, если установлен, то метод меняется на POST
* @return array Распарсеный массив заголовков
* @author chez
**/
public static function getHeaders($url, $post_params = array()) {
$headers = self::_exec($url, true);
if ($headers === false) {
return false;
}
$headers = explode("\r\n", $headers);
$headers_array = array();
while(list($i, $header) = each($headers)) {
if (substr($header, 0, 5) == 'HTTP/') {
$header = explode(' ', $header);
$headers_array['http'] = $header[1];
} elseif ($header != '') {
preg_match('/^([a-z0-9\-]*):\s(.*)$/Ui', $header, $m);
$headers_array[strtolower(str_replace('-', '_', $m[1]))] = $m[2];
}
}
return $headers_array;
}
/**
* Получение ответа от сервера
*
* @param string $url URL запроса
* @param array $post_params Массив POST-параметров, если установлен, то метод меняется на POST
* @return string Тело ответа от сервера
* @author chez
**/
public static function getData($url, $post_params = array()) {
return self::_exec($url, false, $post_params);
}
/**
* Запись заголовков, которые будет отправлены вместе с запросом
*
* @param array $headers Индексный массив заголовков
* @return void
* @author chez
**/
public static function setHeaders($headers) {
self::$_headers = $headers;
}
2011-04-02 14:57:17 +00:00
/**
* Массововое получение заголовков по списку файлов
*
* @param array $fules Ассоциативный массив id => url
* @return array Ассоциативный массив id => headers
* @author chez
**/
public static function getHeadersMT($files) {
$mh = curl_multi_init();
$headers_all = array();
$handlers = array();
foreach($files as $i => $url) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_NOBODY, 1);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_multi_add_handle($mh, $ch);
$handlers[$i] = $ch;
}
$running=null;
do
{
curl_multi_exec($mh, $running);
2011-04-03 01:02:15 +00:00
usleep (500000);
2011-04-02 14:57:17 +00:00
} while ($running > 0);
foreach($handlers as $i => $ch) {
$content = curl_multi_getcontent($handlers[$i]);
curl_multi_remove_handle($mh, $handlers[$i]);
$content = explode("\r\n", $content);
$headers = array();
foreach($content as $header) {
if (substr($header, 0, 5) == 'HTTP/') {
$header = explode(' ', $header);
$headers['http'] = $header[1];
} elseif ($header != '') {
preg_match('/^([a-z0-9\-]*):\s(.*)$/Ui', $header, $m);
$headers[strtolower(str_replace('-', '_', $m[1]))] = $m[2];
}
}
$headers_all[$i] = $headers;
}
curl_multi_close($mh);
return $headers_all;
}
2011-03-31 02:01:16 +00:00
}