php非阻塞執行系統命令


    大家都知道php調用系統命令常用的主要有以下幾種方法:

exec(), system(), passthru(), shell_exec()

     這幾個函數的用法在此不做說明,有需要的請查閱php相關手冊。

今天主要說的是:非阻塞的方式執行系統命令。

那么,首先什么是非阻塞呢?

要說非阻塞,我們先說一下什么是阻塞,下面先看一個例子:

a.php
<?
    echo "begin:<br>";
    echo exec('php b.php');    //我這里為了方便測試是拿php直接執行一個程序當做系統命令,你可以執行其他命令,比如一個shell腳本,或者系統的一些其他程序,如打包tar -cvf xxx。
    echo "end";
?>

b.php
<?
    $file = fopen("a.txt", "a+");
    for($i=0;$i<100;$i++){
        fwrite($file,"line".$i." Hello World. Testing!\r\n");
        sleep(1);
    }
    fclose($file);
    echo "ok<br>";
?>

我們在瀏覽器中訪問上面的a.php后,發現瀏覽器一直轉啊轉,一直過了大概100秒才輸出最后的結果,結果是:

begin

ok

end

結果說明a.php在執行exec()函數的時候一直在等待b.php執行完才返回,這就是阻塞。

我們在實際項目中,如果用戶請求一個非常耗時的任務,比如耗時的批處理任務、文件打包或者大文件壓縮等等,這時候如果采用阻塞方式,那么用戶就需要在瀏覽器一直等,直到任務執行完返回才能干別的事。這很明顯不是一個好的設計。那么有沒有辦法做到非阻塞,即,不用等待耗時任務執行完就返回,而且返回結果后后台還得把活干完?

答案是有的,請看下面對a.php的修改

<?
    echo "begin:<br>";
    echo exec('php b.php'.' > /dev/null &');
    echo "end"; 
?>

沒錯照上面那樣修改后,就可以了,那

> /dev/null & 是什么意思呢?
> 這個符號,熟悉命令行的都應該清楚是指輸出
/div/null 這個在linux上是指空設備,是一個特殊的設備文件,我們可以認為是將輸出信息丟棄。
& 這個符號,熟悉命令行的應該也清楚,是指后台執行

 沒錯照上面那樣修改完后,就可以實現php非阻塞方式的調用系統命令了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM