"реальный" срок выполнения

Используя set_time_limit() или max_execution_time, не "действительно" ограничивает ( кроме Windows) время выполнения, потому что, как указано в руководстве PHP:

Примечание:

Функция set_time_limit() и директива конфигурации max_execution_time влияют только на время выполнения scriptсам. Любое время, потраченное на деятельность, которая происходит вне казни из script, например системных вызовов с использованием system(), операций потока, запросы базы данных и т.д. не учитываются при определении максимального время работы script. Это не относится к Windows где измеренное время является реальным.

Решение предлагаемое в комментариях PHP, чтобы иметь "реальное" время выполнения, как то, что я ищу, но я нашел его нечеткий/запутанный.

Ответ 1

Возможно, я ошибаюсь, но насколько я понимаю, вы запрашиваете объяснение кода решения "PHP comments".

Хитрость заключается в том, чтобы создать дочерний процесс, используя функцию pcntl_fork, которая завершит исходный (родительский) процесс после некоторого таймаута. Функция pcntl_fork возвращает идентификатор процесса только что созданного дочернего процесса в потоке выполнения родительского процесса и ноль в потоке выполнения дочернего процесса. Это означает, что родительский процесс выполнит код в выражении if, а дочерний процесс выполнит код под else. И, как мы видим из кода, родительский процесс будет выполнять бесконечный цикл, пока дочерний процесс будет ждать 5 секунд, а затем убьет его родителя. Поэтому в основном вы хотите сделать что-то вроде этого:

$real_execution_time_limit = 60; // one minute

if (pcntl_fork())
{
    // some long time code which should be
    // terminated after $real_execution_time_limit seconds passed if it not
    // finished by that time
}
else
{
    sleep($real_execution_time_limit);
    posix_kill(posix_getppid(), SIGKILL); 
}

Надеюсь, я хорошо это сделал. Сообщите мне, если у вас есть вопрос относительно этого решения.