swoole學習之非同步檔案IO
非同步IO,檔案操作
swoole_async_readfile($filename, $callback)
非同步讀取檔案
-
$filename
檔名 -
$callback
回撥函式,有兩個引數function($filename,$content){}
-
$content
檔案的內容檔案不存在會返回
false
成功開啟檔案返回true
成功讀取檔案內容,會呼叫指定的回撥函式callback
注意: swoole_async_readfile
最多讀取4M的檔案,如果需要的讀取檔案過大請使用swoole_async_read
函式
程式碼:
<?php
$res = swoole_async_readfile (__DIR__ . "/1.txt",function ($filename , $content){
echo $filename.PHP_EOL;
echo $content.PHP_EOL;
});
var_dump($res);
echo "start".PHP_EOL;
執行以上程式碼,會發現.我們是先列印
$res
的值,再列印start
,最後才打印$filename
和$content
並不是我們之前所認為的,程式碼從上至下執行. 這種特點在所有的非同步操作中都有.
swoole_async_writefile($filename,$filecontent,$callback,$flags)
非同步寫入檔案
-
$filecontent
需要寫入檔案的內容 -
$callback
回撥函式function($filename)
-
$flags
寫入的選項,預設$filecontent
會覆蓋檔案內容,與PHP中的file_put_contens
一樣. 如果需要追加的話,傳入FILE_APPEND
常量程式碼:
<?php
swoole_async_writefile(__DIR__ . "/1.txt","xixi",function ($filename){
swoole_async_readfile($filename,function ($filename,$content ){
echo $content.PHP_EOL;
});
},FILE_APPEND);
如果我們不想讓新的內容覆蓋掉檔案原有的資訊,我們就需要新增第四個引數
FILE_APPEND
否則可以不填寫
基於HTTP服務的一個編寫日誌的demo :
<?php
$http = new swoole_http_server('0.0.0.0',8811);
$http->set([
'enable_static_handler' => true,
'document_root' => '/marun'
]);
$http->on('request',function ($request,$response){
$content = [
'date: ' => date("Y-m-d H:i:s",time()),
"get: " => $request->get,
"post: " => $request->post,
"header: " => $request->header
];
//根據日期來生成一個日誌檔案,一行一條記錄.
swoole_async_writefile(__DIR__ . "/" .date("Y-m-d",time()).".log",json_encode($content).PHP_EOL,function ($filename){
echo "write ok".PHP_EOL;
},FILE_APPEND);
$response->end(json_encode($request->get));
});
$http->start();
注意: 如果寫入的檔案內容過大,可以使用
swoole_async_write
函式
swoole_async_read($filename,$callback,$size,$offset)
非同步讀檔案
此函式與
swoole_async_readfile
不同的是,這個函式是分段來讀取檔案內容,可以讀取超大內容的檔案,每次只讀取$size
個位元組的內容,不會佔用太大的記憶體
$filename
檔名
$callback
回撥函式function($filename,$content)
$content
分段讀取到的內容 , 如果為空 就說明檔案讀取完畢return
在回撥函式內 可以通過return false
或者return true
來控制是否服務下一段內容,true
繼續,false
暫停
$size
分段讀取的位元組大小 , 每一次 讀取的位元組大小
$offest
偏移量. 從第幾個位元組開始讀取. 比如 0
從頭開始. 1
從第二個開始讀取
example:
//每一次讀取兩個位元組的內容, 從第三個開始
swoole_async_read(__DIR__."/1.txt",function ($filename,$content){
echo $content.PHP_EOL;
},1,1);
注意 擷取中文亂碼.
swoole_async_write($filename, $content, $offset, $callback)
非同步寫檔案
與
swoole_async_writefile
不同,swoole_async_write
是分段寫的。不需要一次性將要寫的內容放到記憶體裡,所以只佔用少量記憶體。swoole_async_write
通過傳入的offset
引數來確定寫入的位置。
- 當
offset
的值為-1
的時候,表示內容寫入到檔案末尾 exmaple:
swoole_async_write(__DIR__."/1.txt","marun".PHP_EOL,-1,function ($filename){
swoole_async_readfile($filename,function ($filename,$content){
echo $content.PHP_EOL;
});
});