Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Вниз

Особенности функции feof в php под windows.   Найти похожие ветки 

 
Дмитрий С ©   (2009-12-01 09:52) [0]

В документации по php для функции fsockopen приведен такой пример:

$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   $out = "GET / HTTP/1.1\r\n";
   $out .= "Host: www.example.com\r\n";
   $out .= "Connection: Close\r\n\r\n";
   fwrite($fp, $out);
   while (!feof($fp)) {
       echo fgets($fp, 128);
   }
   fclose($fp);
}


Этот пример был взят в основу моего кода. Но на удивление сервер НЕ всегда возвращал весь результат.

Сначала я подумал, что это ошибка сервера - неправильно отдает страницу, но поскольку в браузере всегда страница открывается полностью, эта мысль оказалась неверной.

Сейчас я думаю, что причина в ошибке реализации функции feof для сетевых потоков. Она возвращает true, после того как получен пакет о разъединении, а не когда буфер чтения пуст.

Вспомнилось из опыта, что функция recv (fread в php) возвращает пустой результат в случае если поток окончен (буфер чтения пуст и соединение закрыто), поэтому код был исправлен таким образом:


$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
   echo "$errstr ($errno)<br />\n";
} else {
   $out = "GET / HTTP/1.1\r\n";
   $out .= "Host: www.example.com\r\n";
   $out .= "Connection: Close\r\n\r\n";
   fwrite($fp, $out);
   $packet="A";
   while (strlen($packet)>0) {
       $packet = fread($fp, 128);
       echo $packet;
   }
   fclose($fp);
}


После этих изменений страница всегда получалась от сервера полностью.

Речь, конечно, не о delphi, но все же. Кто-нибудь прокомментируйте этот факт.
Вопросы:
1. Это действительно особенность Windows, или под Linux-ом поведение функции feof аналогичное?
2. Корректен ли второй вариант примера?
3. Ваши вопросы.


 
McSimm ©   (2009-12-01 10:03) [1]

Аналогичное поведение под Linux.
Для HTTP обычно длина берется либо из заголовка Content-Length, либо тело читается чанками, для каждого чанка сервер также отдает длину.


 
Дмитрий С ©   (2009-12-02 04:15) [2]


> McSimm ©   (01.12.09 10:03) [1]
>
> Аналогичное поведение под Linux.
> Для HTTP обычно длина берется либо из заголовка Content-
> Length, либо тело читается чанками, для каждого чанка сервер
> также отдает длину.

Забыл поправить примеры. У себя я использовал http/1.0. Когда длина страницы неизвестна, сервер обрывает соединение, обозначая тем самым ее конец.
И получается, что feof возвращает true, когда соединение разорвано, но данные в буфере для чтения еще есть и их можно прочитать.
Меня интересует именно эта особенность.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.45 MB
Время: 0.007 c
2-1260371250
Aleks1985
2009-12-09 18:07
2010.02.07
Нужен компонент для парсинга строк


1-1236164057
dmitry1208197320
2009-03-04 13:54
2010.02.07
Управление размерами картинки при её вставке в Word


3-1234422961
dolmat
2009-02-12 10:16
2010.02.07
как создать триггер


15-1259767731
Ruzzz
2009-12-02 18:28
2010.02.07
Экпорт исходного кода из IDE в RTF/HTML


3-1234343484
TTLr
2009-02-11 12:11
2010.02.07
Сортировка





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский