Ich möchte eine kleine IF-Prozedur erstellen, die prüfen wird, ob Twitter verfügbar ist (anders als jetzt, zum Beispiel), und wird wahr oder falsch zurückgeben.Ping-Site und zurückgeben Ergebnis in PHP
Hilfe :)
Ich möchte eine kleine IF-Prozedur erstellen, die prüfen wird, ob Twitter verfügbar ist (anders als jetzt, zum Beispiel), und wird wahr oder falsch zurückgeben.Ping-Site und zurückgeben Ergebnis in PHP
Hilfe :)
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.
Wenn Sie SSL benötigen, werfen Sie einen Blick auf diesen Beitrag https: // stackoverflow.com/questions/4372710/php-curl-https – eballo
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);
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? –
@Philippe Gerber - Weil ich es nicht geschrieben habe, aber das sind gute Vorschläge. – karim79
Ping arbeitet am ICMP-Protokoll, so etwas wie "Port" gibt es nicht. Sie können einen Host mit 0 offenen TCP-Ports pingen. – deejayy
ping
ist auf fast jedem Betriebssystem verfügbar. Sie können also einen Systemaufruf durchführen und das Ergebnis abrufen.
Mit shell_exec:
<?php
$output = shell_exec('ping -c1 google.com');
echo "<pre>$output</pre>";
?>
Sie sollten 'ping-c1-Host' oder etwas unter Linux verwenden. Plain 'ping host' wird nicht dorthin zurückkehren. – Michas
besser noch: 'if (0! = ($ _result = \ 'ping-q-c1 google.com>/dev/null 2> &1 ; echo $? \')) { echo' fehlgeschlagen. '; } ' – lucifurious
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.';
}
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;
}
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; }
dies könnte dazu führen, dass' ping: icmp open socket: Permission denied '. Um dies zu lösen, muss SELinux Permissive sein –
statt ping, kippen Sie eine HTTP-Anfrage machen ? – palindrom