如何中断PHP循环?

时间:2016-02-15 03:28:41

标签: php laravel-5 interrupt jobs

我有一个 Laravel 5.2 工作,我通常希望不停地运行。为了说明,假设它生成一些随机数,然后通过事件将其广播到前端。

/**
 * Execute the job. Generate a random number.
 */
public function handle()
{
    $number = rand();
    event(new NumberWasGenerated($number)); 
}

无论出于何种原因,我希望这份工作无限期地运作。所以,我做了另一个循环并继续调度新GenerateNumber工作的工作。

/**
 * Execute the job. Continuously generate numbers.
 *
 * @return void
 */
public function handle()
{
    while (true) {
        $this->dispatch(new GenerateNumber());
    }
}
然而,我确实希望能够在关闭时“关闭”发电机。这是我遇到麻烦的地方。

理想情况下,我希望能够点击/abort这样的路由,然后将中断发送到我的生成器循环并停止执行。我怎么能这样做?

或者,我可以尝试投票方法。我尝试使用类似的东西:

/**
 * Execute the job. Continuously generate numbers.
 *
 * @return void
 */
public function handle()
{
    Config::set('shouldGenerate', true);

    while (Config::get('shouldGenerate')) {
        $this->dispatch(new GenerateNumber());
    }
}

然后,在我的controller /abort方法中,我有

public function abort()
{
    Config::set('shouldGenerate', false);
}

然而,abort似乎不起作用。我认为问题似乎是abort方法永远不会有机会执行,因为生成器循环是一个捣蛋鬼,但我不确定为什么会这样。

问题:

1)我可以使用中断方法实现这一目标吗? 2)如果没有,我如何通过民意调查来实现这一目标?

1 个答案:

答案 0 :(得分:2)

您可以通过两个选项

的组合来实现这一目标
  • 中断
  • 投票

您可以按照以下方式重写中止操作

public function abort()
{
    Config::set('shouldGenerate', false);
    exec('PATH/TO/YOUR/RDIS/SERVER/src/redis-cli FLUSHDB');    
}

并按如下方式更改句柄方法:

/**
 * Execute the job. Continuously generate numbers.
 *
 * @return void
 */
public function handle()
{
    $shouldGenerate = Config::get('shouldGenerate');
    while ($shouldGenerate) {
        $this->dispatch(new GenerateNumber());
    }
}

您可以阅读有关Redis服务器FLUSHDB的更多信息HERE 删除当前所选数据库的所有键。该命令永远不会失败

我希望这对你有用。确保您的操作系统用户必须具有通过脚本执行shell命令的权限。