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表示追加到文件末尾
  • 如果文件已存在,底層會覆蓋舊的文件內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章