Swoole 快速起步:协程 - 文件处理

异步读写文件的方式有 异步回调模块协程(Coroutine) 两种,4.3.0之后的版本已经移除了异步模块并全面使用协程(coroutine),也就是说,异步文件系统仅限于4.3.0之前的版本,后续版本已经全面使用协程(coroutine)。

协程(coroutine\System)

4.4.6以前的版本, 请使用Co短名或Swoole\Coroutine调用, 如: Co::sleep 或 Swoole\Coroutine::sleep4.4.6及以后版本官方推荐使用Co\System::sleepSwoole\Coroutine\System::sleep, 此修改旨在规范命名空间, 但同时也保证向下兼容 (也就是说是有4.4.6版本以前的写法也是可以的, 无需修改)

1. 获取文件系统信息

function Coroutine\System::statvfs(string $path);
  • $path:文件系统挂载的目录,如/,可以使用dfmount -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表示追加到文件末尾
  • 如果文件已存在,底层会覆盖旧的文件内容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章