2009-08-06 5 views

Antwort

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

Das von this post auf packte wurde, wie zu überprüfen, ob eine URL vorhanden ist. Da Twitter eine Fehlermeldung über 300, wenn es in Wartung ist, oder ein 404, sollte dies perfekt funktionieren.

+0

Wenn Sie SSL benötigen, werfen Sie einen Blick auf diesen Beitrag https: // stackoverflow.com/questions/4372710/php-curl-https – eballo

19

hier ein:

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

Ein anderer:

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

das sind keine guten Rückgabewerte. warum nicht 0/false/null bei einem Fehler zurückgeben und eine Ganzzahl, die die Millisekunden bei Erfolg repräsentiert? –

+2

@Philippe Gerber - Weil ich es nicht geschrieben habe, aber das sind gute Vorschläge. – karim79

+4

Ping arbeitet am ICMP-Protokoll, so etwas wie "Port" gibt es nicht. Sie können einen Host mit 0 offenen TCP-Ports pingen. – deejayy

5

ping ist auf fast jedem Betriebssystem verfügbar. Sie können also einen Systemaufruf durchführen und das Ergebnis abrufen.

8

Mit shell_exec:

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

Sie sollten 'ping-c1-Host' oder etwas unter Linux verwenden. Plain 'ping host' wird nicht dorthin zurückkehren. – Michas

+0

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

6

Eine weitere Option (wenn Sie brauchen/wollen eine HTTP-Anfrage ping statt senden) ist die Ping class for PHP. Ich habe es nur für diesen Zweck geschrieben, und Sie können eine von drei unterstützten Methoden verwenden, um einen Server zu pingen (einige Server/Umgebungen unterstützen nur eine der drei Methoden).

Beispiel Nutzung:

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

Mit der folgenden Funktion Sie senden nur die reinen Pakete ICMP socket_create verwenden. Ich habe den folgenden Code von a user note dort. N.B. Sie müssen Folgendes als root ausführen.

Obwohl Sie dies nicht in eine Standard-Webseite einfügen können, können Sie es als Cron-Job ausführen und eine Datenbank mit den Ergebnissen füllen.

So ist es am besten geeignet, wenn Sie eine Website überwachen müssen.

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

dies ich PHP-Code verwendet wird, die Antwort ist in der Regel wie folgt aus:

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

So habe ich Code wie folgt:

 

    $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

dies könnte dazu führen, dass' ping: icmp open socket: Permission denied '. Um dies zu lösen, muss SELinux Permissive sein –