2014-10-16 4 views
0

Я использую расширение Yii runactions для запуска фоновых процессов, я пытаюсь обновить массивные записи (6000) в качестве фонового процесса, но только около 2500 записей, только обновленных в БД !!! Я не получаю ошибок в журнале, связанной с проблемой интервала или таймаута?Yii background process issue

Я пытаюсь изменить интервал во время выполнения, но нет никакого эффекта, может ли кто-нибудь помочь мне разобраться в этой проблеме?

+0

Я раньше не использовал _runactions_, но для того, чтобы помочь в разговоре, можем ли мы предположить, что вы используете ERunActions :: runBackground(), который является 4-м используемым случаем в вставленной ссылке? Кроме того, 2500 записей обновили первые 2500 из 6000? – Jerome

+0

Да его первые 2500 записей –

+0

Это, вероятно, связано с тайм-аутом вашего PHP-скрипта. http://php.net/manual/en/function.set-time-limit.php – topher

ответ

1

Это расширение выполняет фоновое задание на уровне http, поэтому вы должны управлять максимальным временем выполнения скрипта, я не думаю, что это расширение позаботится об этом. В случае выполнения командной строки максимальное время выполнения не применяется.

http://php.net/manual/en/info.configuration.php#ini.max-execution-time

Обычно в течение длительного процесса, а не отключить tiemout, я увеличиваем его в цикле, что-то вроде этого:

while ($i <= 10) { 
    my_complex_update_query(); 
    echo "Timeout is : " . ini_get('max_execution_time') . " sec.<br>"; 
    set_time_limit(ini_get('max_execution_time') + 1);  
    echo "NEW Timeout is : " . ini_get('max_execution_time') . " sec.<br>"; 
    $i++; 
} 

Это приращение лимит времени добавления 1 сек в каждом цикле, очевидно, вы должны адаптировать его к своей потребности, например, добавить 1 сек каждые 10 циклов. Таким образом, если скрипт застрял по какой-то причине, он все равно будет тайм-аут и не будет висеть в памяти.

Учитывайте, что внешний вызов (например, запрос базы данных, exec системного вызова ...) не учитывается во время выполнения скрипта. Итак, если ваш скрипт исполняется в 5 секунд, вы выполняете запрос, выполняющий 2 минуты для выполнения, когда скрипт переходит к следующей инструкции, время выполнения составляет 5 секунд, а не 2 мин + 5 секунд.