сеть — PHP: Как я могу пинговать IP-адрес быстрее

Я использую exec («ping». $ Server-> ip, $ output, $ result); функция, и я пытаюсь пинговать несколько IP-адресов, и это занимает слишком много времени, чтобы пинговать их по одному. Есть ли более быстрый способ пинговать их?

    //In my controller
$servers = Server::orderBy('created_at', 'desc')->paginate(10);

foreach ($servers as $server)
{
exec("ping " . $server->ip, $output, $result);

if($result != 0)
{
$server->status = 0;
}
else
{
$server->status = 1;
}

}

0

Решение

Итак, вот два метода:

  1. используя пакетный файл
  2. с помощью fsockopen() функция

1. используя пакетный файл:

зачем его использовать, потому что большую часть времени тратится на создание оболочки каждый раз, когда вы вызываете exec функция, поэтому идея состоит в том, чтобы создать мини-программу, которая перебирает ваши IP-адреса в командной строке, вызывая system Команда PHP только один раз, так что вот что вам нужно сделать и объяснение после.
-создание командного файла batch.bat в каталоге doucment_root вставьте в него следующие команды:

set list=172.30.240.56 172.30.240.57 172.30.240.58
(for %%a in (%list%) do (
ping -n 1 %%a
));

Вы можете заполнить список выше по вашим IP-адресам, разделенным white_spaces.
ping -n 1 это пинг только один раз, так как вам нужна скорость

Then in your script, it will be as simple as putting:
echo '<pre>';
exec('cmd /c .\batch.bat',$result);
/* $result is an array of lines of the output that you can easily access
look at the result obtained by using print_r($result); below

вы даже можете автоматически создать пакетный файл в сценарии PHP при условии, что у вас есть необходимые разрешения (которые вы, вероятно, получите, поскольку можете запустить exec), набрав:

$servers = Server::orderBy('created_at', 'desc')->paginate(10);
$batch_string=' set list=';
foreach ($servers as $server)
$batch_string.=$server->ip.' ';
$batch_string.= "\n (for %%a in (%list%) do (
ping -n 1 %%a
));";
file_put_contents('batch.bat',$batch_string);
echo '<pre>';
exec('cmd /c .\batch.bat',$result);

Я проверил это с www.google.com а также 172.30.240.56 и я получил следующий результат:
(обратите внимание, что для второго IP-адреса сбой проверки связи не выполняется)

Array
(
[0] =>
[1] => C:\Batch_File_path>set list=www.google.com 172.30.240.56
[2] =>
[3] => C:\Batch_File_path>(for %a in (www.google.com 172.30.240.56) do (ping -n 1 %a  ) )
[4] =>
[5] => C:\Batch_File_path>(ping -n 1 www.google.com  )
[6] =>
[7] => Pinging www.google.com [172.217.23.196] with 32 bytes of data:
[8] => Reply from 172.217.23.196: bytes=32 time=84ms TTL=48
[9] =>
[10] => Ping statistics for 172.217.23.196:
[11] =>     Packets: Sent = 1, Received = 1, Lost = 0 (0% loss),
[12] => Approximate round trip times in milli-seconds:
[13] =>     Minimum = 84ms, Maximum = 84ms, Average = 84ms
[14] =>
[15] => C:\Batch_File_path>(ping -n 1 172.30.240.56  )
[16] =>
[17] => Pinging 172.30.240.56 with 32 bytes of data:
[18] => Request timed out.
[19] =>
[20] => Ping statistics for 172.30.240.56:
[21] =>     Packets: Sent = 1, Received = 0, Lost = 1 (100% loss),
)

2. используя fsockopen команда:

используйте сокеты, это встроенный в PHP, так что быстрее и проще поддерживать и обнаруживать ошибки, вот пример кода для проверки связи с IP-адресом

$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
if (!$fp) {
echo "$errstr ($errno)<br />\n";
} else {
$out = "GET / HTTP/1.1\r\n";
$out .= "Host: www.google.com\r\n";
$out .= "Connection: Close\r\n\r\n";
fwrite($fp, $out);
while (!feof($fp)) {
echo fgets($fp, 128);
}
fclose($fp);
}
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]