Пинг сервера c помощью php

12
opaHzheBb1u
На сайте с 26.05.2006
Offline
168
1830

добрый день.

Подскажите пожалуйста метод пингования сервера на php. точнее мне нужно узнать, есть ли ответ от сервера или нет.

Спасибо.

AM
На сайте с 04.11.2003
Offline
57
#1

первый пример на сайте php.net функции fsockopen()

<?php
$fp = fsockopen("www.example.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.example.com\r\n";
$out .= "Connection: Close\r\n\r\n";

fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
?>
nickspring
На сайте с 29.03.2006
Offline
228
#2

Arty.M, вместо GET лучше HEAD написать. Меньше трафика уйдет.

opaHzheBb1u
На сайте с 26.05.2006
Offline
168
#3

спасибо, но первый пример не работает =\

есть ли что-нить без сокетов?

Нужно узнать есть ли ответ от сервера или нет (включен или выкл). причем там игровые сервера, наверное заголовков там таких нет.

nickspring
На сайте с 29.03.2006
Offline
228
#4

opaHzheBb1u, выдержка из хелпа PHP

Network Functions

Для использования этих функций не требуется проведение установки, поскольку они являются частью ядра PHP.

AM
На сайте с 04.11.2003
Offline
57
#5

первый пример работает, возможно, он не работает у Вас...

в PHP5 есть функция get_headers()

opaHzheBb1u
На сайте с 26.05.2006
Offline
168
#6

сокеты работают, только если указать несуществующий адрес и порт - думает секунд 15 =(.

nickspring
На сайте с 29.03.2006
Offline
228
#7

А если последний аргумент в fsockopen - "30" уменьшить? (это timeout)

opaHzheBb1u
На сайте с 26.05.2006
Offline
168
#8
nickspring:
А если последний аргумент в fsockopen - "30" уменьшить? (это timeout)

пробовал. как-будто игнорирует его. ставил и 15 и 3 и 1... =(

_ppr
На сайте с 28.06.2006
Offline
10
#9
Arty.M:
первый пример на сайте php.net функции fsockopen()

$out = "GET / HTTP/1.1\r\n";
?>

Если сервера игровые то не факт что они там и web сервер поставили...

Я еще в институте занимался определением CS серваков в локалке... к сожалению исходники гдето пропотерялись...

Но там тоже не пинг был а отправка пакета по udp

Вот пример простого ping (не пробовал)


<?php
// Checksum calculation function
function icmpChecksum($data)
{
if (strlen($data)%2)
$data .= "\x00";

$bit = unpack('n*', $data);
$sum = array_sum($bit);

while ($sum >> 16)
$sum = ($sum >> 16) + ($sum & 0xffff);

return pack('n*', ~$sum);
}
// Making the package
$type= "\x08";
$code= "\x00";
$checksum= "\x00\x00";
$identifier = "\x00\x00";
$seqNumber = "\x00\x00";
$data= "Scarface";
$package = $type.$code.$checksum.$identifier.$seqNumber.$data;
$checksum = icmpChecksum($package); // Calculate the checksum
$package = $type.$code.$checksum.$identifier.$seqNumber.$data;
// And off to the sockets
$socket = socket_create(AF_INET, SOCK_RAW, 1);
socket_connect($socket, "www.google.com", null);
// If you're using below PHP 5, see the manual for the microtime_float
// function. Instead of just using the m
// icrotime() function.
$startTime = microtime(true);
socket_send($socket, $package, strLen($package), 0);
if (socket_read($socket, 255)) {
echo round(microtime(true) - $startTime, 4) .' seconds';
}
socket_close($socket);
?>
qRoof
На сайте с 12.09.2006
Offline
6
#10

PHP.NET

<?php

function Ping(){
// false proxy used to generate connection error
$ProxyServer = "116.155.95.163";
$ProxyPort = 8080;
$timeout=10;
echo "Opening ProxyServer $ProxyServer<br>";
// must use next two statements
Set_Time_Limit(0); //Time for script to run .. not sure how it works with 0 but you need it
Ignore_User_Abort(True); //this will force the script running at the end

$handle = fsockopen($ProxyServer, $ProxyPort,$errno,$errstr,$timeout);
if (!$handle){
echo "Failed to open ProxyServer $ProxyServer errno=$errno,errstr=$errstr<br>";
return 0;
}
else {
// copied method for PING like time operation
$status = socket_get_status($handle);
echo "Opened ProxyServer $ProxyServer<br>";

//Time the responce
list($usec, $sec) = explode(" ", microtime(true));
$start=(float)$usec + (float)$sec;


$timeout=120;
stream_set_timeout($handle,$timeout);
//send somthing
ini_set('display_errors','0');
$write=fwrite($handle,"echo this\n");
if(!$write){
return 0;
}

echo "Try To Read<br>";
stream_set_blocking($handle,0);
//Try to read. the server will most likely respond with a "ICMP Destination Unreachable" and end the read. But that is a responce!
fread($handle,1024);
fclose($handle);
echo "Read<br>";
ini_set('display_errors','1');

//Work out if we got a responce and time it
list($usec, $sec) = explode(" ", microtime(true));
$laptime=((float)$usec + (float)$sec)-$start;
if($laptime>$timeout)
return 0;
//else
// $laptime = round($laptime,3);
return $laptime;
}
}

// must use ErrorHandler to avoid php error being printed to screen
function userErrorHandler($errno, $errmsg, $filename, $linenum, $vars)
{
// you can set this to what ever you like.
echo "In Error Handler<br>";
return 0;
}

$old_error_handler = set_error_handler("userErrorHandler");

$time = Ping();
echo "Time=$time<br>";
echo "Done Checking<br>";
?>
Америка, которую нам не показывают | JC | J. CMS
12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий