1. 程式人生 > >PHP協程:併發 shell_exec

PHP協程:併發 shell_exec

在PHP程式中經常需要用shell_exec執行一些命令,而普通的shell_exec是阻塞的,如果命令執行時間過長,那可能會導致程序完全卡住。
Swoole4協程環境下可以用Co::exec併發地執行很多命令。

本文基於 Swoole-4.2.9PHP-7.2.9版本

協程示例

<?php
$c = 10;
while($c--) {
    go(function () {
        //這裡使用 sleep 5 來模擬一個很長的命令
        co::exec("sleep 5");
    });
}

返回值

Co::exec執行完成後會恢復掛起的協程,並返回命令的輸出和退出的狀態碼。

var_dump(co::exec("sleep 5"));

協程結果

```[email protected]:~/workspace/debug$ time php t.php

real 0m5.089s
user 0m0.067s
sys 0m0.038s
[email protected]:~/workspace/debug$


<p>只用了 <code>5秒</code>,程式就跑完了。</p>
<p>下面換成 PHP 的 shell_exec 來試試。</p>
<h2>阻塞程式碼</h2>

<?php
$c = 10;
while($c--) {
//這裡使用 sleep 5 來模擬一個很長的命令
shell_exec("sleep 5");
}
```

使用 nohup&轉為後臺執行,無法得到命令執行的結果和輸出,本文不對此進行深度探討

阻塞結果

```[email protected]:~/workspace/debug$ time php s.php

real 0m50.119s
user 0m0.066s
sys 0m0.058s
[email protected]:~/workspace/debug$
```

可以看到阻塞版本花費了50秒才完成。Swoole4

提供的協程,是併發程式設計的利器。在工作中很多地方都可以使用協程,實現併發程式,大大提升程式效能。

原文地址:https://segmentfault.com/a/1190000017196514