Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: fgets, получить только headers
 
 автор: Гость   (19.05.2008 в 00:04)   письмо автору
 
 

Делаю скрипт ,обращающийся к странице, но поскольку мне от страницы нужны только заголовок, то я не хочу что бы скрипт выкачивал всю страницу, сейчас он у меня выкачивает ее всю после чего обрезает:


<?
....
while (!
feof($fp)) 
{  
  
$line .= fgets($fp1024);  
}  
fclose($fp);
$len  strpos($line'<html');
$line substr($line0$len);
...

Пока писал придумал проверять наличие '<html' в в цикле и если оно находится - из него выходить, но тут же подумалось, а что если этот самый '<html' "разрежется " fgets на две части?

Дело в том что я не совмем понимаю принцип работы fgets - она считывает с кадым обращением по строке? А если строка оказыавется длиннее чем lenght fgets? Тогда он считывает эту строку дальше? А если она оказывается короче? То он считывает только эту строку и останавливается на символе перевода?

Все умозаключения сделанны на основе попыток использования fgets без цикла.

   
 
 автор: Гость   (19.05.2008 в 13:03)   письмо автору
 
   для: Гость   (19.05.2008 в 00:04)
 

Идей нет?

   
 
 автор: Le bien   (19.05.2008 в 13:20)   письмо автору
 
   для: Гость   (19.05.2008 в 13:03)
 

Между заголовками и контентом есть пустая строка, если описанию протокола верить

   
 
 автор: Киналь (гость)   (19.05.2008 в 13:34)
 
   для: Гость   (19.05.2008 в 00:04)
 

>Дело в том что я не совмем понимаю принцип работы fgets - она считывает с кадым обращением по строке? А если строка оказыавется длиннее чем lenght fgets? Тогда он считывает эту строку дальше? А если она оказывается короче? То он считывает только эту строку и останавливается на символе перевода?

fgets() фактически посылает требование серверу вернуть первые $length символов файла вне зависимости от этих символов.
В вашем случае можно проверять наличие в возвращенной строке символа "<". Или считывать данные с помощью fgetc(), считывающей по одному символу, но это снизит скорость работы.

   
 
 автор: mihdan   (19.05.2008 в 17:08)   письмо автору
 
   для: Гость   (19.05.2008 в 00:04)
 

Используйте заголовок HEAD, либо в цикле при чтении ответа проверяйте, как только появиться пустая строка break; (\r\n\r\n). Можно также заюзать cURL


<?php
  
// Задаём адрес удалённого сервера
  
$curl curl_init("http://www.php.net");
  
// Возвращаем результат как строку
  
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
  
// Получаем только заголовки
  
curl_setopt($curlCURLOPT_HEADER1);
  
// Исключаем тело документа
  
curl_setopt($curlCURLOPT_NOBODY1);
  
// Получаем содержимое страницы
  
$content curl_exec($curl);
  
// Закрываем CURL соединение
  
curl_close($curl);

  echo 
$content;
?> 

Вот на сокетах

<?php  
  
// А это сама функция узнавания размера  
  
function get_content($hostname$path
  {  
    
$line ""
    
// Устанавливаем соединение, имя которого 
    // передано в параметре $hostname 
    
$fp fsockopen($hostname80$errno$errstr30);  
    
// Проверяем успешность установки соединения 
    
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($fp1024);  
        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>"
  } 
?>  

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования