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