Concurrency Yii2中的锁定控制台批处理
我正在开发一个基于Yii2框架的web应用程序。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应用程序
每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);
}
}