Ответ
Да, бесконечный цикл реализуется стандартными языковыми конструкциями. Основные способы:
// 1. Использование while(true)
while (true) {
// Тело цикла
if ($shouldExit) {
break; // Критически важный механизм выхода
}
usleep(100000); // Часто добавляют задержку в долгосрочных циклах
}
// 2. Использование for без условий
for (;;) {
// Тело цикла
if ($shouldExit) {
break;
}
}
Контекст использования и важные предостережения:
| Контекст | Особенности |
|---|---|
| Веб-запрос (FPM, Apache) | Цикл будет принудительно прерван по истечении max_execution_time (обычно 30 сек). Это приведет к фатальной ошибке и незавершенному ответу пользователю. Практически никогда не нужно. |
| CLI-скрипты (командная строка) | Основная область применения. Используется для демонов, воркеров очередей, слушателей. Обязательно нужен механизм graceful shutdown (обработка сигналов SIGTERM, SIGINT). |
| Тестирование/Отладка | Может использоваться для симуляции нагрузки или отладки параллельных процессов. |
Пример CLI-демона с обработкой сигналов:
declare(ticks=1);
$running = true;
pcntl_signal(SIGTERM, function () use (&$running) {
$running = false;
echo "Получен сигнал завершения.n";
});
while ($running) {
// Проверка новых задач в очереди (например, из Redis или Beanstalkd)
// $task = $queue->reserve();
// if ($task) { ... обработать задачу ... }
sleep(1); // Избегаем busy waiting
}
echo "Демон завершил работу.n";