Laravel排队不起作用

时间:2017-02-09 10:05:03

标签: php laravel webhooks

我正在使用laravel队列在facebook帖子上发表评论。什么时候我收到facebook webhook的数据,基于收到的细节我 评论帖子。要从facebook webhook一次处理100个响应,我正在使用laravel队列,以便它可以逐个执行。 我使用了https://scotch.io/tutorials/why-laravel-queues-are-awesome

中提到的分步流程
public function webhooks(Request $request)
{
    $data = file_get_contents('php://input');
        Log::info("Request Cycle with Queues Begins");
        $job = (new webhookQueue($data)->delay(10);
        $this->dispatch($job);
        Log::info("Request Cycle with Queues Ends");
}

这是我的工作类结构

class webhookQueue extends Job implements ShouldQueue

{

使用InteractsWithQueue,SerializesModels;

private $data;

public function __construct($data)
{
    $this->data = $data;
}

public function handle()
{
   //handling the data here 
}

}

我正在连续点击webhooks()函数,所有作业同时工作但不在队列中,没有任何作业存储在作业表中,我已经给出延迟但它也没有工作,请一些人帮助我,我从昨天开始尝试,但没有结果。

这是我登录laravel.log

[2017-02-08 14:18:42] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:44] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:47] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:48] local.INFO: Request Cycle with Queues Begins  
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:18:55] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:18:59] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:00] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends  
[2017-02-08 14:19:01] local.INFO: Request Cycle with Queues Ends

13 个答案:

答案 0 :(得分:14)

使用队列你应该做一些工作:

<。>在.env文件中,您应该将queue_drive从同步更改为数据库

之后,您应该使用artisan命令在数据库中创建队列表:

php artisan queue:table
php artisan migrate

最后,您应该使用php artisan queue:listenphp artisan queue:work

运行您的队列

答案 1 :(得分:5)

我遇到了同样的麻烦,如果您使用的是laravel 5.7,请在.env文件中使用它

QUEUE_CONNECTION=database

像这样清除配置缓存后

php artisan config:cache

答案 2 :(得分:4)

确保您的应用程序未处于维护模式...我已经维护了我的应用程序,但是允许我的本地IP地址...我不知道为什么它没有运行。我最后必须去调试WorkCommand才能发现...

./工匠向上;

答案 3 :(得分:4)

就我而言,我使用自定义队列名称对作业进行分组。

ProcessCourseInteractions::dispatch($courseProcessing)->onQueue('course_interactions');

该队列不是由以下人员执行的:

php artisan queue:work

php artisan queue:listen

我需要指定队列名称(对工作和收听有效):

php artisan queue:work --queue=course_interactions

答案 4 :(得分:2)

Laravel 5.7的更新:

.env中,设置QUEUE_CONNECTION=database,以使分派的作业进入数据库驱动程序。

然后:

 # Creates a migration for the database table holding the jobs
php artisan queue:table

 # Executes the migration
php artisan migrate

 # Kicks off the process that executes jobs when they are dispatched
php artisan queue:work

答案 5 :(得分:1)

我看到你已经有了队列表。

尝试运行php artisan queue:listen --tries=3php artisan queue:work

队列工作是每个命令只执行一个Job。因此,如果表中有20个作业,则可能需要运行20次队列工作。这就是你可以运行queue:listen命令的原因。但它占用了大量的CPU。

在服务器中,您可能希望在后台运行队列侦听最多3次尝试。 在终端/命令提示符下SSH到您的服务器。然后CD到工匠文件所在的项目目录。运行此命令:

nohup php artisan queue:listen --tries=3 > /dev/null 2>&1 &

在这种情况下,作业将在后台自动处理。你只需要派遣这份工作。我建议使用失败的作业表。如果您正在使用后台队列列表器。

希望这有帮助。

答案 6 :(得分:1)

别跟我犯同样的错误

我在错误的目录中运行php artisan queue:work

仅浪费30分钟,可能会更长。

答案 7 :(得分:1)

只需在 .env 文件中设置 QUEUE_CONNECTION=database

答案 8 :(得分:0)

被接受的答案对我来说是个问题,但我也想解决了我解决的另外两个类似问题,也许它们会帮助到这里的其他人。

其他问题1 :工作创建(构造函数)有效,但工作处理程序无法启动-永远

  • 永远是关键,因为通常,如果没有一个触发,则可能是因为您的工作代码已修改,您的队列应重新启动。

其他问题2 :工作创建(构造函数)有效,但工作处理程序无法执行-有时

  • 有时对您而言是正确的时,则可能是您未解雇的工作是因为它们是在交易中发生的,例如DB::beginTransaction

假设我想要即使在交易过程中也要解雇,我可以这样做:

/**
 * Create a new job instance.
 *
 * @return void
 */
public function __construct($errorInfo)
{
    $this->errorInfo = $errorInfo;

    // Queues won't run the handlers during transactions
    // so, detect the level, and if it is not 0, rollback to force job handling
    if (\DB::transactionLevel() != 0) {
        \DB::rollBack();
    }
}

但不要这样做,除非您想要解雇您的工作并强行回滚。我的情况很独特,因为我的工作会发送致命错误的电子邮件,所以我希望它被解雇,因为无论如何我都会出错,这会破坏流程(回滚将会发生,并且由于未捕获的错误而无法计划)。

在这种情况下,您不想这样做:

  • 您的工作在付款成功后会向用户发送电子邮件
  • 您的付款成功或失败
  • 取决于成功付款,您回滚或提交

您应该安排调度,使其在回滚或提交之后发生。 我没有这份工作,因为当我无法预测时(致命错误)就会发生这种情况。但是,如果您有控制权,例如知道您的付款成功,在承诺后退出或退出所有级别的交易!

我不确定在交易中触发作业的行为,然后然后回滚或提交。如果通过添加延迟无法正常工作,则可以解决此问题,但这似乎是不可靠的(猜测等待多长时间),除非出现明显的延迟。

答案 9 :(得分:0)

对于那些问题的未来读者来说,如果队列在以前工作过但不再工作了,请尝试从数据库的jobs表中删除所有对我有用的东西。

答案 10 :(得分:0)

一切都设置好了,但仍然无法正常工作,然后确保在 crontab -e 上添加了时间表 * * * * * cd /var/www/html/<project_name> && php artisan schedule:run >> /dev/null 2>&1

答案 11 :(得分:0)

您可以通过以下方式重试(我假设您在 Laravel 文档中做了说明,但总有一天它不起作用):

第 1 步:删除数据库中的表“jobs”。

第 2 步:在控制台中运行命令 'php artisan migrate' 以再次创建表 'jobs'。

第 3 步:在控制台中运行命令 'php artisan queue:work'

第 4 步:重试您的应用

请注意,在 .env 文件中,您设置了:

QUEUE_CONNECTION=数据库

QUEUE_DRIVER=数据库

P/s:对我有用!

答案 12 :(得分:0)

设置.env

  • QUEUE_CONNECTION=database

添加迁移

  • php artisan queue:table
  • php artisan migrate

如果你使用

  • dispatch(new YourJob($order))->onQueue('queue_name')

最后运行这个命令

  • php artisan queue:work --queue=queue_name