异步读写文件的方式有 异步回调模块 和 协程(Coroutine) 两种,4.3.0之后的版本已经移除了异步模块并全面使用协程(coroutine),也就是说,异步文件系统仅限于4.3.0之前的版本,后续版本已经全面使用协程(coroutine)。
协程(coroutine\System)
4.4.6
以前的版本, 请使用Co
短名或Swoole\Coroutine
调用, 如: Co::sleep
或 Swoole\Coroutine::sleep
, 4.4.6
及以后版本官方推荐使用Co\System::sleep
或Swoole\Coroutine\System::sleep
, 此修改旨在规范命名空间, 但同时也保证向下兼容 (也就是说是有4.4.6版本以前的写法也是可以的, 无需修改)
1. 获取文件系统信息
function Coroutine\System::statvfs(string $path);
$path
:文件系统挂载的目录,如/
,可以使用df
和mount -l
命令获取- 失败返回
false
- 成功返回结果数组
2. 写入文件(writefile)
function Coroutine\System::writeFile(string $filename, string $fileContent, int $flags);
$filename
为文件的名称,必须有可写权限,文件不存在会自动创建。打开文件失败会立即返回false$fileContent
为要写入到文件的内容,最大可写入4M$flags
为写入的选项,默认会清空当前文件内容,可以使用FILE_APPEND
表示追加到文件末尾
使用示例:
<?php
use Swoole\Coroutine\System;
$filename = __DIR__ . "/1.txt";
go(function () use ($filename)
{
$r = System::writeFile($filename,"Write at ".date("Y-m-d H:i:s") . "\n",FILE_APPEND);
var_dump($r);
});
echo "go".PHP_EOL;
结果:
# php73 writefile.php
go
int(29)
3. 读取文件(readfile)
function Coroutine\System::readFile(string $filename);
$filename
文件名
使用示例:
<?php
use Swoole\Coroutine\System;
$filename = __DIR__ . "/1.txt";
go(function () use ($filename)
{
$r = System::readFile($filename);
var_dump($r);
});
echo "go".PHP_EOL;
结果:
[root@atong io-file]# php73 readfile.php
go
string(87) "Write at 2019-10-09 06:29:27
Write at 2019-10-09 06:30:02
Write at 2019-10-09 06:30:05
"
3. 读取文件(fread)
function Coroutine\System::fread(resource $handle, int $length = 0);
$handle
文件句柄,必须是fopen
打开的文件类型stream
资源$length
读取的长度,默认为0
,表示读取文件的全部内容
4. 写入文件(fwrite)
function Coroutine\System::fwrite(resource $handle, string $data, int $length = 0);
$handle
文件句柄,必须是fopen
打开的文件类型stream
资源$data
要写入的数据内容,可以是文本或二进制数据$length
写入的长度,默认为0
,表示写入$data
的全部内容,$length
必须小于$data
的长度
使用示例:
use Swoole\Coroutine\System;
$fp = fopen(__DIR__ . "/test.data", "a+");
go(function () use ($fp)
{
$r = System::fwrite($fp, "hello world\n", 5);
var_dump($r);
});
异步文件系统IO
4.3.0之前的读写文件方式
1. 异步读取文件
//函数风格
swoole_async_readfile(string $filename, mixed $callback);
//命名空间风格
Swoole\Async::readFile(string $filename, mixed $callback);
- 文件不存在会返回
false
- 成功打开文件立即返回
true
- 数据读取完毕后会回调指定的
callback
函数。
使用示例:
swoole_async_readfile(__DIR__."/server.php", function($filename, $content) {
echo "$filename: $content";
});
swoole_async_readfile
会将文件内容全部复制到内存,所以不能用于大文件的读取
如果要读取超大文件,请使用swoole_async_read
函数swoole_async_readfile
最大可读取4M
的文件,受限于SW_AIO_MAX_FILESIZE
宏
2. 异步写文件
Swoole\Async::writeFile(string $filename, string $fileContent, callable $callback = null, int $flags = 0)
swoole_async_writefile('test.log', $file_content, function($filename) {
echo "wirte ok.\n";
}, $flags = 0);
调用此函数后会立即返回。当写入完成时会自动回调指定的callback函数。
- 参数1为文件的名称,必须有可写权限,文件不存在会自动创建。打开文件失败会立即返回
false
- 参数2为要写入到文件的内容,最大可写入
4M
- 参数3为写入成功后的回调函数,可选
- 参数4为写入的选项,可以使用
FILE_APPEND
表示追加到文件末尾 - 如果文件已存在,底层会覆盖旧的文件内容