Я хочу быстро и легко проверить один IP-адрес с помощью небольшого сценария проверки связи. Я не знаю, возможно ли это, я рассмотрел другие методы, но они требовали, чтобы у меня был root-доступ к моему серверу, которого у меня нет. Поэтому мне было интересно, если бы кто-нибудь знал, как это сделать, я видел пару человек, использующих Nmap, но я не могу этого понять.
Если у кого есть идеи пишите.
Возможно, вы захотите использовать функции сокета для создания ping-пакета ICMP с предварительно рассчитанной контрольной суммой. Вот код, который я использую для проверки связи с PHP:
function pingHost($host, $timeout=1) {
$payload = "\x08\x00\x7d\x4b\x00\x00\x00\x00PingHost";
$socket = socket_create(AF_INET, SOCK_RAW, 1);
socket_set_options(
$socket,
SOL_SOCKET,
SO_RCVTIMEO,
array(
'sec' => $timeout,
'usec' => 0,
)
);
socket_connect($socket, $host, 0);
socket_send($socket, $payload, strlen($payload), 0);
if (socket_read($socket, 255) === false) {
$result = true;
} else {
$result = false;
}
socket_close($socket);
return $result;
}
echo pingHost('myhostname');
Ах, я пропустил, что вам нужен рут для этого. Тогда вы не можете ICMP пинговать хост. Однако вы можете выполнять другие виды пинга, которые могут быть столь же хорошими. Ключ заключается в том, чтобы узнать, какие сервисы работает на хосте. Это веб-сервер с HTTP или HTTPS?
Тогда вы можете использовать cURL.
// http://css-tricks.com/snippets/php/check-if-website-is-available/
function isDomainAvailible($domain)
{
//check, if a valid url is provided
if(!filter_var($domain, FILTER_VALIDATE_URL))
{
return false;
}
//initialize curl
$curlInit = curl_init($domain);
curl_setopt($curlInit,CURLOPT_CONNECTTIMEOUT,10);
curl_setopt($curlInit,CURLOPT_HEADER,true);
curl_setopt($curlInit,CURLOPT_NOBODY,true);
curl_setopt($curlInit,CURLOPT_RETURNTRANSFER,true);
//get answer
$response = curl_exec($curlInit);
curl_close($curlInit);
if ($response) return true;
return false;
}
Если curl недоступен, вы можете использовать get_file_contents () с известным действительным URL.
Это сервер БД, скажем, MySQL или MSSQL? Сделайте что-то подобное, но используйте PDO, чтобы открыть соединение с ним и выполнить команду.
Если служба работает, то хост находится в сети. Конечно, это проверяет, работает ли сетевой стек хоста И работает ли служба. Но так как вы не можете пинговать без рута, это может быть вашим лучшим выбором.
Наконец, вы всегда можете попробовать и посмотреть, будет ли работать вызов ping exec () или system (), или создать сценарий оболочки с привилегиями root, а затем выполнить его с помощью PHP.
Это все способы работы, которые я знаю.
Других решений пока нет …