Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/251.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP中的非阻塞文件读取_Php - Fatal编程技术网

PHP中的非阻塞文件读取

PHP中的非阻塞文件读取,php,Php,我正在用php实现一个从文件中读取数据的脚本。它包含大约3万行。我面临的问题是,服务器读取文件、回显结果并发回页面需要花费大量时间。有没有什么方法可以让服务器在给定的时间(比如2秒)后发回响应 结果应包含文件中已处理的部分,在下一次回复中,应在接下来的2秒钟内发送已处理的部分。以循环方式读取文件,并在达到时间限制时结束循环 $fd = fopen($filename); $result = ''; $limit = 2; $stop_time = time() + $limit; $block_

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


结果应包含文件中已处理的部分,在下一次回复中,应在接下来的2秒钟内发送已处理的部分。

以循环方式读取文件,并在达到时间限制时结束循环

$fd = fopen($filename);
$result = '';
$limit = 2;
$stop_time = time() + $limit;
$block_size = 1024;
while (time() < $stop_time) {
    $result .= fread($fd, $block_size);
    if (feof($fd)) {
        break;
    }
}
close($fd);
echo $result;
$fd=fopen($filename);
$result='';
$limit=2;
$stop_time=time()+$limit;
$block_size=1024;
while(time()<$stop\u time){
$result.=fread($fd,$block_size);
如果(联邦储备基金($fd)){
打破
}
}
收盘价(元);;
回声$结果;

有几种方法可以实现这一点:

  • 实现一个循环,如@Barmar的答案中所示,但它将保存请求/响应之间的当前位置
  • @Barmar方法的问题在于它只读取文件的第一个块并返回它。不清楚如何处理文件的其余部分。改进它的一种方法是通过一系列请求进行处理。例如:

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

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

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

    • 服务器在2秒钟内从新位置读取数据并再次回复

  • 使用队列处理系统在后台读取文件,并使用AJAX(或WebSocket)定期向客户端发送更新
  • 您可以查看将在后台执行长时间运行的作业的队列系统,并实现类似的功能。我使用的是一个应用程序,它有一个很好的队列系统——基本上,我在服务器上运行一个worker任务,它只是等待作业排队,然后执行它们。请参阅了解它在Laravel中的工作原理。您可以使用来自的软件包组合推出自己的软件包

    问题最终源于PHP缺乏多线程支持——不可能*简单地生成一个新进程来执行一些读取,然后将数据返回到客户端。对于长时间运行的任务,您可能会遇到PHP的执行时间限制,或者用户的浏览器会长时间处于该位置并旋转

    我知道有一些技术可以做到这一点,但它们往往是黑客


    你试过什么吗?我该试什么。我已经写了脚本来读取文件,但没有其他脚本。我需要一些指导,以便编写脚本,这就是我在这里发布的原因。您可以使用ajax创建一个轮询系统来逐块读取文件,直到完全读取为止。文件读取从不阻塞,因此没有非阻塞文件读取。按要求。将它与客户端的适当请求相结合可以使这一过程变得相当快,但这并不能真正回答问题。没有一种方法对非阻塞有任何作用。@因此,关于非阻塞的问题没有任何内容。它在标题中,但这似乎是拙劣的措辞,指的是阅读整个文件所需的时间。哦,对了,我错了。这不是非块,fopen和fread本质上是阻塞的。@anru与2秒的时间限制相比,他们所花的时间可以忽略不计。@anru问题中没有需要非阻塞I/O的内容。标题对于他们在问题本身中所要求的内容来说是糟糕的措辞。