Бывают такие задачи, когда нужно сделать запуск скрипта один раз в минуту и чтобы повторный скрипт не выполнялся до тех пор, пока первый скрипт не отработает полностью. Решений много (можно помечать запись(и) в БД и не брать их при след запуске, можно блокироваь фаил для процесса и это самый примитивный способ. На самом деле кода тут под 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()