Chciałbym stworzyć małą procedurę IF, która sprawdzi, czy Twitter jest dostępny (w przeciwieństwie do teraz, na przykład), i zwróci wartość true lub false.Strona Ping i wynik zwrotu w PHP
Pomoc :)
Chciałbym stworzyć małą procedurę IF, która sprawdzi, czy Twitter jest dostępny (w przeciwieństwie do teraz, na przykład), i zwróci wartość true lub false.Strona Ping i wynik zwrotu w PHP
Pomoc :)
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;
}
}
została Ten chwycił od this post w jaki sposób sprawdzić, czy adres URL nie istnieje. Ponieważ Twitter powinien dostarczyć komunikat o błędzie powyżej 300, gdy jest w trakcie konserwacji, lub 404, to powinno działać idealnie.
jeśli potrzebujesz protokołu SSL, to możesz przeczytać ten post https: // stackoverflow.com/questions/4372710/php-curl-https – eballo
Oto jeden:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=8&txtCodeId=1786
Inna:
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);
to nie są dobre wartości zwracane. czemu nie zwrócić 0/false/null przy niepowodzeniu i liczbie całkowitej reprezentującej milisekundy sukcesu? –
@Philippe Gerber - Ponieważ tego nie napisałem, ale są to dobre sugestie. – karim79
Ping pracuje nad protokołem ICMP, nie ma czegoś takiego jak "port". Możesz wysłać polecenie ping do hosta z 0 otwartymi portami tcp. – deejayy
ping
jest dostępny na prawie każdym systemie operacyjnym. Możesz więc wykonać wywołanie systemowe i pobrać wynik.
Korzystanie shell_exec:
<?php
$output = shell_exec('ping -c1 google.com');
echo "<pre>$output</pre>";
?>
Powinieneś użyć 'ping -c1 host' lub czegoś w systemie Linux. Zwykły 'ping host' nie powróci tam. – Michas
jeszcze lepiej: 'if (0! = ($ _result = \' ping -q -c1 google.com>/dev/null 2> &1 ; echo $? \ ')) { echo" Fail. "; } ' – lucifurious
Innym rozwiązaniem (jeśli potrzebujesz/chcesz ping zamiast wysyłać żądania HTTP) jest Ping class for PHP. Napisałem to tylko w tym celu i pozwala użyć jednej z trzech obsługiwanych metod do pingowania serwera (niektóre serwery/środowiska obsługują tylko jedną z trzech metod).
Przykład użycia:
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.';
}
z następującą funkcję dopiero wysyłającego czystych pakiety ICMP używając socket_create. Otrzymałem następujący kod z a user note. N.B. Musisz uruchomić następujący kod: root.
Mimo że nie można umieścić tego na standardowej stronie internetowej, można uruchomić go jako zadanie cron i wypełnić bazę danych wynikami.
Najlepiej nadaje się do monitorowania witryny.
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;
}
to jest kod php Kiedyś, odpowiedź jest zazwyczaj tak:
2 packets transmitted, 2 received, 0% packet loss, time 1089ms
Więc użyłem kodu:
$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; }
może to prowadzić do' ping: icmp open socket: Permission denied'. Aby rozwiązać ten problem, SELinux musi być dozwolony –
zamiast ping, nie można wykonać żądania http ? – palindrom