首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >锁定Yii2中的控制台批处理

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

Stack Overflow用户
提问于 2015-12-02 00:16:01
回答 1查看 573关注 0票数 0

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

EN

回答 1

Stack Overflow用户

发布于 2015-12-09 04:58:43

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

解决这个问题最简单的方法是在你的控制台命令中设置某种互斥量,然后在你的web应用程序中检查它。为此,Yii2提供了各种互斥类,它们都是从yii\mutex\Mutex派生的。

您可以在控制台和web应用程序配置中添加一个互斥锁:

代码语言:javascript
复制
'mutex' => [
    'class' => 'yii\mutex\MysqlMutex',
],

在控制台命令中,您需要获取互斥锁(允许它等待几秒钟):

代码语言:javascript
复制
$mutexResult = Yii::$app->mutex->acquire('example-mutex', 10);
if ($mutexResult) {
    echo 'Could not acquire lock'.PHP_EOL;
    Yii::$app->end();
}

当你完成后,释放它:

代码语言:javascript
复制
Yii::$app->mutex->release('example-mutex');

在您的web应用程序中,然后检查互斥是否可用。我相信当前的应用程序模板将生成扩展yii\web\Controller类的控制器。您应该创建自己的扩展yii\web\Controller的基本控制器类,并定义它的beforeAction方法:

代码语言:javascript
复制
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将在执行任何操作之前检查此标志。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34024910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档