国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison php教程 PHP源碼 PHP實現(xiàn)linux命令tail -f

PHP實現(xiàn)linux命令tail -f

Nov 08, 2016 pm 01:52 PM

PHP實現(xiàn)linux命令tail -f

今天突然想到之前有人問過我的一個問題,如何通過PHP實現(xiàn)linux中的命令 tail -f ,這里就來分析實現(xiàn)下。

這個想一想也挺簡單,通過一個循環(huán)檢測文件,看文件的大小是否有變化,如果有變化,輸出文件變化的部分,當(dāng)然了這里面會有好多的細節(jié),這里具體分析下。

如果初始文件太大或者改變內(nèi)容太多

這個時候一下輸出好多內(nèi)容可能看不清,因此我這里設(shè)置了一個閾值 8192 ,當(dāng)內(nèi)容長度超過這個閾值的時候,只輸出最后面的 8192 個字節(jié),這樣就不會出現(xiàn)大面積的刷新導(dǎo)致看不清的問題。

如何檢測文件大小的變化

這個問題是這個程序的核心,能不能成功,性能的好壞就靠這部分了。我在這里的實現(xiàn)是下面這樣:

打開文件句柄 $fp ,這里要注意,這里的文件句柄全程需中只打開一次關(guān)閉一次,因此要將他放在循環(huán)的外面。

初始化當(dāng)前文件大小 file_size 和 file_size_new 都為0。

循環(huán)里面更新 file_size_new 文件大小,這里要注意,php中獲取文件大小之前一定要運行函數(shù) clearstatcache() ,清除文件狀態(tài)緩存,否則獲取文件大小可能會有偏差。

計算 add_size = file_size_new - file_size ,看文件大小是否有變化,如果有變化,將文件指針移動到指定位置,然后輸出新加的內(nèi)容,更新 file_size 值為 new_file_size 。

usleep(50000),睡眠1/20秒。

代碼實現(xiàn)

#!/usr/bin/env php 
<?php
if(2 != count($argv)){
    fwrite(
        STDERR,
        "調(diào)用格式錯誤!使用格式 ./tail filename".PHP_EOL
    );  
    return 1;
}
 
$file_name      = $argv[1];
define("MAX_SHOW", 8192);
 
$file_size      = 0;
$file_size_new  = 0;
$add_size       = 0;
$ignore_size    = 0;
$fp = fopen($file_name, "r");
while(1){
    clearstatcache();
    $file_size_new  = filesize($file_name);
    $add_size       = $file_size_new - $file_size;
    if($add_size > 0){ 
        if($add_size > MAX_SHOW){
            $ignore_size    = $add_size - MAX_SHOW;
            $add_size       = MAX_SHOW;
            fseek($fp, $file_size + $ignore_size);
        }   
        fwrite(
            STDOUT,
            fread($fp, $add_size)
        );  
        $file_size  = $file_size_new;
    }
    usleep(50000);
}
 
fclose($fp);

代碼實現(xiàn)這里第一行的 #!/usr/bin/env php 是告訴可執(zhí)行文件,可執(zhí)行文件 php 在系統(tǒng) PATH 中查找,這樣的好處就是移植性好。

2016-02-22 11:28:51改進

查了PHP官方手冊, fseek 函數(shù)這里可以改進改進,這個函數(shù)還接受第三個參數(shù),表示偏移指針的類型,默認是 SEEK_SET ,從開始偏移,還可以設(shè)置為 SEEK_CUR ,表示從當(dāng)前位置偏移,因此這里改為 fseek($fp, $ignore_size, $ignore_size);

下面是結(jié)果

14561939311.gif

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276