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 | <?php |
上传脚本和测试文本到服务器可以看到
由于是异步读取,两个echo都在文件读取之前输出出来了,之后就是两个文件读取内容的打印