如何中断 PHP 循环?
How to interrupt a PHP loop?
我有一份 Laravel 5.2 的工作,我通常希望 运行 不停地工作。为了说明,假设它生成一些随机数,然后通过事件将其广播到前端。
/**
* Execute the job. Generate a random number.
*/
public function handle()
{
$number = rand();
event(new NumberWasGenerated($number));
}
无论出于何种原因,我希望这份工作 运行 无限期。因此,我做了另一项工作,它循环并不断调度新的 GenerateNumber
jobs.
/**
* Execute the job. Continuously generate numbers.
*
* @return void
*/
public function handle()
{
while (true) {
$this->dispatch(new GenerateNumber());
}
}
不过,我确实希望能够 "turn off" 发电机,我应该决定这样做。这就是我遇到问题的地方。
理想情况下,我希望能够达到像 /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
的 controller
方法中,我有
public function abort()
{
Config::set('shouldGenerate', false);
}
但是,abort
似乎不起作用。我认为问题似乎是 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 服务器的 FLUSHDB HERE
删除当前所选数据库的所有键。这个命令永远不会失败
希望这对您有用。确保您的操作系统用户必须有权通过脚本执行 shell 命令。
我有一份 Laravel 5.2 的工作,我通常希望 运行 不停地工作。为了说明,假设它生成一些随机数,然后通过事件将其广播到前端。
/**
* Execute the job. Generate a random number.
*/
public function handle()
{
$number = rand();
event(new NumberWasGenerated($number));
}
无论出于何种原因,我希望这份工作 运行 无限期。因此,我做了另一项工作,它循环并不断调度新的 GenerateNumber
jobs.
/**
* Execute the job. Continuously generate numbers.
*
* @return void
*/
public function handle()
{
while (true) {
$this->dispatch(new GenerateNumber());
}
}
不过,我确实希望能够 "turn off" 发电机,我应该决定这样做。这就是我遇到问题的地方。
理想情况下,我希望能够达到像 /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
的 controller
方法中,我有
public function abort()
{
Config::set('shouldGenerate', false);
}
但是,abort
似乎不起作用。我认为问题似乎是 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 服务器的 FLUSHDB HERE 删除当前所选数据库的所有键。这个命令永远不会失败
希望这对您有用。确保您的操作系统用户必须有权通过脚本执行 shell 命令。