php非阻塞執行系統命令

    你們都知道php調用系統命令經常使用的主要有如下幾種方法:php

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

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

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

那麼,首先什麼是非阻塞呢?函數

要說非阻塞,咱們先說一下什麼是阻塞,下面先看一個例子:測試

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秒才輸出最後的結果,結果是:spa

begin命令行

ok設計

endcode

結果說明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非阻塞方式的調用系統命令了。

相關文章
相關標籤/搜索