Codeigniter 3.x PHP后台进程

问题描述 投票:-1回答:1

我想知道您是否可以以及如何在按下按钮时运行后台进程。我需要它能够将数据加载到数据库中,以便用户可以继续浏览Web应用程序。

我已经阅读到它可以通过侦听器和工作程序完成,但我不知道它们如何与Codeigniter 3.x一起使用

php codeigniter cron listener worker
1个回答
0
投票

有很多方法可以做到这一点。您使用哪种技术将在很大程度上取决于您的特定需求和技能(例如,您需要多长时间才能完成后台流程,以便向用户提供输出结果,整个应用程序中还包含哪些其他技术,您的技能是什么)是,等等)

我知道这不是一个完整的答案,但我会告诉您一段时间前遇到类似问题时我做了什么。我希望它可以作为起点或至少作为一个想法。

问题:

与您一样,我需要用户能够将一些数据发布到我的后端。此类数据(不是很大的块,只有5-7个字段)在发布时需要先存储在表上,然后触发一个巨大的过程,该过程大约需要30秒才能完成。在那30秒钟内,我需要用户能够继续使用该应用程序(而不是只坐在那里等待控制器完成30秒的过程)。

为了稍微复杂一点,我的客户要求在发布时,用户应保留在当前页面中(因此,请勿发布,然后在用户的浏览器中重新绘制视图)。

方法:

1.-我的客户的请求非常简单:该表单将通过Ajax发布。我不是复杂的JS库的忠实拥护者,而这对我的大多数项目来说都是过大的(并且有点老套),我只是用一个简单的原始JS脚本处理表单,而该脚本会采用表单数据,将其发布到我的控制器上,并在控制器成功响应后(大约100毫秒内),将警告用户一切都很好,让他继续。

为了获得快速响应,控制器接收执行以下操作所需的Ajax数据:

一个。运行表单验证(永远不要信任用户输入)湾将表单数据存储到表中C。安排硬处理,以使其异步进行。下一节将对此进行更多说明

2.-异步处理更具挑战性。这是我的操作方式。

我创建了一个信号量表,该信号量表引用了另一个表上的表单数据(我们将其称为semaphoreuser_posts)。信号量表非常简单:一个唯一ID字段,一个引用数据所在的user_posts唯一ID的字段,一个状态字段(可能的状态为pendingworkingcompletefailed)插入日期和最后更新日期。

接下来,我设置了一个单独的控制器(俗称Cron),该控制器仅在从CLI(Codeigniter文档说明如何执行此操作)中被调用时,才可以使用可以完成实际工作的各种方法。每当cron守护程序醒来并调用主manager方法时,该方法都会检查semaphore表中是否有pending行,并选择最旧的行。然后将其移交给worker方法,然后将其标记为working并开始处理数据。处理后,该行将被标记为complete(或failed会触发我在这里不需要解释的其他动作)并返回睡眠状态。

更多信息

cron守护程序每5分钟唤醒一次manager。最初,当我的客户端的应用程序流量较低时,它足以应付负载(大多数情况下,manager会醒来,看不到任何待处理内容并返回睡眠状态)。随着流量的增加和信号量开始变得越来越多的待处理项目队列,我们​​做了一些工作以允许worker产生manager的多个实例并并行运行,每个实例都在不同的信号量行上工作。最终,在cron守护程序每5分钟唤醒之间排队的工作量变得如此,因此我们需要将调度更改为1分钟间隔,并设置专用的cron服务器来处理负载而又不影响站点的性能(请记住,每个数据集大约需要30秒的处理时间)。

嗯,这可能不是您所期望的答案(我在此方面落后于NDA,因此我无法提供特定的代码),但是正如我之前说过的,这至少可以使您对如何解决此问题有所了解。有许多其他方法可以解决此类问题。这只是其中之一

© www.soinside.com 2019 - 2024. All rights reserved.