Пингуйте сайт и возвращайте результат в PHP - PullRequest
25 голосов
/ 06 августа 2009

Я хотел бы создать небольшую процедуру IF, которая будет проверять, доступен ли Twitter (в отличие, например, сейчас), и будет возвращать true или false.

Справка:)

Ответы [ 7 ]

38 голосов
/ 06 августа 2009
function urlExists($url=NULL)  
{  
    if($url == NULL) return false;  
    $ch = curl_init($url);  
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);  
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);  
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
    $data = curl_exec($ch);  
    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);  
    curl_close($ch);  
    if($httpcode>=200 && $httpcode<300){  
        return true;  
    } else {  
        return false;  
    }  
}  

Это было взято из этого поста о том, как проверить, существует ли URL. Поскольку Твиттер должен выдавать сообщение об ошибке выше 300, когда он находится на обслуживании, или 404, это должно работать отлично.

21 голосов
/ 06 августа 2009

Вот один из них:

http://www.planet -source-code.com / VB / скрипты / ShowCode.asp? LngWId = 8 & txtCodeId = 1786

Другой:

function ping($host, $port, $timeout) { 
  $tB = microtime(true); 
  $fP = fSockOpen($host, $port, $errno, $errstr, $timeout); 
  if (!$fP) { return "down"; } 
  $tA = microtime(true); 
  return round((($tA - $tB) * 1000), 0)." ms"; 
}

//Echoing it will display the ping if the host is up, if not it'll say "down".
echo ping("www.google.com", 80, 10);  
9 голосов
/ 06 августа 2009

Использование shell_exec :

<code><?php
$output = shell_exec('ping -c1 google.com');
echo "<pre>$output
"; ?>
6 голосов
/ 10 декабря 2012

Другой вариант (если вам нужно / хотите пинговать вместо отправки HTTP-запроса) - это класс Ping для PHP . Я написал его только для этой цели, и он позволяет использовать один из трех поддерживаемых методов для проверки связи с сервером (некоторые серверы / среды поддерживают только один из трех методов).

Пример использования:

require_once('Ping/Ping.php');
$host = 'www.example.com';
$ping = new Ping($host);
$latency = $ping->ping();
if ($latency) {
  print 'Latency is ' . $latency . ' ms';
}
else {
  print 'Host could not be reached.';
}
5 голосов
/ 06 августа 2009

ping доступно практически на всех ОС. Таким образом, вы можете сделать системный вызов и получить результат.

0 голосов
/ 26 августа 2016

это php код, который я использовал, ответ обычно такой:

    2 packets transmitted, 2 received, 0% packet loss, time 1089ms

Итак, я использовал такой код:

  

    $ping_how_many = 2;
    $ping_result = shell_exec('ping -c '.$ping_how_many.' bing.com');
    if( !preg_match('/'.$ping_how_many.' received/',$ping_result) ){
       echo 'Bad ping result'. PHP_EOL;
        // goto next1;
    } 


0 голосов
/ 12 ноября 2013

С помощью следующей функции вы просто отправляете чистые ICMP-пакеты, используя socket_create . Я получил следующий код от примечания пользователя там. Нотабене Вы должны запустить следующее как root .

Хотя вы не можете поместить это на стандартную веб-страницу, вы можете запустить ее как задание cron и заполнить базу данных результатами.

Так что лучше всего подходит для мониторинга сайта.

function twitterIsUp() {
    return ping('twitter.com');
}

function ping ($host, $timeout = 1) {
    /* ICMP ping packet with a pre-calculated checksum */
    $package = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
    $socket = socket_create(AF_INET, SOCK_RAW, 1);
    socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => $timeout, 'usec' => 0));
    socket_connect($socket, $host, null);

    $ts = microtime(true);
    socket_send($socket, $package, strLen($package), 0);
    if (socket_read($socket, 255)) {    
        $result = microtime(true) - $ts;
    } else {
        $result = false;
    }
    socket_close($socket);

    return $result;
}
...