1. 程式人生 > >swoole學習之非同步檔案IO

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;
        });
});