非阻塞文件在PHP中读取

时间:2015-06-02 18:53:53

标签: php

我正在实现一个脚本来从php中的文件中读取数据。它包含大约3万行。我面临的问题是服务器需要花费大量时间来读取文件并回显结果并发送回页面。有没有办法让服务器在给定时间后发回响应,比如说2秒。

结果应该包含已经处理的文件部分,并且在下一个回复中它应该在接下来的2秒内发送处理过的部分。

2 个答案:

答案 0 :(得分:1)

有两种方法:

1)在@ Barmar的回答中实现一个循环,但有一些东西可以保存请求/响应之间的当前位置。

@ Barmar方法的问题在于它只读取文件的第一个块并返回它。它不清楚如何处理文件的其余部分。改进它的一种方法是通过一系列请求进行处理。例如:

  • 客户向http://example.com/process?file_position=0

  • 发出请求
  • 服务器在位置0开始处理,然后使用文件第一部分和新文件位置的数据进行响应

  • 客户向http://example.com/process?file_position=1000

  • 发出另一个请求
  • 服务器从新位置读取到2秒内的任何位置并再次回复

  • ...

2)使用队列处理系统在后台进行文件读取,并使用AJAX(或websockets)定期向客户端发送更新。

您可以查看将在后台执行长时间运行的作业的队列系统,并实现类似的功能。我使用Laravel作为应用程序并且它有一个很好的队列系统 - 基本上,我在服务器上运行一个工作任务,它等待作业排队,然后执行它们。请参阅these docs,了解它在Laravel中的工作原理。您可以使用packagist中的软件包组合来自行推送。

问题最终源于PHP缺乏多线程支持 - 不可能简单地生成一个新进程来进行一些读取然后将数据返回给客户端。对于长时间运行的任务,您要么遇到PHP的执行时间限制,要么用户的浏览器就在那里。旋转了很长时间。

*我知道有这样做的技巧,但它们往往是黑客攻击。

答案 1 :(得分:0)

在循环中从文件中读取,并在达到时间限制时结束循环。

authenticate