Для получения полного доступа
зарегистрируйтесь

Блокировка от повторного запуска скриптов в кроне Yii2


Бывают такие задачи, когда нужно сделать запуск скрипта один раз в минуту и чтобы повторный скрипт не выполнялся до тех пор, пока первый скрипт не отработает полностью. Решений много (можно помечать запись(и) в БД и не брать их при след запуске, можно блокироваь фаил для процесса и это самый примитивный способ. На самом деле кода тут под Yii2 совсем мало 1 функция.. Как это работает: создаем файл и делаем на этот файл LOCK, пока процесс работает файл будет заблокирован стоит процессу умереть LOCK с файла спадет сам.

Создаем BaseController для всех наших бедующих контроллеров

<?php

namespace app\commands\base;

use yii\console\Controller;
use Yii;

class BaseController extends Controller
{
    public $lockHandle;
    protected function lockProcess($pid)
    {
        $path = Yii::getAlias('@app/runtime/logs/'.$pid.'.txt');
        
        if(!flock($this->lockHandle = fopen($path, 'w'), LOCK_EX | LOCK_NB)){
            echo "Already runninng\n";
            exit;
        }
        fwrite($this->lockHandle,'run');
    }

    protected function unlockProcess()
    {
        flock($this->lockHandle, LOCK_UN);
        fclose($this->lockHandle);
    }
}

Как пользоватся? наследуем свой класс от BaseController и используем методы

$this->lockProcess('test-pid1');
// тут какой-то тяжелоый код, который любит долго работать
$this->unlockProcess()

Чтобы увидеть комментарии, нужно быть участником сообщества

Регистрация