Задача: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, но для подстраховки если эта библиотека не установлена включаю в код функцию с сокетами. Спасибо за внимание
--------------------
Лучший способ научиться программированию - это посмотреть как это делают другие...
|