異步讀寫文件的方式有 異步回調模塊 和 協程(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
表示追加到文件末尾 - 如果文件已存在,底層會覆蓋舊的文件內容