【问题标题】:Locking console batch process in Yii2Yii2中锁定控制台批处理
【发布时间】:2015-12-01 16:16:01
【问题描述】:

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

【问题讨论】:

    标签: concurrency yii2 batch-processing


    【解决方案1】:

    控制台和网络应用程序是完全自主的。运行控制台命令绝不会阻止 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 将在执行任何操作之前检查此标志。

    【讨论】:

      猜你喜欢
      • 2011-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2014-07-15
      • 2012-01-16
      • 2012-08-20
      相关资源
      最近更新 更多