|
|
|
| Делаю скрипт ,обращающийся к странице, но поскольку мне от страницы нужны только заголовок, то я не хочу что бы скрипт выкачивал всю страницу, сейчас он у меня выкачивает ее всю после чего обрезает:
<?
....
while (!feof($fp))
{
$line .= fgets($fp, 1024);
}
fclose($fp);
$len = strpos($line, '<html');
$line = substr($line, 0, $len);
...
|
Пока писал придумал проверять наличие '<html' в в цикле и если оно находится - из него выходить, но тут же подумалось, а что если этот самый '<html' "разрежется " fgets на две части?
Дело в том что я не совмем понимаю принцип работы fgets - она считывает с кадым обращением по строке? А если строка оказыавется длиннее чем lenght fgets? Тогда он считывает эту строку дальше? А если она оказывается короче? То он считывает только эту строку и останавливается на символе перевода?
Все умозаключения сделанны на основе попыток использования fgets без цикла. | |
|
|
|
|
|
|
|
для: Гость
(19.05.2008 в 00:04)
| | Идей нет? | |
|
|
|
|
|
|
|
для: Гость
(19.05.2008 в 13:03)
| | Между заголовками и контентом есть пустая строка, если описанию протокола верить | |
|
|
|
|
автор: Киналь (гость) (19.05.2008 в 13:34) |
|
|
для: Гость
(19.05.2008 в 00:04)
| | >Дело в том что я не совмем понимаю принцип работы fgets - она считывает с кадым обращением по строке? А если строка оказыавется длиннее чем lenght fgets? Тогда он считывает эту строку дальше? А если она оказывается короче? То он считывает только эту строку и останавливается на символе перевода?
fgets() фактически посылает требование серверу вернуть первые $length символов файла вне зависимости от этих символов.
В вашем случае можно проверять наличие в возвращенной строке символа "<". Или считывать данные с помощью fgetc(), считывающей по одному символу, но это снизит скорость работы. | |
|
|
|
|
|
|
|
для: Гость
(19.05.2008 в 00:04)
| | Используйте заголовок HEAD, либо в цикле при чтении ответа проверяйте, как только появиться пустая строка break; (\r\n\r\n). Можно также заюзать cURL
<?php
// Задаём адрес удалённого сервера
$curl = curl_init("http://www.php.net");
// Возвращаем результат как строку
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// Получаем только заголовки
curl_setopt($curl, CURLOPT_HEADER, 1);
// Исключаем тело документа
curl_setopt($curl, CURLOPT_NOBODY, 1);
// Получаем содержимое страницы
$content = curl_exec($curl);
// Закрываем CURL соединение
curl_close($curl);
echo $content;
?>
|
Вот на сокетах
<?php
// А это сама функция узнавания размера
function get_content($hostname, $path)
{
$line = "";
// Устанавливаем соединение, имя которого
// передано в параметре $hostname
$fp = fsockopen($hostname, 80, $errno, $errstr, 30);
// Проверяем успешность установки соединения
if (!$fp) echo "$errstr ($errno)<br />\n";
else
{
// Формируем HTTP-запрос для передачи
// его серверу
$headers = "GET $path HTTP/1.1\r\n";
$headers .= "Host: $hostname\r\n";
$headers .= "Connection: Close\r\n\r\n";
// Отправляем HTTP-запрос серверу
fwrite($fp, $headers);
$end = $false;
// Получаем ответ
while (!$end)
{
$line = fgets($fp, 1024);
if (trim($line) == "") $end = true;
else $out[] = $line;
}
fclose($fp);
}
return $out;
}
$hostname = "www.mail.ru";
$path = "/";
// Устанавливаем большее время работы
// скрипта - пока вся страница не будет загружена
// она не будет отображена
set_time_limit(180);
// Вызываем функцию
$out = get_content($hostname, $path);
// Выводим содержимое массива
foreach($out as $http)
{
echo $http."<br>";
}
?>
|
| |
|
|
|