Сделайте тайм-аут подключения 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-скрипта НЕ влияет на сокеты.

Я ничего не понимаю.

Author: Axel Latvala, 2012-08-09

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));

В качестве альтернативы вы можете использовать неблокирующие сокеты и периодически опрашивать сокет, чтобы узнать, ответил ли удаленный хост.

 10
Author: Sjoerd, 2012-08-10 10:47:04

Попробуйте установить default_socket_timeout по умолчанию.

 0
Author: Sjoerd, 2012-08-09 10:50:19