如何在Laravel排队作业中使用和设置cookie,以及为什么我当前的解决方案失败


How can I use & set cookies whilst inside a Laravel queued Job, and why is my current solution failing?

我需要我的部分应用程序从我的核心应用程序的工作流程异步调用Reddit。我通过使用我在这里构建的 Reddit API 库实现了一个半可行的解决方案。对于那些不知道的人,Reddit通过OAuth管理身份验证,并为特定用户返回一个持有者和一个令牌,该令牌在生成后60分钟内过期。

我选择使用 cookie 在上述时间段内存储此授权信息,如此处的requestRedditToken()方法所示。如果在需要向Reddit发出另一个请求时找不到cookie(即它已过期),则会生成另一个reddit令牌。这似乎可以正常工作

我遇到的问题是概念化与守护程序队列工作线程集成时如何处理 cookie,此外,我需要了解为什么这些调用会定期失败

如前所述,我正在使用的应用程序调用Reddit。这些调用由正在处理的作业类创建:UpdateRedditLiveThreadJob ,您可以在此处看到。

这些作业由使用 Laravel Forge 守护的 Artisan 队列工作线程处理,您可以在此处查看该工作线程的详细信息。在这种情况下,队列驱动程序是 Redis,工作人员由主管监视。

以下是我的应用程序的预期工作流程:

  1. 将创建一个UpdateRedditLiveThreadJob并将其抛入要处理的队列中。
  2. 调用作业的handle()方法。
  3. Reddit客户端被实例化,如果cookie不存在,则会请求Reddit令牌。
  4. 我的Reddit客户端成功地与Reddit通信。
  5. 作业被视为已完成。

实际发生的情况:

  1. 作业已创建。
  2. 句柄被调用。
  3. Reddit客户端被实例化,这里通常会发生一些奇怪的事情
  4. Reddit 客户端尝试通信,但收到 401 响应,生成异常。这表示授权失败。
  5. 该任务被视为"失败",并循环回步骤 2。

以下是我的问题:

  1. 为什么这个流在第一个小时内工作,然后如上所述折叠,大概是 cookie 过期了?

  2. 我已经尽力理解 Laravel 队列的工作原理,但我从根本上很难概念化不同类型的可用队列管理选项:queue:listenqueue:work、在 supervisor 上运行的守护queue:work等。我当前的队列基础结构是否与使用 Cookie 管理令牌兼容?

  3. 我需要对代码库进行哪些调整才能使应用按预期运行?

  4. 我的工作流程将如何处理多个用户,每个用户可能有多个 Cookie?

  5. 为什么如果我重新启动队列工作线程,工作流会神奇地重新开始工作?

如果我在这里错误地描述了任何内容或需要澄清,请告诉我,我已经尽力简洁地解释问题。

你的逻辑不正确。队列作业实际上是运行 php 脚本的 cli。它与浏览器没有交互。Cookie 在浏览器中设置,请参阅此相关线程以供参考。

看到您正在与 API 交互,将令牌设置为作业中的简单变量(或者更好的是在该包装器中)然后在该作业中重用它会更有意义。

TL:DR:您的包装器不是 API 客户端。

我知道这不是你所有问题的完整答案,但它是朝着正确方向的推动。因为我最终会回答您的所有问题,因此可能不会为您的问题提供任何解决方案;)