溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

php如何實(shí)現(xiàn)linux命令

發(fā)布時(shí)間:2021-12-08 11:32:10 來(lái)源:億速云 閱讀:111 作者:小新 欄目:編程語(yǔ)言

這篇文章主要為大家展示了“php如何實(shí)現(xiàn)linux命令”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“php如何實(shí)現(xiàn)linux命令”這篇文章吧。

php實(shí)現(xiàn)linux命令的方法:1、創(chuàng)建一個(gè)PHP示例文件;2、在第一行輸入“#!/usr/bin/env php”;3、通過(guò)“if(2 != count($argv)){...}”等代碼實(shí)現(xiàn)linux命令“tail -f”即可。

本文操作環(huán)境:linux5.9.8系統(tǒng),PHP7.1版,Dell G3電腦。

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

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

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

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

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

如何檢測(cè)文件大小的變化

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

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

  • 初始化當(dāng)前文件大小file_sizefile_size_new都為0。

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

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

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

代碼實(shí)現(xiàn)
#!/usr/bin/env php 
<?php
if(2 != count($argv)){
    fwrite(
        STDERR,
        "調(diào)用格式錯(cuò)誤!使用格式 ./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);

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

2016-02-22 11:28:51改進(jìn)

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

下面是結(jié)果

php如何實(shí)現(xiàn)linux命令


以上是“php如何實(shí)現(xiàn)linux命令”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI