Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Закрытая темаСоздание новой темы Создание опроса
> Получение удаленного файла через CURL и сокеты, Как правильно получить удаленных файл. 
:(
    Опции темы
mishaSL
Дата 12.7.2007, 16:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1046
Регистрация: 10.1.2007
Где: Санкт-Петербург

Репутация: 2
Всего: 54



Задача:

1. Зайти на удаленный хост (к примеру http://www.mysite.com/index.php?page=news)
2. Взять все содержимое этой страницы.
3. Если адрес не существует или временно не доступен, то не вызвать ошибки или зависание скрипта.


Решение:

Я предлагаю два решения данной задачи. 
Первое решение - через библиотеку CURL, все описание этой библиотеки вы можете посмотреть здесь.
Второе решение - через сокеты, описание с примерами(в комментариях) можно посмотреть здесь. Также AztEK писал небольшую статью для начинающих: http://forum.vingrad.ru/topic-103996.html

Разницы в скорости между сокетами и curl-ом нет почти никакой, просто кому как удобнее и не на всех хостингах curl стоит (хотя на большенсте есть).  
По поводу получения удаленных файлов через функции file, fopen и т.д. можете почитать следующую информацию:
http://vingrad.ru/PHP-PHPNETHTTP-003044
Также скорее всего будет интересна вот эта тема:
http://forum.vingrad.ru/index.php?showtopi...t&p=1047619

Решение №1:

Функция:
Код

    /**
     * This function get http file (GET - method)
     *
     * @param    resource    $cUrl            Дескриптор возвращенный curl_init()
     * @param    string           $url           url для открытия
     * @param    int             $port        порт через который открывать (default 80)
     * @param    int             $timeout      timeout
     * @return string
     *
     * @access public
     */
function urlGetContents(& $cUrl, $url, $port = 80, $timeout = 5, $errCount = 1)
{
    curl_setopt($cUrl, CURLOPT_URL, $url);
    curl_setopt($cUrl, CURLOPT_PORT, $port);
    curl_setopt($cUrl,CURLOPT_RETURNTRANSFER,1);
    curl_setopt($cUrl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727)");
    curl_setopt($cUrl, CURLOPT_TIMEOUT, $timeout);
    $content = curl_exec($cUrl);
    if (curl_getinfo($cUrl,CURLINFO_HTTP_CODE) != 200) {
        return (($errCount < 2) ? urlGetContents($cUrl, $url, $port, $timeout, ++$errCount) : false);
    } else {
        return $content;
    }
}


Пример использования:
Код

$cUrl = curl_init();
$urlAddress = 'http://www.mysite.com/index.php?page=news';
if (($html = urlGetContents($cUrl, $urlAddress)) === false) {
    print "Адрес <b>".$urlAddress."</b> в данный момент недоступен";
} else {
    print $html;
}
curl_close($cUrl);



Решение №2:

Функция:
Код

    /**
     * This function get http file (GET - method)
     *
     * @param    string           $url           url для открытия
     * @param    int             $timeout      timeout
     * @return string
     *
     * @access public
     */
function urlGetContents($url, $timeout = 5)
{
   $url_parsed = parse_url($url);
   $host = $url_parsed["host"];

   if ($url == '' || $host == '') {
       return false;
   }
   $hostName = gethostbyname($host);
   $ip = ip2long($hostName);
   if ($ip === -1 || $ip === false) {
        return false;
   }
   $port = ($url_parsed["port"] == 0 ? 80 : $url_parsed["port"]);
   $path = (empty($url_parsed["path"]) ? '/' : $url_parsed["path"]);
   $path.= (!empty($url_parsed["query"]) ? '?'.$url_parsed["query"] : '');
   $out = "GET $path HTTP/1.0\r\nHost: $host\r\nConnection: Close\r\n\r\n";
   $fp = fsockopen($host, $port, $errno, $errstr, intval($timeout));
   if (!$fp) {
       return false;
   }
   stream_set_timeout($fp, intval($timeout));
   fwrite($fp, $out);

   $headers = '';
   $content = '';
   $buf = '';
   $isBody = false;
   while (!feof($fp)) {
        $buf = fgets($fp, 1024);
        if ($isBody) {
            $content .= $buf;
        } else {
            $headers .= $buf;
        }
        if ($buf == "\r\n" ) {
            $isBody = true;
        }
   }
   preg_match('#HTTP/1.[0-9]{1}\s+([0-9]{3}).*#is', $headers, $match);
   fclose($fp);
   if($match[1] != 200) {
       return false;
   }
   return array('headers'=>$headers,'body'=>$content);
}


Пример использования:

Код

$urlAddress = 'http://www.mysite.com/index.php?page=news';
if (($html = urlGetContents($urlAddress)) === false) {
    print "Адрес <b>".$urlAddress."</b> в данный момент недоступен";
} else {
    print $html['body'];
}





P.S. Я обычно использую cUrl, но для подстраховки если эта библиотека не установлена включаю в код функцию с сокетами.

Спасибо за внимание smile 


--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
PM MAIL   Вверх
  
Закрытая темаСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Сеть | Следующая тема »


 




[ Время генерации скрипта: 0.1033 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.