在PHP程序中常常须要用shell_exec
执行一些命令,而普通的shell_exec
是阻塞的,若是命令执行时间过长,那可能会致使进程彻底卡住。
在Swoole4
协程环境下能够用Co::exec
并发地执行不少命令。php
本文基于Swoole-4.2.9
和PHP-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
提供的协程,是并发编程的利器。在工做中不少地方均可以使用协程,实现并发程序,大大提高程序性能。性能