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