Илья, спасибо за пулл-реквест! Полезная штука :)
Вот только думаю надо немного механизм изменить. Вот получается, что есть $_SESSION['Console']['completed'] === false, то скрипт опять выполняется в цикле. А вот рассмотрим такой пользовательский сценарий:
1. Запускаем циклический скрипт, устанавливающий $_SESSION['Console']['completed'] = false;
2. Этот скрипт при выполнении разваливается или еще по какой причине не доходит до того, чтобы установить $_SESSION['Console']['completed'] = true.
3. Запускаем новый скрипт на выполнение, не циклический. Он все равно начнет отрабатываться бесконечно, потому как $_SESSION['Console']['completed'] === false, и true он не устанавливает.
Правильней не $_SESSION['Console']['completed'] === false проверять, а $this->getProperty('progress') == true. То есть в процессе выполнения ты смотришь, если надо повторно выполнить скрипт, то устанавливаешь $this->setProperty('progress', true); И действовать это будетолько на текущий шаг. И так в каждом последующем шаге.