2009-08-06 8 views

Répondre

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

Cela a été saisi de this post sur la façon de vérifier si une URL existe. Parce que Twitter devrait fournir un message d'erreur au-dessus de 300 lorsqu'il est en maintenance, ou un 404, cela devrait fonctionner parfaitement.

+0

Si vous avez besoin de SSL, jetez un oeil à ce post https: // stackoverflow.com/questions/4372710/php-curl-https – eballo

19

est ici un:

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

autre:

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

c'est pas de bonnes valeurs de retour. pourquoi ne pas retourner 0/false/null en cas d'échec et un entier représentant les millisecondes en cas de succès? –

+2

@Philippe Gerber - Parce que je ne l'ai pas écrit, mais ce sont de bonnes suggestions. – karim79

+4

Ping travaille sur le protocole ICMP, il n'y a pas de 'port'. Vous pouvez exécuter une commande ping sur un hôte avec 0 ports tcp ouverts. – deejayy

5

ping est disponible sur presque tous les systèmes d'exploitation. Vous pouvez donc faire un appel système et récupérer le résultat.

8

En utilisant shell_exec:

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

Vous devriez utiliser 'ping -c1 host' ou quelque chose sous Linux. Plain 'ping host' ne reviendra pas là. – Michas

+0

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

6

Une autre option (si vous avez besoin/envie de faire un ping au lieu d'envoyer une requête HTTP) est le Ping class for PHP. Je l'ai écrit juste pour cela, et il vous permet d'utiliser l'une des trois méthodes suivantes pour faire un ping sur un serveur (certains serveurs/environnements ne supportent qu'une des trois méthodes).

Exemple d'utilisation:

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

Avec la fonction suivante vous envoyez simplement les purs paquets ICMP en utilisant socket_create. J'ai reçu le code suivant de a user note là. N.B. Vous devez exécuter les éléments suivants comme racine.

Bien que vous ne puissiez pas mettre cela dans une page Web standard, vous pouvez l'exécuter comme un travail cron et remplir une base de données avec les résultats. Il est donc plus adapté si vous avez besoin de surveiller un site.

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

ce code est en php je, la réponse est généralement comme ceci:

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

J'utilise le code comme ceci:

 

    $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

cela pourrait conduire à' ping: icmp open socket: Permission denied'. Pour résoudre ce problème, SELinux doit être permissif –