Здраствуйте, подскажите, пожалуйста, в каком направлении копать. Есть сервер на пхп, который работает с сокетами. Сервер запущен с set_time_limit(0); Делаем socket_write() и ждем ответа от клиента socket_read(). Клиент определенное время не отвечает, скажем, секунд 10 и соединение с ним надо закрыть socket_close(). Есть ли возможность в пхп запустить таймер и по его истечении выполнить код? Может какие-то еще есть варианты? Заранее спасибо за ответы.
1. проверять на наличие данных в сокете PHP: <? $s = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($s, '127.0.0.1', 11000); socket_listen($s); $inc = socket_accept($s); $read = array($inc); $write = null; $except = null; $numChangedSockets = socket_select($read, $write, $except, floor($timeout), ceil($timeout*1000000)); $canReadFromSocket = $numChangedSockets > 0; 2. использовать будильник unix PHP: <? declare(ticks = 1); $s = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($s, '127.0.0.1', 11000); socket_listen($s); $inc = socket_accept($s); // будильник function signal_handler() { global $inc; socket_close($inc); $inc = null; echo 'TIMEOUT'; } pcntl_signal(SIGALRM, 'signal_handler', true); pcntl_alarm(5); echo socket_read($inc, 1024); 3. неблокирующиеся сокеты PHP: <? $s = socket_create(AF_INET, SOCK_STREAM, 0); socket_bind($s, '127.0.0.1', 11000); socket_listen($s); $inc = socket_accept($s); socket_set_nonblock($inc); $timeStart = microtime(true); do { if (5 < microtime(true)-$timeStart) { echo 'TIMEOUT'; break; } $result = socket_read($inc, 1024); } while($result === false);
Спасибо за развернутый ответ. Вариант 3 наиболее мне подходит, буду тестировать. Вариант 1. Согласно php_manual_ru.chm Вариант 2. Сервер работает под линуксом, но тестирую я под виндовз. Кстати, может подскажете, надо ли делать какие-то особые настройки apache+php при использовании сокетов? Сейчас работают 2 клиента, но ожидается подключение 100+ клиентов к серверу раз в сутки. Ежедневный трафик с каждым клиентом порядка 5 килобайт (входящий+исходящий).