PHP协程:并发 shell_exec
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP协程:并发 shell_exec相关的知识,希望对你有一定的参考价值。
在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"));
协程结果
```[email protected]:~/workspace/debug$ time php t.php
real 0m5.089s
user 0m0.067s
sys 0m0.038s
[email protected]:~/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
或&
转为后台执行,无法得到命令执行的结果和输出,本文不对此进行深度探讨
阻塞结果
```[email protected]:~/workspace/debug$ time php s.php
real 0m50.119s
user 0m0.066s
sys 0m0.058s
[email protected]:~/workspace/debug$
```
可以看到阻塞版本花费了50秒
才完成。Swoole4
提供的协程,是并发编程的利器。在工作中很多地方都可以使用协程,实现并发程序,大大提升程序性能。
原文地址:https://segmentfault.com/a/1190000017196514
以上是关于PHP协程:并发 shell_exec的主要内容,如果未能解决你的问题,请参考以下文章
PHP Hyperf连接Nacos RPC调用并发内存泄露(协程安全问题)