PHP協程:並發 shell_exec
阿新 • • 發佈:2018-12-13
狀態碼 ole workspace 完全 shell 基於 code 狀態 var_dump
在PHP程序中經常需要用shell_exec
執行一些命令,而普通的shell_exec
是阻塞的,如果命令執行時間過長,那可能會導致進程完全卡住。
在Swoole4
協程環境下可以用Co::exec
並發地執行很多命令。
本文基於Swoole-4.2.9
和PHP-7.2.9
版本
協程示例
<?php
$c = 10;
while($c--) {
go(function () {
//這裏使用 sleep 5 來模擬一個很長的命令
co::exec("sleep 5");
});
}
返回值
Co::exec
執行完成後會恢復掛起的協程,並返回命令的輸出和退出的狀態碼。
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$
<p>只用了 <code>5秒</code>,程序就跑完了。</p>
<p>下面換成 PHP 的 shell_exec 來試試。</p>
<h2>阻塞代碼</h2>
<?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
提供的協程,是並發編程的利器。在工作中很多地方都可以使用協程,實現並發程序,大大提升程序性能。
原文地址:https://segmentfault.com/a/1190000017196514
PHP協程:並發 shell_exec