在PHP程序中常常須要用shell_exec
執行一些命令,而普通的shell_exec
是阻塞的,若是命令執行時間過長,那可能會致使進程徹底卡住。
在Swoole4
協程環境下能夠用Co::exec
併發地執行不少命令。php
本文基於Swoole-4.2.9
和PHP-7.2.9
版本
<?php $c = 10; while($c--) { go(function () { //這裏使用 sleep 5 來模擬一個很長的命令 co::exec("sleep 5"); }); }
Co::exec
執行完成後會恢復掛起的協程,並返回命令的輸出和退出的狀態碼。shell
var_dump(co::exec("sleep 5"));
htf@htf-ThinkPad-T470p:~/workspace/debug$ time php t.php real 0m5.089s user 0m0.067s sys 0m0.038s htf@htf-ThinkPad-T470p:~/workspace/debug$
只用了 5秒
,程序就跑完了。編程
下面換成 PHP 的 shell_exec 來試試。併發
<?php $c = 10; while($c--) { //這裏使用 sleep 5 來模擬一個很長的命令 shell_exec("sleep 5"); }
使用nohup
或&
轉爲後臺執行,沒法獲得命令執行的結果和輸出,本文不對此進行深度探討
htf@htf-ThinkPad-T470p:~/workspace/debug$ time php s.php real 0m50.119s user 0m0.066s sys 0m0.058s htf@htf-ThinkPad-T470p:~/workspace/debug$
能夠看到阻塞版本花費了50秒
才完成。Swoole4
提供的協程,是併發編程的利器。在工做中不少地方均可以使用協程,實現併發程序,大大提高程序性能。性能