Concurrency Yii2中的锁定控制台批处理

Concurrency Yii2中的锁定控制台批处理,concurrency,yii2,batch-processing,Concurrency,Yii2,Batch Processing,我正在开发一个基于Yii2框架的web应用程序。 每12小时,应用程序需要运行一个批处理过程来更新一些DB表,这需要5-10秒。为此,我创建了一个控制台命令(比如./yii dummy/index),windows任务调度器使用.bat脚本调用该命令。但是,在运行任务时,应用程序Web GUI仍在运行。Yii2是否在执行任务时自动停止任何web交互,或者我是否应该手动锁定系统以避免任何不一致性问题?如果是这样,我如何在执行控制台进程时停止web交互,并在完成后重新启动它们?控制台和web应用程序

我正在开发一个基于Yii2框架的web应用程序。
每12小时,应用程序需要运行一个批处理过程来更新一些DB表,这需要5-10秒。为此,我创建了一个控制台命令(比如./yii dummy/index),windows任务调度器使用.bat脚本调用该命令。但是,在运行任务时,应用程序Web GUI仍在运行。Yii2是否在执行任务时自动停止任何web交互,或者我是否应该手动锁定系统以避免任何不一致性问题?如果是这样,我如何在执行控制台进程时停止web交互,并在完成后重新启动它们?

控制台和web应用程序是完全自主的。运行控制台命令不会阻止web应用程序运行

解决此问题的最简单方法是在console命令中设置某种互斥,并在web应用程序中检查它。为此,Yii2提供了各种互斥类,这些互斥类都源于

将互斥体添加到控制台和web应用程序配置:

'mutex' => [
    'class' => 'yii\mutex\MysqlMutex',
],
在console命令中,您需要获取互斥锁(允许它等待几秒钟):

完成后,将其释放:

Yii::$app->mutex->release('example-mutex');
然后在web应用程序中检查互斥锁是否可用。我相信当前的应用程序模板将生成扩展
yii\web\Controller
类的控制器。您应该创建自己的基本控制器类,扩展
yii\web\controller
,并在操作之前定义其
方法:

class BaseController extends \yii\web\Controller
{
    public function beforeAction($action)
    {
        $mutexResult = Yii::$app->mutex->acquire('example-mutex', 20);
        if ($mutexResult) {
            Yii::$app->mutex->release('example-mutex');
        } else {
            echo 'Console app is running';
            return false;
        }
        return parent::beforeAction($action);
    }
}
然后从此
BaseController
类扩展所有web应用程序的控制器

这样,在执行任何操作之前,Yii将检查此标志

class BaseController extends \yii\web\Controller
{
    public function beforeAction($action)
    {
        $mutexResult = Yii::$app->mutex->acquire('example-mutex', 20);
        if ($mutexResult) {
            Yii::$app->mutex->release('example-mutex');
        } else {
            echo 'Console app is running';
            return false;
        }
        return parent::beforeAction($action);
    }
}