Как автоматически убивать процессы PHP с бесконечными циклами на уровне сервера
У меня есть песочница на моем сервере, где я позволяю пользователям запускать свои собственные сценарии PHP. Если PHP-скрипт имеет бесконечный цикл, он останавливается только тогда, когда Apache останавливает процесс (30 секунд), что явно не идеально. Я знаю, что некоторые веб-хосты автоматически убивают PHP-скрипт, который слишком долго потребляет слишком много процессора. Как реализовать что-то подобное на уровне сервера в Linux, но не убивая процессы PHP, которые занимают много времени (например, с помощью операторов сна или ожидания сетевой задержки)?
И в качестве дополнительного вопроса, как я могу сделать то же самое с использованием памяти? Я знаю, что в PHP встроены ограничения памяти, но в эту изолированную программную среду входит расширение PHP, которое не реализует эти ограничения до тех пор, пока управление не вернется обратно в PHP. В этот момент, если процесс превысил предел, он уничтожен, но к тому времени он тоже поздно. Тем временем он мог бы выгружать весь подкачки, что привело бы к ползанию сервера.
1 ответ
Вы можете заблокировать его в Apache с помощью RLimitCPU и RLimitMem.
Или вы можете арендовать весь процесс через определенные промежутки времени от самой ОС.