我需要我的部分应用程序从我的核心应用程序的工作流程异步调用Reddit。我通过使用我在这里构建的 Reddit API 库实现了一个半可行的解决方案。对于那些不知道的人,Reddit通过OAuth管理身份验证,并为特定用户返回一个持有者和一个令牌,该令牌在生成后60分钟内过期。
我选择使用 cookie 在上述时间段内存储此授权信息,如此处的requestRedditToken()
方法所示。如果在需要向Reddit发出另一个请求时找不到cookie(即它已过期),则会生成另一个reddit令牌。这似乎可以正常工作。
我遇到的问题是概念化与守护程序队列工作线程集成时如何处理 cookie,此外,我需要了解为什么这些调用会定期失败。
如前所述,我正在使用的应用程序调用Reddit。这些调用由正在处理的作业类创建:UpdateRedditLiveThreadJob
,您可以在此处看到。
这些作业由使用 Laravel Forge 守护的 Artisan 队列工作线程处理,您可以在此处查看该工作线程的详细信息。在这种情况下,队列驱动程序是 Redis,工作人员由主管监视。
以下是我的应用程序的预期工作流程:
- 将创建一个
UpdateRedditLiveThreadJob
并将其抛入要处理的队列中。 - 调用作业的
handle()
方法。 - Reddit客户端被实例化,如果cookie不存在,则会请求Reddit令牌。
- 我的Reddit客户端成功地与Reddit通信。
- 作业被视为已完成。
实际发生的情况:
- 作业已创建。
- 句柄被调用。
- Reddit客户端被实例化,这里通常会发生一些奇怪的事情。
- Reddit 客户端尝试通信,但收到 401 响应,生成异常。这表示授权失败。
- 该任务被视为"失败",并循环回步骤 2。
以下是我的问题:
-
为什么这个流在第一个小时内工作,然后如上所述折叠,大概是 cookie 过期了?
-
我已经尽力理解 Laravel 队列的工作原理,但我从根本上很难概念化不同类型的可用队列管理选项:
queue:listen
、queue:work
、在 supervisor 上运行的守护queue:work
等。我当前的队列基础结构是否与使用 Cookie 管理令牌兼容? -
我需要对代码库进行哪些调整才能使应用按预期运行?
-
我的工作流程将如何处理多个用户,每个用户可能有多个 Cookie?
-
为什么如果我重新启动队列工作线程,工作流会神奇地重新开始工作?
如果我在这里错误地描述了任何内容或需要澄清,请告诉我,我已经尽力简洁地解释问题。
你的逻辑不正确。队列作业实际上是运行 php 脚本的 cli。它与浏览器没有交互。Cookie 在浏览器中设置,请参阅此相关线程以供参考。
看到您正在与 API 交互,将令牌设置为作业中的简单变量(或者更好的是在该包装器中)然后在该作业中重用它会更有意义。
TL:DR:您的包装器不是 API 客户端。
我知道这不是你所有问题的完整答案,但它是朝着正确方向的推动。因为我最终会回答您的所有问题,因此可能不会为您的问题提供任何解决方案;)