0

我正在开发一个应用程序,它应该接收一个.CSV文件,保存它,扫描它,以及insert每条记录into DB的数据,最后删除文件。

对于包含大约 10000 条记录的文件,没有问题,但对于较大的文件,PHP script is correctly runned and all data are saved into DB则会打印出来ERROR 504 The server didn't respond in time.

我正在扫描.CSV file with the php function fgetcsv();.

我已经将设置编辑到php.ini文件(max execution time (120)等)中,但没有任何变化,1分钟后显示错误。

我还尝试使用 javascript 函数每 10 秒显示一次警报,但在这种情况下也会显示错误。

有没有办法避免这个问题?是否可以每隔几秒将一些数据从服务器传递到客户端以避免错误?

谢谢

4

1 回答 1

0

当您需要开始发展系统架构并且您的应用程序需要异步工作时,通常会出现扩展问题。你遇到的这个问题很常见(我的一些团队正在处理我写的一个问题)但每个人最终都需要处理它。

解决方案 1:Cron 作业

最常见的解决方案是创建一个定期扫描队列以查找新工作的 cron 作业。我不会解释队列的性质,因为每个人都有自己的队列,有些很好,有些很糟糕,但通常它涉及一个包含相关信息和工作状态的数据库表(<-- 一种糟糕的解决方案),或者涉及 Memcached 的解决方案,MongoDB 也很受欢迎。

这个解决方案的“问题”最终又是“缩放”。Cron 作业以固定的时间间隔定期运行,因此如果一项任务花费了特别长的时间,作业可能会重叠。这意味着您需要使用某种锁定或使用支持顺序运行作业的调度程序。

最后,您不会遇到超时问题,并且您通常可以将整台机器专用于运行这些任务,因此内存也不是什么大问题。

解决方案 2:工人委派

我将使用 Gearman 作为此解决方案的示例,但其他工具包含 AMQP 等标准,例如 RabbitMQ。我更喜欢 Gearman,因为它的设置更简单,而且它的设计更多是为了工作处理而不是消息传递。

这种委托的优点是调用后立即运行。服务器基本上是在等待要做的事情(与 Apache 服务器不同),当它收到请求时,它将工作负载从客户端转移到您的“工作人员”之一,这些是您编写的脚本,它们会无限期地运行工作负载的服务器。

您可以拥有任意数量的这些工作人员,每个工作人员运行相同或不同类型的任务。这意味着扩展取决于您拥有的工人数量,并且水平扩展非常干净。

结论:

Cron 在我看来自动化维护很好,但是当它们需要同时工作时会遇到问题,这使得运行工作者成为理想的选择。

无论哪种方式,您都需要更改用户接收请求反馈的方式。他们需要被告知他们的请求正在处理中并稍后检查以获得结果,或者您可以定期跟踪正在运行的任务的状态,以通过 ajax 向用户提供实时反馈。这对于 cron 作业来说有点棘手,因为您需要在任务执行期间保持任务的状态,但 Gearman 有一个很好的内置解决方案可以做到这一点。

http://php.net/manual/en/book.gearman.php

于 2017-05-23T09:39:56.910 回答