Forum Webscript.Ru
Программирование => PHP => Тема начата: obytatel от 27 Апреля 2003, 04:12:23
-
паскудный скрипт перестает делать работенку - всего-то 100 соединений открыть и прчитать. А он гад перестает подавать признаки жизни не выполнив порученое ему задание
set_time_limit(60000);
echo ("start time limit
");
//error_reporting(0);
$region=file("swap/submit.x");
foreach ($region as $tmp)
{
echo("
starting $tmp
");
$host=str_replace(\'http://\', "","$tmp");
$host=str_replace(\'https://\', "","$host");
$finish= strpos($host, \'/\');
$length= $finish - 0;
$host=Substr($host, 0, $length);
$so = fsockopen("$host", 80, &$errno, &$errstr, 30);
if (!$so) {
echo ("connection fail
");
}
else {
echo ("connect done
");
$tmp = str_replace("\\n", "", "$tmp");
$tmp = str_replace("\\r", "", "$tmp");
fputs($so,"GET $tmp HTTP/1.0\\nHOST: http://$host/\\n\\n");
while(fgets($so,2048)!="\\r\\n" && !feof($so));
unset($buf);
while(!feof($so)) $buf.=fread($so,2048);
fclose($so);
$fp1=fopen("swap/source/$host.html" ,"w+");
fputs($fp1, $buf);
fclose ($fp1);
echo ("download done
");
fclose ($so);
}
}
echo "DONE
";
?>
код кривой - как сам автор:D
-
останавливается на каком-то определенном хосте или после опред. количество обработанных хостов?
В каком режиме работаешь ? (cgi, cli, mod_php)
-
Думаю, для начала, если в php.ini implicit_flush = Off, то в начале поставь ob_implicit_flush(); или flush(); после каждого echo.
Там где
fputs($so,"GET $tmp HTTP/1.0\\nHOST: http://$host/\\n\\n");
не нужно http:// и слеша в конце:
fputs($so,"GET $tmp HTTP/1.0\\nHOST: $host\\n\\n");
Потом, здесь
$fp1=fopen("swap/source/$host.html" ,"w+");
лучше $host взять в фигурные скобки - на всякий случай... или вообще вынести из скавычек: "swap/source/{$host}.html" или "swap/source/".$host.".html"
Может у меня с логикой что-то не в порядке, но какое назначение имеет вот эта структура?
while(fgets($so,2048)!="\\r\\n" && !feof($so));
"Перематывает" хендл на конец файла?
Ты вообще задачу объясни. Если тебе просто сорцы страничек скачать надо, то их можно просто fopen($url, "r") открывать и с сокетами не париться...
[off]Мне больше всего понравилась строка $length= $finish - 0 ;)[/off]
-
fsockopen(string hostname, int port [, int errno [, string errstr [, float timeout]])
Note:
The timeout parameter was introduced in PHP 3.0.9 and UDP support was added in PHP 4.
И по моему опыту не робит на винде.
-
У меня робит.
WinXP SP1, Apache/1.3.24 и PHP 4.3.0 как Server API.
-
Я не ме пробовал - не робила.
-
Сорри, чего-то я действительно напутал.
Проверил несколько раз - действительно не работает!
Простите за дезинформацию.
-
Постой, беру свои слова обратно!
Вот кусок кода, который у меня отлично работает:
function getmicrotime(){
list($usec, $sec) = explode(" ",microtime());
return ((float)$usec + (float)$sec);
}
$time_start = getmicrotime();
$fp = @fsockopen ("www.microsoft.com", 81, $errno, $errstr, 5);
if (!$fp){
echo "$errstr ($errno)
\\n";
} else {
fclose ($fp);
}
$time_end = getmicrotime();
$time = $time_end - $time_start;
echo "Result: $time seconds
\\n";
Так как 81 порт у майкрософт.ком закрыт, то скрипт будет коннектиться к нему, пока не истечет таймаут. Сколько таймаут задашь - столько и будет ждать ответа.
Но вот почему это не работает с адресами серверов, а не с портами, я пока не понял. Скорее всего, из-за настроек DNS-сервера провайдера. Мой, например, пускает меня в инет только через прокси (принудительно, в настройках браузера вообще ничего не установлено) и на не существующие адреса выдает свою HTML-страничку с ошибкой. Я не уверен, но по-моему это имеет значение, особенно когда коннект идет по 80 порту (прокси стоит только на HTTP).
-
У меня работает твой скрипт (сейчас я на XP) и чё прикольно он мне выдал:
Попытка установить соединение была безуспешной, т.к. от другого компьютера за требуемое время не получен нужный отклик, или было разорвано уже установленное соединение из-за неверного отклика уже подключенного компьютера. (10060)
Result: 5.0823359489441 seconds
т.е. получается переменную $errstr - отдаёт пров!?
-
Вряд ли, скорее всего это встроенные в виндовые сокетные библиотеки сообщения об ошибках.
У меня вот что выдало:
A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond. (10060)
Result: 5.00312507153 seconds
У меня XP английский, а пров - украинский :)
Если у тебя XP русский, то вроде всё понятно.
Но сам факт в том, что таймаут всё же работает!