Пингуйте сайт и возвращайте результат в PHP
Я хотел бы создать небольшую процедуру IF, которая будет проверять, доступен ли Twitter (в отличие, например, сейчас), и будет возвращать true или false.
Помогите:)
8 ответов
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;
}
}
Это было взято из этого поста о том, как проверить, существует ли URL. Поскольку Twitter должен выдавать сообщение об ошибке выше 300, когда он находится в обслуживании, или 404, это должно работать отлично.
Вот один из них:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?lngWId=8&txtCodeId=1786
Другая:
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);
Использование shell_exec:
<?php
$output = shell_exec('ping -c1 google.com');
echo "<pre>$output</pre>";
?>
Другой вариант (если вам нужно / хотите пинговать вместо отправки HTTP-запроса) - это класс Ping для PHP. Я написал его только для этой цели, и он позволяет использовать один из трех поддерживаемых методов для проверки связи с сервером (некоторые серверы / среды поддерживают только один из трех методов).
Пример использования:
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.';
}
ping
доступно практически на каждой ОС. Таким образом, вы можете сделать системный вызов и получить результат.
Другое решение:
Использоватьget_headers
и сравните http-код.
function ping(string $url): bool
{
$headers = get_headers($url);
$httpCode = intval(substr($headers[0], 9, 3));
return $httpCode >= 200 && $httpCode < 300;
}
С помощью следующей функции вы просто отправляете чистые ICMP-пакеты с помощью socket_create. Я получил следующий код из заметки пользователя там. NB. Вы должны запустить следующее от имени пользователя root.
Хотя вы не можете поместить это на стандартную веб-страницу, вы можете запустить ее как задание cron и заполнить базу данных результатами.
Так что лучше всего подходит, если вам нужно следить за сайтом.
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;
}
Это PHP-код, который я использовал, ответ обычно такой:
2 переданных пакета, 2 полученных, потеря пакета 0%, время 1089мс
Итак, я использовал такой код:
$ ping_how_many = 2; $ ping_result = shell_exec ('ping -c'. $ ping_how_many. 'bing.com'); if (! preg_match ('/'.$ ping_how_many.' получили /',$ping_result)){ echo 'Плохой результат пинга'. PHP_EOL; // goto next1; }