PHP协程:并发 shell_exec

82

在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"));

协程结果

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提供的协程,是并发编程的利器。在工作中很多地方都可以使用协程,实现并发程序,大大提升程序性能。


如果觉得我的文章对你有用,请随意赞赏

你可能感兴趣的

vishun · 2018年11月29日

这有点水啊。。。,shell_exec,exec也可以不阻塞后台运行啊,这对比并不怎么好。

回复

Object · 2018年11月30日

问题

  1. 请教后台进城分配?
  2. 协程是在当前进程执行的嘛?

回复

panjiapengfly · 2018年11月30日

感觉没有对比出协程好处,如果是用加 > /dev/null 2>&1 & 来执行也可以非阻塞运行, 如果能说明白这几个优缺点就好了

回复

0

nohup, & 之类只是转为守护进程去执行了,得不到命令的返回值呀

韩天峰 作者 · 2018年11月30日
上善若水 · 5月17日

nohup & 体现不出并发携程的感觉

回复

载入中...