我正在为客户创建一个网站,他们需要能够生成25,000 - 100,000个条形码。我已经许可了一个生成代码的软件,但生成一个说法的命令需要大约20到30分钟。 60,000条码。
所以我的问题是......
是否可以使用php中设置的时间限制功能设置为零(没有时间限制),然后使用Ajax将变量传递给库并使用ignore_user_abort函数。这种方式基本上就是这样:
客户选择条形码数量和类型,他们检查并在支付网关发回成功的响应后,然后我们运行ajax请求,将时间限制设置为UNLIMITED,然后告诉脚本运行,即使用户关闭他们的浏览器或退出页面。这样服务器就可以处理订单,如果需要2秒或45分钟则无关紧要。订单完成后,客户可以刷新他们的帐户,他们会看到他们的订单。
我是否只是梦想这听起来像个好主意或者它是一个可行的解决方案?我在使用php队列系统编写代码时没有任何经验,所以我不想创建一个,除非我绝对必须这样做。
答案 0 :(得分:3)
我会考虑使用像Gearman这样的东西(http://gearman.org/index.php)。
这也将与CI应用程序分开......然后,CI将使用Gearman处理队列...
答案 1 :(得分:1)
不要依赖一个长时间运行的PHP实例。特别是如果它以任何方式绑定到用户/浏览器。正确地将后端系统与诸如Web服务器响应之类的短暂过程分开。
建立一个合适的队列工作者系统。将所有订单放入队列(数据库,平面文件等),并让工作人员逐个从队列中接受订单,处理它们,更新结果。 worker可以是一个cron作业,一个守护进程,一个无限循环的PHP脚本(如果它崩溃,它将由监视器重新启动)或其他任何东西。您还可以查看AMQP,ZeroMQ或类似的排队/消息系统。
答案 2 :(得分:1)
尝试在后端使用CLI,默认情况下它没有时间限制。http://php.net/manual/en/info.configuration.php#ini.max-execution-time
我的意思是分3步......
首先将ORDER保存在您的数据库中..
二!!! 设置crontask每分钟运行,以获取和处理1个订单。 订单准备好后(30分钟后),使用下载链接更新数据库,或者以响应方式返回,并结束crontasks。
第三。 在他的订单准备好后,在某个页面向用户显示结果。