Вот решение для Yii2 с использованием MySQL.Если вы поместите запрос / обновление статуса в транзакцию, у вас может быть несколько рабочих на разных компьютерах.
cron table
Field | Type
--------------+-------------
id | int(11)
execute_after | timestamp
executed_at | timestamp
status | int(11)
progress | int(11)
action | varchar(255)
parameter | varchar(255)
result | varchar(255)
Cron class
/** This command waits for jobs to work on by polling the DB every 10s. TODO put this into Redis.
*
*/
public function actionIndex()
{
do {
$job = Cron::find()->where('execute_after < :now AND status = 0 ORDER BY id ASC', [':now'=>date(DATE_ATOM)])->one();
if($job && method_exists($this, $job->action)){
$job->status = 1;
$job->save() or Yii::error($job->getErrors());
$result = $this->{$job->action}($job, $job->parameter);
$job->status = 2;
$job->progress = 100;
$job->executed_at = date(DATE_ATOM);
$job->save() or Yii::error($job->getErrors());
}
sleep(10);
} while (true);
}
Тогда у вас могут быть задачи в классе, такие как
function toggleStatus($job, $id) {
, которые выполняют работу и обновляют ход выполнения задания по завершении.