2009-08-06 17 views

Respuesta

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

Esto fue agarrado por this post sobre cómo comprobar si existe una dirección URL. Debido a que Twitter debería proporcionar un mensaje de error por encima de 300 cuando está en mantenimiento, o un 404, esto debería funcionar perfectamente.

+0

si necesita SSL, eche un vistazo a esta publicación https: // stackoverflow.com/questions/4372710/php-curl-https – eballo

19

Aquí hay uno:

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

Otra:

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

eso no es buenos valores de retorno. ¿Por qué no devuelve 0/falso/nulo en caso de error y un número entero que representa los milisegundos en caso de éxito? –

+2

@Philippe Gerber - Porque no lo escribí, pero esas son buenas sugerencias. – karim79

+4

Ping está trabajando en el protocolo ICMP, no hay tal cosa como 'puerto'. Puede hacer ping a un host con 0 puertos tcp abiertos. – deejayy

5

ping está disponible en casi todos los sistemas operativos. Entonces puedes hacer una llamada al sistema y buscar el resultado.

8

Usando shell_exec:

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

Debería usar 'ping -c1 host' o algo similar en Linux. Plain 'ping host' no volverá allí. – Michas

+0

mejor aún: 'if (!? = 0 ($ _result = \' de ping-q C1 google.com>/dev/null 2> &1 ; echo $ \ ')) {echo ' fall'; } ' – lucifurious

6

Otra opción (si necesita/quiere hacer ping en lugar de enviar una solicitud HTTP) es el Ping class for PHP. Lo escribí solo para este propósito, y le permite usar uno de los tres métodos compatibles para hacer ping a un servidor (algunos servidores/entornos solo admiten uno de los tres métodos).

Ejemplo de uso:

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

Con la siguiente función que se acaba de enviar los paquetes ICMP puros usando socket_create. Obtuve el siguiente código de a user note allí. nótese bien Debe ejecutar lo siguiente como root.

Aunque no puede poner esto en una página web estándar, puede ejecutarlo como un trabajo cron y rellenar una base de datos con los resultados.

Por lo tanto, es más adecuado si necesita supervisar un sitio.

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

este es el código php he utilizado, la respuesta suele ser así:

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

por lo que utiliza un código como éste:

 

    $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

esto podría llevar a' ping: icmp open socket: Permiso denegado'. Para resolver esto, SELinux debe ser permisivo –