你們都知道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非阻塞方式的調用系統命令了。