Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр 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$errstr10);
?>

Скажем не 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$errstr5);
     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($fp2);
         
stream_set_blocking($fpFALSE);         
         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 Яндекс.Метрика Яндекс цитирования