|
Pers.narod.ru. PHP. Статьи. Проверка доступности сервера на PHP |
Проверить доступность одного Web-сервера легко с помощью стандартной функции fsockopen:
<?php
$server = 'www.yandex.ru';
$port = 80;
$status = 'unavailable';
$timeout = 10;
$fp = @fsockopen ($server, $port, $errno, $errstr, $timeout);
if ($fp) {
$status = 'alive, not responding';
@fwrite ($fp, "HEAD / HTTP/1.0\r\nHost: $server:$port\r\n\r\n");
if (strlen(@fread($fp,1024))>0) $status = 'alive, responding';
fclose ($fp);
}
echo "$server status is $status";
?>
Однако для проверки состояния нескольких серверов такой подход едва ли годится -
вызов функции fsockopen может длиться столько секунд, сколько указано в её последнем параметре,
и только затем будет выполнена следующая команда сценария. Используя PHP 5 и потоковые сокеты задачу
можно выполнить и асинхронно, правда, код станет сложнее:
<?php
$hosts = array("www.yandex.ru", "www.google.ru", "www.mail.ru");
$timeout = 10; //Время ожидания, сек.
$status = array(); //Статусы хостов
$sockets = array(); //Сокеты
// Законнектиться ко всем хостам
foreach ($hosts as $id => $host) {
$s = @stream_socket_client ("$host:80", $errno, $errstr, $timeout,
STREAM_CLIENT_ASYNC_CONNECT|STREAM_CLIENT_CONNECT);
if ($s) {
$sockets[$id] = $s;
$status[$id] = "in progress";
} else {
$status[$id] = "failed, $errno $errstr";
}
}
//Ждём ответов
while (count($sockets)) {
$read = $write = $sockets;
$n = stream_select ($read, $write, $e = null, $timeout);
if ($n > 0) {
foreach ($read as $r) {
$id = array_search($r, $sockets);
$data = fread($r, 8192);
if (strlen($data) == 0) {
if ($status[$id] == "in progress") {
$status[$id] = "failed to connect";
}
fclose($r);
unset ($sockets[$id]);
}
else {
$status[$id] .= $data;
}
}
foreach ($write as $w) {
$id = array_search($w, $sockets);
@fwrite ($w, "HEAD / HTTP/1.0\r\nHost: " . $hosts[$id] . "\r\n\r\n");
$status[$id] = "waiting for response";
}
}
else {
foreach ($sockets as $id => $s) {
$status[$id] = "timed out " . $status[$id];
}
break;
}
}
//Вывод результатов
foreach ($hosts as $id => $host) {
echo "Host: $host Status: " . $status[$id] . "<br>\n";
}
?>
На локалхосте Windows, несмотря на подавление вывода сообщений об ошибках от функции stream_select, Вы рискуете получить лишь
Warning: Invalid CRT parameters detected in C:\Inetpub\wwwroot\socks.php on line 22
Причина думаю, в таком же баге, на *nix-сервере пример сработал.
|
|