|
|
|
| Использую функции как в теме 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..." | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: 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 | |
|
|
|
|
|
|
|
для: Artem S.
(18.11.2005 в 12:18)
| | В Windows XP это вполне нормально... так как библиотека не может обращаться напрямую через берклеевские сокеты - там идёт эмуляция через WinSock2 - когда такие цепочки выстраиваются, может быть всё что угодно... | |
|
|
|