博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP协程:并发 shell_exec
阅读量:6503 次
发布时间:2019-06-24

本文共 985 字,大约阅读时间需要 3 分钟。

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

原文地址:https://segmentfault.com/a/1190000017196514

转载于:https://www.cnblogs.com/lovellll/p/10113283.html

你可能感兴趣的文章
Linux下获取帮助
查看>>
Effective C++ 条款26
查看>>
EF只更新变化的字段
查看>>
matplotlib 雷达图2
查看>>
sql 查出一张表中重复的所有记录数据
查看>>
Spinner使用二
查看>>
SLF4J - 借助SLF4J, 统一适配所有日志实现为logback日志实现的实践
查看>>
log4j 转载
查看>>
[js高手之路] dom常用API【appendChild,insertBefore,removeChild,replaceChild,cloneNode】详解与应用...
查看>>
IIS并发连接数和数据库连接池
查看>>
软件工程作业 - word count
查看>>
JavaWeb使用Session防止表单重复提交
查看>>
JAVA-JSP之include指令
查看>>
Ubuntu中update-grub2与update-grub的区别
查看>>
nginx反向代理
查看>>
ASP.NET Core的身份认证框架IdentityServer4(6)- 开始
查看>>
service
查看>>
shell与if相关参数
查看>>
用fail2ban阻止ssh暴力破解root密码
查看>>
Mysql Order By 字符串排序,mysql 字符串order by
查看>>