PHP协程:并发 shell_exec

PHP协程:并发 shell_exec


在PHP程序中经常需要用 shell_exec执行一些命令,而普通的shell_exec·是阻塞的,如果命令执行时间过长,那可能会导致进程完全卡住。
在Swoole4协程环境下可以用Co::exec并发地执行很多命令。

本文基于Swoole-4.2.9和PHP-7.2.9版本
在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$
只用了 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提供的协程,是并发编程的利器。在工作中很多地方都可以使用协程,实现并发程序,大大提升程序性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值