如何中断PHP循环?

如何中断PHP循环?,php,laravel-5,interrupt,jobs,Php,Laravel 5,Interrupt,Jobs,我有一份Laravel 5.2的工作,我通常希望不间断地运行。例如,假设它生成一些随机数,然后通过事件将其广播到前端 /** * Execute the job. Generate a random number. */ public function handle() { $number = rand(); event(new NumberWasGenerated($number)); } 不管出于什么原因,我希望这项工作无限期地运行。因此,我做了另一个作业,它循环并不

我有一份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());
    }
}
然后,在我的
控制器中
/abort
方法中

public function abort()
{
    Config::set('shouldGenerate', false);
}
但是,
中止
似乎不起作用。我认为问题似乎在于,
abort
方法从未得到执行的机会,因为生成器循环是一个球猪,但我不确定为什么会出现这种情况

问题: 1) 我可以使用中断方法来实现这一点吗?

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 server的FLUSHDB的更多信息 删除当前选定数据库的所有键。这个命令永远不会失败


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

您可以通过组合这两个选项来实现这一点

  • 打断
  • 投票
您可以按如下方式重写中止操作

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 server的FLUSHDB的更多信息 删除当前选定数据库的所有键。这个命令永远不会失败



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

您的中止将不起作用,因为在方法运行时,您正在将
shouldGenerate
设置为
true
。您应该在设置之前进行检查,以确保它存在。i、 e.(
if(空(Config::get('shouldGenerate')){Config::set('shouldGenerate',true);}
)我想说你应该使用laravel内置的
任务调度
真理测试约束
进行个人测试。根据我的理解,你可以尝试使用
中断
方法,这将是比轮询更好的选择。@AlankarMore你能解释一下我会怎么做吗?你使用的是linux机器吗?排队的司机是谁?我的意思是redis或其他?您的中止不起作用,因为在方法运行时,您正在将
shouldGenerate
设置为
true
。您应该在设置之前进行检查,以确保它存在。i、 e.(
if(空(Config::get('shouldGenerate')){Config::set('shouldGenerate',true);}
)我想说你应该使用laravel内置的
任务调度
真理测试约束
进行个人测试。根据我的理解,你可以尝试使用
中断
方法,这将是比轮询更好的选择。@AlankarMore你能解释一下我会怎么做吗?你使用的是linux机器吗?排队的司机是谁?我是说redis或其他?谢谢,这似乎对停止生成循环非常有效。。。唯一的问题是,现在我无法正确地重新启动它。我首先设置
Config::set('shouldGenerate',true)但它似乎只运行一次,然后退出,我无法让它再次循环???我想问题是我刚刚冲掉了我的
Config
s。似乎
shouldGenerate
现在设置为
null
。即使我再次尝试使用
设置
,并且即使我执行了
迁移:刷新
操作,您也可以按文件系统管理,而不是将值保存在配置中。因为根据我的理解,如果您使用了
php artisan缓存:clear
,它将清除您的配置。因此,只需从文件中读取json,该文件的值为
shouldGenerate
,然后根据需要重新设置。我们使用的
会话
很简单,就是PHP使用
文件
作为驱动程序。这很有意义,我稍后回去工作时会尝试一下。谢谢你的帮助。谢谢,这似乎对停止生成循环非常有效。。。唯一的问题是,现在我无法正确地重新启动它。我首先设置
Config::set('shouldGenerate',true)但它似乎只运行一次,然后退出,我无法让它再次循环???我想问题是我刚刚冲掉了我的
Config
s。似乎
shouldGenerate
现在设置为
null
。即使我再次尝试使用
设置
,并且即使我执行了
迁移:刷新
操作,您也可以按文件系统管理,而不是将值保存在配置中。因为根据我的理解,如果您使用了
php artisan缓存:clear
,它将清除您的配置。因此,只需从文件中读取json,该文件的值为
shouldGenerate
,然后根据需要重新设置。我们使用的
会话
很简单,就是PHP使用
文件
作为驱动程序。这很有意义,我稍后回去工作时会尝试一下。谢谢你的帮助。