我正在开发一个基于Yii2框架的web应用程序。每12个小时,应用程序需要运行一个批处理过程来更新一些DB表,这需要5-10秒。为此,我创建了一个控制台命令(比如./yii dummy/index),windows任务调度程序使用.bat脚本调用该命令。但是,在运行任务时,应用程序Web GUI仍在运行。在执行任务时,Yii2是否会自动停止任何web交互,或者我是否应该手动锁定系统以避免任何不一致问题?如果是这样,我如何在执行控制台进程时停止web交互,并在完成后重新启动它们?
发布于 2015-12-09 04:58:43
控制台和web应用程序是完全自主的。运行控制台命令绝不会阻止web应用程序的运行。
解决这个问题最简单的方法是在你的控制台命令中设置某种互斥量,然后在你的web应用程序中检查它。为此,Yii2提供了各种互斥类,它们都是从yii\mutex\Mutex派生的。
您可以在控制台和web应用程序配置中添加一个互斥锁:
'mutex' => [
'class' => 'yii\mutex\MysqlMutex',
],在控制台命令中,您需要获取互斥锁(允许它等待几秒钟):
$mutexResult = Yii::$app->mutex->acquire('example-mutex', 10);
if ($mutexResult) {
echo 'Could not acquire lock'.PHP_EOL;
Yii::$app->end();
}当你完成后,释放它:
Yii::$app->mutex->release('example-mutex');在您的web应用程序中,然后检查互斥是否可用。我相信当前的应用程序模板将生成扩展yii\web\Controller类的控制器。您应该创建自己的扩展yii\web\Controller的基本控制器类,并定义它的beforeAction方法:
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将在执行任何操作之前检查此标志。
https://stackoverflow.com/questions/34024910
复制相似问题