Сделать PHP сокет тайм-аут подключения
У меня есть небольшое приложение, которое я создал для анализа сетевого подключения. Он запускается из браузера и подключается к локальному серверу PHP/Apache. Затем он просит PHP отправить пакет ping через необработанный сокет. Проблема в том, что если хост, который я пытаюсь пинговать, не жив или не отвечает на пинг, мы никогда не получаем ответа от сервера.
Я считаю, что запрос сокета живет до перезапуска apache. В последнее время я получаю смешанные результаты от своего приложения, и я обвиняю apache использует слишком много сокетов. В настоящее время я установил таймаут вызова AJAX, и я был доволен этим. Но мне действительно нужно, чтобы PHP делал timeouting, чтобы у меня не было 500 000 сокетов, открытых для недоступного хоста.
пример кода:
$sockconn = @socket_connect($socket, $target, null);
if(!$sockconn)
{
$raw['error'] = socket_strerror(socket_last_error());
$raw['status'] = false;
return $raw;
}
Это функция, которая не тайм-аут. Мне нужно сделать тайм-аут. Также время выполнения PHP скрипта не влияет на сокеты.
Я невежественный.
2 ответов
вы можете установить таймауты для чтения и отправки, используя следующие опции:
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec' => 1, 'usec' => 0));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec' => 1, 'usec' => 0));
кроме того, вы можете использовать неблокирующие сокеты и периодически опрашивать сокет, чтобы увидеть, если удаленный хост не ответил.