Php 删除laravel中的排队作业

Php 删除laravel中的排队作业,php,laravel,beanstalkd,Php,Laravel,Beanstalkd,我在拉威尔的队列中添加了一些作业。但是,我忘记在函数中放入$job->delete(),函数中有一个错误。这意味着这项工作永远不会结束。它不断被替换到队列中,并在我的日志文件中不断出错。如何从命令行中删除它 我正在使用beanstalkd进行排队。我唯一能做的就是重新启动计算机。找不到删除作业的方法。我以前使用过 否则,我相信您会发现自己正在使用Terminal+telnet,尽管我找不到任何通过telnet删除的文档(仅查看队列中的作业列表) 似乎大多数文章都告诉你在这种情况下删除它们 我使用

我在拉威尔的队列中添加了一些作业。但是,我忘记在函数中放入
$job->delete()
,函数中有一个错误。这意味着这项工作永远不会结束。它不断被替换到队列中,并在我的日志文件中不断出错。如何从命令行中删除它


我正在使用
beanstalkd
进行排队。

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

我以前使用过

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


似乎大多数文章都告诉你在这种情况下删除它们

我使用的是Redis而不是Beanstalk,但这两个版本应该是一样的。重新启动Redis并不能解决问题。我查看了中的
RedisQueues
,发现:

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)=拉拉维尔的模具和转储函数=模具(var_dump($var))

编辑1:用于Redis

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

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

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

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

重启豆茎。在Ubuntu上:

sudo service beanstalkd restart

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


这里是与Laravel 5.1兼容的,它允许您清除Beanstalkd队列。该命令将队列名称作为参数(默认情况下为“default”)。不要忘记在app/Console/Kernel.php中注册它。重要提示:此解决方案仅适用于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中)可以使用

例如,如果要从
队列\u name
管中删除100个就绪作业,可以执行以下操作:

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

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

KEYS *queue*
在持有排队作业的Redis实例上, 然后删除响应中的所有键

DEL queues:default queues:default:reserved

豆茎,对吗?(f在键盘上紧靠d…)对于未来的设计,您可能会对这种适合我的方法感兴趣:+1 FLUSHDB是唯一适合我的方法。如果有一个方法调用我拼错了,一旦我纠正了它,它就不会停止调用错误的方法。找到了这个,它就工作了:)有用的相关博客:只有当beanstalkd服务在内存中运行时,它才工作,但是如果
wal
目录在磁盘上,那么即使重新启动beanstalkd服务也不会工作。另一方面,即使它在命令行中工作,在代码内部实现起来也太难看了