错误 504,通过从服务器到客户端的一些数据来避免它?

Error 504, avoid it with some data passing from server to client?

我正在开发一个应接收 .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 秒显示一次警报,但在这种情况下也会显示错误。

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

谢谢

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

解决方案 1:Cron 作业

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

这个解决方案的"problem"最终还是"scaling"。 Cron 作业 运行 以固定的时间间隔定期执行,因此如果一项任务花费的时间特别长,则作业很可能会重叠。这意味着您需要以某种锁定方式工作或使用支持 运行按顺序执行作业的调度程序。

最终,您不会 运行 遇到超时问题,并且您通常可以将整台机器专门用于 运行 执行这些任务,这样内存就不再是一个大问题要么。

解决方案 2:工人委派

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

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

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

结论:

我认为 Crons 在自动化维护方面很好,但是当它们需要同时工作时 运行 就会出现问题,这使得 运行ning worker 成为理想的选择。

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

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