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

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

我需要我的应用程序的一部分从我的核心应用程序的工作流中异步调用 Reddit。我已经通过使用 Reddit API 库实现了一个半可行的解决方案,我已经为特定用户构建了 here. For those that are unaware, Reddit manages authentication via OAuth 和 returns 一个持有者和一个在生成后 60 分钟内过期的令牌。

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

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

如前所述,我正在使用的应用程序会调用 Reddit。这些调用是由正在处理的作业 class 创建的:UpdateRedditLiveThreadJob,您可以 see here.

这些作业由守护进程 Artisan 队列工作者使用 Laravel Forge,you can see the details of the worker here 处理。本例队列驱动为Redis,worker由Supervisor监控

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

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

实际发生了什么:

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

这是我的问题:

  1. 为什么这个流程在第一个小时有效,然后如上所述崩溃,大概是 cookie 已过期?

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

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

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

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

如果我在这里描述不正确或需要澄清,请告诉我,我已尽力简明扼要地解释问题。

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

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

TL:DR: your wrapper is not an API client.

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