2009-08-06 3 views

Odpowiedz

34
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; 
    } 
} 

została Ten chwycił od this post w jaki sposób sprawdzić, czy adres URL nie istnieje. Ponieważ Twitter powinien dostarczyć komunikat o błędzie powyżej 300, gdy jest w trakcie konserwacji, lub 404, to powinno działać idealnie.

+0

jeśli potrzebujesz protokołu SSL, to możesz przeczytać ten post https: // stackoverflow.com/questions/4372710/php-curl-https – eballo

19

Oto jeden:

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=8&txtCodeId=1786

Inna:

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); 
+8

to nie są dobre wartości zwracane. czemu nie zwrócić 0/false/null przy niepowodzeniu i liczbie całkowitej reprezentującej milisekundy sukcesu? –

+2

@Philippe Gerber - Ponieważ tego nie napisałem, ale są to dobre sugestie. – karim79

+4

Ping pracuje nad protokołem ICMP, nie ma czegoś takiego jak "port". Możesz wysłać polecenie ping do hosta z 0 otwartymi portami tcp. – deejayy

5

ping jest dostępny na prawie każdym systemie operacyjnym. Możesz więc wykonać wywołanie systemowe i pobrać wynik.

8

Korzystanie shell_exec:

<?php 
$output = shell_exec('ping -c1 google.com'); 
echo "<pre>$output</pre>"; 
?> 
+4

Powinieneś użyć 'ping -c1 host' lub czegoś w systemie Linux. Zwykły 'ping host' nie powróci tam. – Michas

+0

jeszcze lepiej: 'if (0! = ($ _result = \' ping -q -c1 google.com>/dev/null 2> &1 ; echo $? \ ')) { echo" Fail. "; } ' – lucifurious

6

Innym rozwiązaniem (jeśli potrzebujesz/chcesz ping zamiast wysyłać żądania HTTP) jest Ping class for PHP. Napisałem to tylko w tym celu i pozwala użyć jednej z trzech obsługiwanych metod do pingowania serwera (niektóre serwery/środowiska obsługują tylko jedną z trzech metod).

Przykład użycia:

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.'; 
} 
0

z następującą funkcję dopiero wysyłającego czystych pakiety ICMP używając socket_create. Otrzymałem następujący kod z a user note. N.B. Musisz uruchomić następujący kod: root.

Mimo że nie można umieścić tego na standardowej stronie internetowej, można uruchomić go jako zadanie cron i wypełnić bazę danych wynikami.

Najlepiej nadaje się do monitorowania witryny.

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; 
} 
0

to jest kod php Kiedyś, odpowiedź jest zazwyczaj tak:

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

Więc użyłem kodu:

 

    $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

może to prowadzić do' ping: icmp open socket: Permission denied'. Aby rozwiązać ten problem, SELinux musi być dozwolony –