PHP協程:併發 shell_exec

在PHP程序中常常須要用shell_exec執行一些命令,而普通的shell_exec是阻塞的,若是命令執行時間過長,那可能會致使進程徹底卡住。
Swoole4協程環境下能夠用Co::exec併發地執行不少命令。php

本文基於 Swoole-4.2.9PHP-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提供的協程,是併發編程的利器。在工做中不少地方均可以使用協程,實現併發程序,大大提高程序性能。性能

相關文章
相關標籤/搜索