Swoole(十四)异步文件读取

Swoole增加了异步文件读写,异步DNS,异步Http/WebSocket客户端等特性。开发纯异步非阻塞IO的程序时,不能使用PHP自带的网络客户端,如curl、file_get_contents、stream、sockets、mysql、redis。


1.(小文件)异步读取文件内容:swoole_async_readfile

提供了两种风格
函数风格:swoole_async_readfile(string $filename, mixed $callback);
面向对象风格:Swoole\Async::readFile(string $filename, mixed $callback);
$filename:路径下的文件名
$callback:由于是异步非阻塞,数据读取完毕后会立即调用指定的回调函数
Tips:swoole_async_readfile会将文件内容全部复制到内存,所以不能用于大文件的读取
如果要读取超大文件,请使用swoole_async_read函数


2.(大文件)异步读取文件内容:swoole_async_read

函数原型:bool swoole_async_read(string $filename, mixed $callback, int $size = 8192, int $offset = 0);
$filename:路径下的文件名
$callback:回调函数接受两个参数bool callback(string $filename, string $content);,$filename-文件名称,$content-读取到的分段内容如果内容为空,表明文件已读完,在回调函数中可通过return true/false,来控制继续读下一段内容/停止读取并关闭文件
$size:读取的分段内容的大小,单位字节
Tips:此函数与swoole_async_readfile不同,它是分段读取,可以用于读取超大文件。每次只读$size个字节,不会占用太多内存。

3.两种读取方式测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php

echo "swoole_async_readfile \n";

//readFile读取
swoole_async_readfile(__DIR__."/testFile.txt", function($filename, $content) {
echo "swoole_async_readfile-[$filename] : $content \n";
});

echo "swoole_async_read \n";

//read读取
swoole_async_read(__DIR__."/testFile.txt", function($filename, $content) {
if($content){
echo "swoole_async_read-[$filename] : $content \n";
return true;
}else{
return false;
}

});

上传脚本和测试文本到服务器可以看到

由于是异步读取,两个echo都在文件读取之前输出出来了,之后就是两个文件读取内容的打印