首頁  >  文章  >  後端開發  >  php怎麼實作linux指令

php怎麼實作linux指令

藏色散人
藏色散人原創
2021-12-08 11:00:493414瀏覽

php實作linux指令的方法:1、建立一個PHP範例檔;2、在第一行輸入「#!/usr/bin/env php」;3、透過「if(2 != count ($argv)){...}”等程式碼實作linux指令「tail -f」即可。

php怎麼實作linux指令

本文操作環境:linux5.9.8系統,PHP7.1版,Dell G3電腦。

php怎麼實作linux指令?

PHP實作linux指令tail -f

今天突然想到之前有人問過我的一個問題,如何透過PHP實作linux中的指令tail -f,這裡就來分析實作下。

這個想一想也挺簡單,透過一個循環檢測文件,看文件的大小是否有變化,如果有變化,輸出文件變化的部分,當然了這裡面會有好多的細節,這裡具體分析下。

如果初始檔案太大或改變內容太多

這個時候一下輸出好多內容可能看不清,因此我在這裡設定了一個閾值8192,當內容長度超過這個閾值的時候,只輸出最後面的8192個字節,這樣就不會出現大面積的刷新導致看不清楚的問題。

如何偵測檔案大小的變化

這個問題是這個程式的核心,能不能成功,效能的好壞就靠這部分了。
我在這裡的實作是下面這樣:

  • 開啟檔案句柄$fp,這裡要注意,這裡的檔案句柄全程需中只開啟一次關閉一次,因此要將他放在循環的外部。
  • 初始化目前檔案大小file_sizefile_size_new都為0。
    • 循環裡面更新file_size_new檔案大小,這裡要注意,php中取得檔案大小之前一定要執行函數clearstatcache(),清除檔案狀態緩存,否則獲取文件大小可能會有偏差。
    • 計算add_size = file_size_new - file_size,看檔案大小是否有變化,如果有變化,將檔案指標移到指定位置,然後輸出新加的內容,更新file_size 值為new_file_size
    • usleep(50000),睡眠1/20秒。

程式碼實作

#!/usr/bin/env php 
<?php
if(2 != count($argv)){
    fwrite(
        STDERR,
        "调用格式错误!使用格式 ./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);

程式碼實作這裡第一行的#!/usr/bin/env php 是告訴可執行文件,可執行檔php在系統PATH中查找,這樣的好處就是移植性好。

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

查了PHP官方手冊,fseek函數這裡可以改進改進,這個函數也接受第三個參數,表示偏移指標的類型,預設是SEEK_SET,從開始偏移,也可以設定為SEEK_CUR,表示從目前位置偏移,因此這裡改為fseek($fp, $ignore_size, $ignore_size);

下面是結果

##推薦學習:《

PHP影片教學

以上是php怎麼實作linux指令的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn