在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提供的协程,是并发编程的利器。在工作中很多地方都可以使用协程,实现并发程序,大大提升程序性能。
phper在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家需要的(点击→)我的官方群677079770

本文探讨了在PHP中如何使用协程并发执行shell_exec命令,以避免阻塞问题。通过示例展示了协程环境下如何高效运行命令,提高程序性能。在阻塞情况下,执行时间较长,而协程方案则能显著减少等待时间。
789

被折叠的 条评论
为什么被折叠?



