Сделать 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));

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


попробуйте default_socket_timeout.