php非阻塞执行系统命令
大家都知道php调用系统命令常用的主要有以下几种方法:
如exec(), system(), passthru(), shell_exec()
这几个函数的用法在此不做说明,有需要的请查阅php相关手册。
今天主要说的是:非阻塞的方式执行系统命令。
那么,首先什么是非阻塞呢?
要说非阻塞,我们先说一下什么是阻塞,下面先看一个例子:
a.php
<?
echo "begin:<br>";
echo exec('php b.php'); //我这里为了方便测试是拿php直接执行一个程序当做系统命令,你可以执行其他命令,比如一个shell脚本,或者系统的一些其他程序,如打包tar -cvf xxx。
echo "end";
?> b.php
<?
$file = fopen("a.txt", "a+");
for($i=0;$i<100;$i++){
fwrite($file,"line".$i." Hello World. Testing!\r\n");
sleep(1);
}
fclose($file);
echo "ok<br>";
?>
我们在浏览器中访问上面的a.php后,发现浏览器一直转啊转,一直过了大概100秒才输出最后的结果,结果是:
begin
ok
end
结果说明a.php在执行exec()函数的时候一直在等待b.php执行完才返回,这就是阻塞。
我们在实际项目中,如果用户请求一个非常耗时的任务,比如耗时的批处理任务、文件打包或者大文件压缩等等,这时候如果采用阻塞方式,那么用户就需要在浏览器一直等,直到任务执行完返回才能干别的事。这很明显不是一个好的设计。那么有没有办法做到非阻塞,即,不用等待耗时任务执行完就返回,而且返回结果后后台还得把活干完?
答案是有的,请看下面对a.php的修改
<?
echo "begin:<br>";
echo exec('php b.php'.' > /dev/null &');
echo "end";
?>
没错照上面那样修改后,就可以了,那
> /dev/null & 是什么意思呢?
> 这个符号,熟悉命令行的都应该清楚是指输出
/div/null 这个在linux上是指空设备,是一个特殊的设备文件,我们可以认为是将输出信息丢弃。
& 这个符号,熟悉命令行的应该也清楚,是指后台执行
没错照上面那样修改完后,就可以实现php非阻塞方式的调用系统命令了。
php非阻塞执行系统命令的更多相关文章
- layer.conifrm 非阻塞执行 ztree删除节点 问题
layer.confirm无法阻塞js执行,导致ztree插件的beforeRemove回调函数未等待用户确定删除便已经移除界面中的节点, 因此可能会出现前后台数据不一致情况,正常逻辑理应删除后台数据 ...
- 同步、异步、阻塞、非阻塞与future
前言 随着移动互联网的蓬勃发展,手机App层出不穷,其业务也随之变得错综复杂.针对于开发人员来说,可能之前的一个业务只需要调取一次第三方接口以获取数据,而如今随着需求的增加,该业务需调取多个不同的第三 ...
- tornado 异步调用系统命令和非阻塞线程池
项目中异步调用 ping 和 nmap 实现对目标 ip 和所在网关的探测 Subprocess.STREAM 不用担心进程返回数据过大造成的死锁, Subprocess.PIPE 会有这个问题. i ...
- PHP异步非阻塞fsockopen(本地可以非阻塞请求,服务器就一直执行异步的不成功) (未解决)
index.php /** * php异步请求 * * @param $host string 主机地址 * @param $path string 路径 * @param $param array ...
- CompletionService异步非阻塞获取并行任务执行结果
第1部分 问题引入 <Java并发编程实践>一书6.3.5节CompletionService:Executor和BlockingQueue,有这样一段话: "如果向Execut ...
- PHP非阻塞模式 (转自 尘缘)
让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_finish_re ...
- 转:PHP非阻塞模式
你可以任意转摘“PHP非阻塞模式”,但请保留本文出处和版权信息.作者:尘缘,QQ:130775,来源:http://www.4wei.cn/archives/1002336 让PHP不再阻塞当PHP作 ...
- php非阻塞
PHP非阻塞模式 让PHP不再阻塞当PHP作为后端处理需要完成一些长时间处理,为了快速响应页面请求,不作结果返回判断的情况下,可以有如下措施: 一.若你使用的是FastCGI模式,使用fastcgi_ ...
- 如何解读 Java IO、NIO 中的同步阻塞与同步非阻塞?
原文链接:如何解读 Java IO.NIO 中的同步阻塞与同步非阻塞? 一.前言 最近刚读完一本书:<Netty.Zookeeper.Redis 并发实战>,个人觉得 Netty 部分是写 ...
随机推荐
- Null Pointer --设计模式
在Joshua Bloch很有名的一本书<Effective in java>中建议不要在代码中返回空的collection/map/array,就像下面的代码一样: public Lis ...
- Cocos2d-x课程大纲/学习路线
Cocos2d-x课程大纲/学习路线 这是什么? 这个一个Cocos2d-x技术路线的课程大纲/学习大纲. 你能用它做什么? 如果你是找工作的人, 利用本大纲, 你可以学习Cocos2d-x, 做一个 ...
- css(html)背景图优化合并
图片本身的优化: 图像质量要求和图像文件大小决定你用什么格式的图片,用较小的图片文件呈现较好的图像质量. 当图片色彩过于丰富且无透明要求时,建议采用jpg格式并保存为较高质量. 当图片色彩过于丰富又有 ...
- 跨线程操作UI控件
写程序的时候经常会遇到跨线程访问控件的问题,看到不少人去设置Control.CheckForIllegalCrossThreadCalls = false;这句话是告诉编译器不要对跨线程访问作检查,可 ...
- POJ 3026 Borg Maze bfs+Kruskal
题目链接:http://poj.org/problem?id=3026 感觉英语比题目本身难,其实就是个最小生成树,不过要先bfs算出任意两点的权值. #include <stdio.h> ...
- 1500: [NOI2005]维修数列
Description Input 输入的第1 行包含两个数N 和M(M ≤20 000),N 表示初始时数列中数的个数,M表示要进行的操作数目.第2行包含N个数字,描述初始时的数列.以下M行,每行一 ...
- Uva 1354 Mobile Computing
题目链接 题意: 在一个宽为r 的房间里, 有s个砝码, 每个天平的一端要么挂砝码, 要么挂另一个天平, 并且每个天平要保持平衡. 求使得所有砝码都放在天平上, 且总宽度不超过房间宽度的最大值. 思路 ...
- leetcode 第九题 Palindrome Number(java)
Palindrome Number time=434ms 负数不是回文数 public class Solution { public boolean isPalindrome(int x) { in ...
- The Bellman-Ford algorithm
This algorithm deals with the general case, where G is a directed, weight graph, and it can contains ...
- BZOJ 1634: [Usaco2007 Jan]Protecting the Flowers 护花
Description Farmer John went to cut some wood and left N (2 <= N <= 100,000) cows eating the g ...