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

Форум PHP

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

 

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

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

тема: Время работы функции
 
 автор: Artem S.   (17.11.2005 в 23:32)   письмо автору
 
 

Использую функции как в теме http://softtime.ru/forum/read.php?id_forum=1&id_theme=9487&page=1
Проблема такая:
часто скрипт вылетает на этой строчке

while (!feof($fp)) {
     $buffer .= fgets($fp, 1024);
} 

Коннект состоялся, иначе был бы выход по таймауту у fsockopen.
Можно как-то ограничить время функции getdata, и в случае скажем 2 секунд выход из нее, ну или как-то иначе побороть проблему "Fatal error: Maximum execution time of..."

   
 
 автор: cheops   (18.11.2005 в 02:05)   письмо автору
 
   для: Artem S.   (17.11.2005 в 23:32)
 

Хм... а если уменьшить время на соединение в функции fsockopen()
<?php
     $fp 
= @fsockopen("tcp://".$proxy, $proxyport, $errno, $errstr, 10);
?>

Скажем не 10 секунд, а ещё меньше?
<?php
        $out  
= "GET http://$host$path HTTP/1.1\r\n";
?>

Тут недавно Sfinks сообщал, что при использовании HTTP/1.0 вместо HTTP/1.1 в несколько раз увеличивает скорость работы сокетов - может это особенность библиотеки PHP? Попробуйте HTTP/1.0.

   
 
 автор: Artem S.   (18.11.2005 в 12:18)   письмо автору
 
   для: cheops   (18.11.2005 в 02:05)
 

Переписал так - вроде работает.

<?
function getdata($host, $path, $proxy = false, $proxyport = 80, $get = true, $maxsize = false)
{
     
$buffer = true;
     if ( !
$proxy ) $proxy = $host;
     
$fp = fsockopen("tcp://".$proxy, $proxyport, $errno, $errstr, 5);
     if (!
$fp) {
         return 
false;
     } else {
         
$out  = "GET http://$host$path HTTP/1.0\r\n";
         
$out .= "Host: $host\r\n";
         
$out .= "Referer: $host$path\r\n";
         
$out .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)\r\n";
         
$out .= "Connection: Close\r\n";
         
$out .= "\r\n";

         
fwrite($fp, $out);
         
$status = stream_get_meta_data($fp);
         
stream_set_timeout($fp, 2);
         
stream_set_blocking($fp, FALSE);         
         if(
$get)
         {
             while (!
feof($fp) && !$status['timed_out']) 
             {
                 
$buffer .= fgetc($fp);
                 if(
$maxsize) {
                     if( 
strlen($buffer) > $maxsize ) break;
                 }
                 
$status = stream_get_meta_data($fp);
             }
         }
         
fclose($fp);
     }
     return 
$buffer;
}
?>

Вроде работает. Хотя я заметил одну странность:
$fp = true
empty($errstr) = true
а "Warning: fsockopen(): unable to connect to..."
пишет. Как такое может быть??? ОС windowsXP

   
 
 автор: cheops   (18.11.2005 в 13:42)   письмо автору
 
   для: Artem S.   (18.11.2005 в 12:18)
 

В Windows XP это вполне нормально... так как библиотека не может обращаться напрямую через берклеевские сокеты - там идёт эмуляция через WinSock2 - когда такие цепочки выстраиваются, может быть всё что угодно...

   
Rambler's Top100
вверх

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