Я хочу наложить ограничение времени на чтение процесса с использованием fgets, открытых popen в PHP.Укажите временные ограничения для popen/fgets в PHP
У меня есть следующий код:
$handle = popen("tail -F -n 30 /tmp/pushlog.txt 2>&1", "r");
while(!feof($handle)) {
$buffer = fgets($handle);
echo "data: ".$buffer."\n";
@ob_flush();
flush();
}
pclose($handle);
Я пытался без успеха:
set_time_limit(60);
ignore_user_abort(false);
Процесс выглядит следующим образом:
- браузер отправить запрос GET ОЖИДАНИИ Ответ в формате HTML5 Server формат событий.
- Запрос принимается балансировщиком нагрузки AWS и составляет , отправленный в экземпляры EC2.
- Ответ на последние 30 строк файла
- Браузер принимает его в 30 сообщениях, и соединение сохраняется.
- Если команда tail отправляет новую строку, возвращается иначе. Fgets ожидает неопределенное время, пока новая строка не будет возвращена из команды tail.
- Балансировщик нагрузки AWS после 60 секунд бездействия сети (без новых линий за 60 секунд) закрывает соединение с браузером. Соединение с экземпляром EC2 не закрыто.
- браузер обнаруживает, что соединение закрывается и открывается новое соединение, процесс возврата к шагу 1.
AS это шаги описывают связь между AWS балансировки нагрузки и экземпляра EC2 никогда не закрывается, через несколько часов/дней выполняется сотни и сотни процессов хвоста и httpd, и сервер не отвечает.
Конечно, это ошибка AWS Load Balancer, но я не хочу начинать процесс, чтобы привлечь внимание от Amazon и ждать исправления.
Моим временным решением является удаление хвоста sudo kill, чтобы убить процесс до того, как сервер станет нестабильным.
Я думаю, что PHP не останавливает сценарий, потому что PHP «заблокирован», ожидая окончания работы fgets.
Я знаю, что ограничение срока службы балансировщика нагрузки AWS редактируется, но я хочу сохранить значение по умолчанию, даже более высокий предел не поможет устранить проблему.
Не знаю, нужно ли мне изменить вопрос о том, как выполнить процесс в Linux с ограничением по времени/тайм-ауту ?.
PHP 5.5.22/Apache 2.4/Linux Kernel 3.14.35-28.38.amzn1.x86_64
Это лучшее, что я мог бы сделать без использования любые расширения. Это не здорово. Вы по-прежнему можете оставить сиротские процессы, если сбой PHP или Apache. Кроме того, вы можете использовать 'SIGKILL' для' proc_terminate'. –