Codeigniter 3.x PHP 后台进程
Codeigniter 3.x PHP Background Process
我想知道您是否可以以及如何在您按下按钮时创建后台进程运行。我需要它能够将数据加载到数据库中,以便用户可以继续浏览网络应用程序。
我读到可以用 listener 和 worker 来完成,但我不知道它们如何与 Codeigniter 一起使用 3.x
有很多方法可以做到这一点。您使用哪一个将在很大程度上取决于您的具体需求和技能(例如,您需要后台进程多快完成以便它向用户提供输出,整个应用程序中还有哪些其他技术,您的技能是什么是等)
我知道这不是一个完整的答案,但我会告诉你我前一段时间遇到类似问题时是怎么做的。我希望它能作为一个起点或至少作为一个想法。
问题:
就像您一样,我需要用户能够 post 一些数据到我的后端。这样的数据(不是很大的块,只有 5-7 个字段)当 posted 需要首先存储在 table 上,然后触发一个巨大的过程,大约需要 30 秒才能完成。在那 30 秒内,我需要用户能够继续使用该应用程序(而不是只是坐在那里等待控制器完成 30 秒的过程)。
为了让它更复杂一点,我的客户要求在 posting 时,用户应该留在当前页面(所以没有 posting 然后重新绘制在用户的浏览器中查看)。
方法:
1.- 我客户的要求相当简单:表单将 post 通过 Ajax。不是复杂的 JS 库的忠实拥护者,这些库对我的大多数项目来说都是过大的(并且有点老派),我只是让表单由一个简单的 vanilla JS 脚本处理,该脚本将采用表单数据,post 发送到我的控制器,一旦控制器成功响应(大约 100 毫秒),将提醒用户一切正常并让他继续。
为了获得快速响应,接收 Ajax 数据的控制器只需执行以下操作:
一个。 运行 表单验证(永远不要相信用户输入)
b.将表单数据存储到 table
C。安排硬处理,使其异步发生。下一节将详细介绍
2.- 异步处理更具挑战性。这是我的做法。
我创建了一个信号量 table,它引用了另一个 table 上的表单数据(我们称它们为 semaphore
和 user_posts
)。信号量 table 相当简单:一个唯一 ID 字段,一个引用数据所在的 user_posts
唯一 ID 的字段,一个状态字段(可能有状态 pending
、working
, complete
, failed
) 插入日期和最后更新日期。
接下来,我设置了一个单独的控制器(创造性地命名为 Cron
),它只有在从 CLI 调用时才起作用(Codeigniter 文档解释了如何做到这一点),并使用各种方法来完成实际工作.每当 cron 守护程序唤醒并调用主 manager
方法时,该方法将检查 semaphore
table 中是否有任何 pending
行并选择最旧的行。然后它将其交给 worker
方法,然后将其标记为 working
并开始处理数据。处理后,该行将被标记为 complete
(或 failed
,这将触发我不需要在这里解释的其他操作)并返回休眠状态。
更多信息
cron 守护进程每 5 分钟唤醒一次 manager
。最初,当我客户的应用程序流量较低时,处理负载绰绰有余(大多数时候,manager
会醒来,看到没有任何待处理的内容并返回睡眠状态)。随着流量的增长和信号量开始成为一个不断增长的待处理项目队列,我们做了一些工作以允许 worker
的多个实例由 manager
和 运行 并行生成,每个都在不同的信号量行上工作。最终,在 cron 守护进程每 5 分钟唤醒一次之间排队的工作量变得如此之大,以至于我们需要将调度更改为 1 分钟间隔,并设置一个专用的 cron 服务器来处理负载而不影响站点的性能(请记住,处理每个数据集大约需要 30 秒)。
好吧,这可能不是您期望的答案(我在这方面有保密协议,所以我无法提供具体代码)但正如我之前所说,这至少可以让您了解如何来解决这个问题。还有许多其他方法可以解决此类问题。这只是其中之一
我想知道您是否可以以及如何在您按下按钮时创建后台进程运行。我需要它能够将数据加载到数据库中,以便用户可以继续浏览网络应用程序。
我读到可以用 listener 和 worker 来完成,但我不知道它们如何与 Codeigniter 一起使用 3.x
有很多方法可以做到这一点。您使用哪一个将在很大程度上取决于您的具体需求和技能(例如,您需要后台进程多快完成以便它向用户提供输出,整个应用程序中还有哪些其他技术,您的技能是什么是等)
我知道这不是一个完整的答案,但我会告诉你我前一段时间遇到类似问题时是怎么做的。我希望它能作为一个起点或至少作为一个想法。
问题:
就像您一样,我需要用户能够 post 一些数据到我的后端。这样的数据(不是很大的块,只有 5-7 个字段)当 posted 需要首先存储在 table 上,然后触发一个巨大的过程,大约需要 30 秒才能完成。在那 30 秒内,我需要用户能够继续使用该应用程序(而不是只是坐在那里等待控制器完成 30 秒的过程)。
为了让它更复杂一点,我的客户要求在 posting 时,用户应该留在当前页面(所以没有 posting 然后重新绘制在用户的浏览器中查看)。
方法:
1.- 我客户的要求相当简单:表单将 post 通过 Ajax。不是复杂的 JS 库的忠实拥护者,这些库对我的大多数项目来说都是过大的(并且有点老派),我只是让表单由一个简单的 vanilla JS 脚本处理,该脚本将采用表单数据,post 发送到我的控制器,一旦控制器成功响应(大约 100 毫秒),将提醒用户一切正常并让他继续。
为了获得快速响应,接收 Ajax 数据的控制器只需执行以下操作:
一个。 运行 表单验证(永远不要相信用户输入) b.将表单数据存储到 table C。安排硬处理,使其异步发生。下一节将详细介绍
2.- 异步处理更具挑战性。这是我的做法。
我创建了一个信号量 table,它引用了另一个 table 上的表单数据(我们称它们为 semaphore
和 user_posts
)。信号量 table 相当简单:一个唯一 ID 字段,一个引用数据所在的 user_posts
唯一 ID 的字段,一个状态字段(可能有状态 pending
、working
, complete
, failed
) 插入日期和最后更新日期。
接下来,我设置了一个单独的控制器(创造性地命名为 Cron
),它只有在从 CLI 调用时才起作用(Codeigniter 文档解释了如何做到这一点),并使用各种方法来完成实际工作.每当 cron 守护程序唤醒并调用主 manager
方法时,该方法将检查 semaphore
table 中是否有任何 pending
行并选择最旧的行。然后它将其交给 worker
方法,然后将其标记为 working
并开始处理数据。处理后,该行将被标记为 complete
(或 failed
,这将触发我不需要在这里解释的其他操作)并返回休眠状态。
更多信息
cron 守护进程每 5 分钟唤醒一次 manager
。最初,当我客户的应用程序流量较低时,处理负载绰绰有余(大多数时候,manager
会醒来,看到没有任何待处理的内容并返回睡眠状态)。随着流量的增长和信号量开始成为一个不断增长的待处理项目队列,我们做了一些工作以允许 worker
的多个实例由 manager
和 运行 并行生成,每个都在不同的信号量行上工作。最终,在 cron 守护进程每 5 分钟唤醒一次之间排队的工作量变得如此之大,以至于我们需要将调度更改为 1 分钟间隔,并设置一个专用的 cron 服务器来处理负载而不影响站点的性能(请记住,处理每个数据集大约需要 30 秒)。
好吧,这可能不是您期望的答案(我在这方面有保密协议,所以我无法提供具体代码)但正如我之前所说,这至少可以让您了解如何来解决这个问题。还有许多其他方法可以解决此类问题。这只是其中之一