首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Codeigniter 3.x PHP后台进程

Codeigniter 3.x PHP后台进程
EN

Stack Overflow用户
提问于 2019-09-25 07:15:18
回答 1查看 775关注 0票数 0

我想知道你是否可以,以及如何使后台进程运行时,你按一个按钮。我需要这是能够加载数据到一个数据库,以便用户可以继续浏览网页应用程序。

我读过它可以用侦听器和工作者来完成,但是我不知道它们是如何与Codeigniter 3.x一起使用的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-09-25 14:24:22

有很多方法可以做到这一点。您使用哪一种技术将在很大程度上取决于您的具体需求和技能(例如,您需要多快地完成后台过程,以便将输出提供给用户,其他哪些技术是您整个应用程序的一部分,您的技能等等)

我知道这不是一个完整的答案,但我会告诉你,当我面对类似的问题时,我做了些什么。我希望它可以作为一个起点,或者至少作为一个想法。

问题:

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

为了使它更复杂一点,我的客户端要求在发布时,用户应该留在当前页面中(所以不要发布,然后在用户的浏览器中重新绘制视图)。

的方法:

1.-我的客户请求相当简单:表单将通过Ajax发布。我不太喜欢复杂的JS库,这些库对我的大多数项目来说都太过分了(而且有点老派的风格),我只是让一个简单的普通JS脚本来处理表单,这个脚本会将表单数据发送给我的控制器,当控制器成功响应时(大约100毫秒),我会提醒用户一切都很好,让他继续工作。

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

运行表单验证(绝不信任用户输入) b.将表单数据存储在表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,所以我不能提供具体的代码),但正如我前面所说的,这可能至少给您一个如何解决这个问题的想法。有许多其他的方法来处理这种问题。这只是其中之一

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58093016

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档