У меня есть вопрос о PHP-скрипте, который я написал для подключения к сбору статистики с IRC-серверов, в качестве теста, поскольку я новичок в PHP и все еще учусь.
Вот сценарий:
<?php
set_time_limit(0);
$servers = array(
"irc.icq.com",
"irc.quakenet.org");
function get_statistics ($server, $port) {
$nick = 'IRCDir' . rand(1000, 9999);
$irc = fsockopen($server, $port);
fputs($irc,"USER $nick 0 * :$nick\n");
fputs($irc,"NICK $nick\n");while ($data = fgets($irc, 128)) {
$ex = explode(' ', $data);
if (isset($ex[0]) && $ex[0] == "PING") {
fputs($irc, "PONG ".$ex[1]."\n");
}
if (count($ex) > 0) {
if (isset($ex[1]) && $ex[1] == "001") {
$network = $ex[6];
echo date('h:i:s') . " network: " . $server;
echo "\n";
}
if (isset($ex[1]) && $ex[1] == "002") {
$server = str_replace(',', '', $ex[6]);
echo date('h:i:s') . " server: " . $server;
echo "\n";
}
if (isset($ex[1]) && $ex[1] == "251") {
$users = $ex[5] + $ex[8];
$servers = $ex[11];
echo date('h:i:s') . " users: " . $users;
echo "\n";
echo date('h:i:s') . " servers: " . $servers;
echo "\n";
}
if (isset($ex[1]) && $ex[1] == "252") {
$ircops = $ex[3];
echo date('h:i:s') . " ircops: " . $ircops;
echo "\n";
}
if (isset($ex[1]) && $ex[1] == "254") {
$channels = $ex[3];
echo date('h:i:s') . " channels: " . $channels;
echo "\n";
}
}
}
fclose($irc);
}
foreach ($servers as $server) {
echo date('h:i:s') . " getting statistics for " . $server;
echo "\n";
get_statistics($server, '6667');
}
exit;
?>
Вот вывод:
root@li140-48:~# php bot.php
11:04:23 getting statistics for irc.freenode.net
11:04:24 network: irc.freenode.net
11:04:24 server: sendak.freenode.net
11:04:24 users: 90601
11:04:24 servers: 26
11:04:24 ircops: 22
11:04:24 channels: 50958
11:05:25 getting statistics for irc.icq.com
11:05:26 network: irc.icq.com
11:05:26 server: irc-k01a.orange.icq.com
11:05:26 users: 2671
11:05:26 servers: 3
11:05:26 ircops: 16
11:05:26 channels: 810
11:06:26 getting statistics for irc.quakenet.org
11:06:28 network: irc.quakenet.org
11:06:28 server: blacklotus.ca.us.quakenet.org
11:06:28 users: 37648
11:06:28 servers: 40
11:06:28 ircops: 67
11:06:28 channels: 26711
root@li140-48:~#
У меня вопрос, что вызывает задержку между индексируемыми серверами?
В 10.24: 19 он завершил индекс irc.icq.com
поэтому в этот момент он должен отключиться и немедленно проиндексировать следующий сервер в массиве, но вместо этого он ждет ровно минуту, прежде чем сделать это, но я не упомянул минуту в сценарии?
Надеюсь, что некоторые PHP-гуру могут помочь!
60 секунд — это время ожидания сокета по умолчанию. Вы продолжаете пробовать чтение из потока после того, как у вас уже есть вся информация, которую вы собираетесь получить, вплоть до истечения времени ожидания.
Других решений пока нет …