2012-12-13 8 views
5

Voglio verificare se un'altra macchina risponde generalmente con PHP.È possibile eseguire il ping di PHP su un sistema remoto senza ICMP e senza programmi esterni?

La maggior parte degli approcci consiste nel eseguire il ping su alcuni servizi in esecuzione sul computer di destinazione, ma voglio verificare se la macchina è in linea in generale.

Ho trovato http://birk-jensen.dk/2010/09/php-ping/ che presumibilmente invia un pacchetto Ping ICMP. Il problema è che in qualche modo è necessario essere root per eseguire un socket_create(AF_INET, SOCK_RAW, 1). La soluzione alternativa tramite posix_seteuid(0) non funziona neanche, dal momento che sono richieste autorizzazioni elevate anche per questo.

Qualsiasi funzione che consenta di eseguire il programma ping non è disponibile nemmeno nel mio scenario.

Quindi, come posso controllare se un server è online utilizzando php?

+1

'sistema ('ping yahoo.com ') '?? –

+0

Hai accesso al server remoto (ad es. Ssh)? –

+2

Se non si dispone di autorizzazioni, creare un socket ICMP e non si dispone delle autorizzazioni per eseguire un programma esterno per eseguire ICMP echo, quindi non è possibile eseguire un eco ICMP. Se anche tu non vuoi basare il tuo controllo su un servizio o su un altro a cui avresti le autorizzazioni per connettersi, allora sei piuttosto bloccato. È improbabile che tu debba essere specificamente 'root' per questo, il tuo account utente dovrebbe semplicemente avere questa autorizzazione. Contattare l'amministratore del server e vedere se possono farlo per voi. – DaveRandom

risposta

1

per questo si potrebbe desiderare di provare, questo è altamente improbabile per dare dati significativi, ma è qualcosa di Grok sopra.

se si apre una presa tcp su una porta casuale e invece di cronometrare si chiude immediatamente. allora la macchina è "su", tuttavia questo non significa molto di più. potrebbe essere nel panico del kernel.

e un timeout non significa che la macchina è inattiva. solo che invece di rifiutare la stretta di mano tcp lo ha lasciato cadere.

non sarete in grado di ottenere alcun tipo di dati di temporizzazione significativi con questo, ma darò più di un'ipotesi plausibile se la macchina in questione è accesa o spenta.

<?php 
$sock = socket_create(AF_INET,SOCK_STREAM,SOL_TCP); 
socket_connect ($sock , string $address,22) === true) { 
switch(socket_last_error($sock)) { 
    case 110: 
    case 112: 
    case 113: 
     echo 'Machine may be down'; 
     break; 
    case 111: 
     echo 'Machine may be up'; 
     break; 
    case 115: 
     echo 'Machine is up'; 
     break; 
    default: 
     echo 'Machine in unknown state.'; 
     break; 
} 

già dichiarato che non è possibile utilizzare il comando ping in modo Net_Ping non funziona in quanto è solo un'interfaccia fantasia per il comando ping nel sistema operativo

Problemi correlati