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