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