繁体   English   中英

删除 Laravel 中排队的作业

[英]Deleting queued jobs in laravel

我在 Laravel 的队列中添加了一些作业。 但是,我忘记在函数中放置$job->delete()并且我的函数中有错误。 这意味着工作永无止境。 它不断被替换到队列中,并在我的日志文件中不断出错。 如何从命令行中删除它?

我正在使用beanstalkd进行排队。

我使用的是 Redis 而不是 Beanstalkd,但这在两者中应该是相同的。 重启Redis并不能解决问题。 我看着RedisQueues文档Laravel 4.2 API ,结果发现:

public Job|null pop(string $queue = null)
  //Pop the next job off of the queue.

如果您查看BeanstalkedQueue

我把它放在 dd* 内的app/routes.php ,加载了那个页面,瞧。

Route::get('/', function() {
  dd(Queue::pop());
  #return View::make('hello');
});

注意:每个队列重新加载一次页面。

队列被从堆栈中拉出。 我想看到一个更干净的解决方案,但这对我来说不止一次。

*dd($var) = Laravel 的 die 和 dump 函数 = die(var_dump($var))

编辑 1:对于 Redis

以上显然不是最好的解决方案,所以这里有一个更好的方法。 小心!

FLUSHDB - 删除当前选定数据库的所有键。 这个命令永远不会失败。

对于 Redis 使用FLUSHDB 这将刷新 Redis 数据库而不是 Laravel 的数据库。 在终端中:

$ redis-cli
127.0.0.1:6379> FLUSHDB
OK
127.0.0.1:6379> exit

重新启动豆茎。 在 Ubuntu 上:

sudo service beanstalkd restart

我做了一个工匠命令,它将清除您队列中的所有作业。 您可以选择指定连接和/或管道。

https://github.com/morrislaptop/laravel-queue-clear

重要说明:此解决方案仅适用于 beanstalk

有两种解决方案:

1- 从你的 PHP 代码

要以编程方式删除作业,您可以执行以下操作:

    //Que the job first. (YourJobProcessor is a class that has a method called fire like `fire($job,$data)`
    $res = Queue::later(5, YourJobProcessor::class, $data, 'queue_name');
    //get the job from the que that you just pushed it to
    $job = Queue::getPheanstalk()->useTube("queue_name")->peek($res);
    //get the job from the que that you just pushed it to
    $res = Queue::getPheanstalk()->useTube("queue_name")->delete($job);

如果一切顺利,作业将不会执行,否则作业将在 5 秒后执行

2- 从命令行(仅限 Linux 和 Mac)

从命令行(在 linux 和 mac 中),您可以使用beanstool

例如,如果您想从queue_name管中删除 100 个就绪作业,您可以执行以下操作:

  for i in {1..100}; do beanstool delete -t queue_name --state=ready; done

我唯一能做的就是重新启动我的电脑。 找不到删除作业的方法。

我过去使用过这个基于 php 的 web 管理控制台

否则,我相信您会发现自己在使用终端 + telnet,尽管我找不到任何通过 telnet 删除的文档(只需查看队列中的作业列表)。

似乎大多数文章都告诉您在这种情况下使用您选择的代码+库并循环队列作业来删除它们。

这是 Laravel 5.1 兼容命令,它允许您清除 Beanstalkd 队列。 该命令将队列名称作为参数(默认为“默认”)。 不要忘记在 app/Console/Kernel.php 中注册

对于 Redis 用户,我使用 redis-cli 运行以下命令,而不是刷新:

KEYS *queue*

在持有排队作业的 Redis 实例上,然后删除响应中的任何键

DEL queues:default queues:default:reserved

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM