php执行外部命令的不少,例如:exec、shell_exec、system、popen等。
我特意的讲一下popen,它跟其他函数不太一样,其他函数执行一个命令后,会等待其返回后,再向下执行,而popen则不会。
所以你想用php程序并行的处理一些业务的时候,可以用popen。
我举个例子,有两个php文件,numgame.php和numgenerate.php,numgame.php循环的生产一个数传参给numgenerate.php,用popen和shell_exec做个对比(其中numgenerate.php不做更改):
numgenerate.php

$num=$argv[1];
file_put_contents('/tmp/shell.log',$num."\t".date('H:i:s')."\n",FILE_APPEND);

1、用popen:

numgame.php:
function getnum($num){
$cmd=popen("ps -ef | grep 'php -f numgenerate.php'| wc -l",'r');
$currentnum=fgets($cmd,512);
fclose($cmd);
$maxnum=20;
if($currentnum>$maxnum){
sleep(5);
getnum($num);
}else{
$cmd2=popen("php -f numgenerate.php $num ",'r');
fclose($cmd2);
}

}

for($i=1111;$i<=99999;$i++){
if($i%1111!=0 && strpos($i,'0')===false){
getnum($i);
}
}

2、如果在执行numgenerate.php文件时,加入一个&,将其放倒后台,即将
$cmd2=popen("php -f numgenerate.php $num ",'r');
改为
$cmd2=popen("php -f numgenerate.php $num &",'r');
会发生什么变化。

3、用shell_exec:
numgame.php:
function getnum($num){
$currentnum=shell_exec("ps -ef | grep 'php -f numgenerate.php'| wc -l",'r');

$maxnum=20;
if($currentnum>$maxnum){
sleep(5);
getnum($num);
}else{
shell_exec("php -f numgenerate.php $num ",'r');

}

}

for($i=1111;$i<=99999;$i++){
if($i%1111!=0 && strpos($i,'0')===false){
getnum($i);
}
}

4、同样的,跟第2个例子一样,在其后面加个&,即将
shell_exec("php -f numgenerate.php $num ",'r');
改为
shell_exec("php -f numgenerate.php $num &",'r');

通过运行以上四个例子,shell.log的前1000条记录生成所需时间(记得每次运行完后,清空一下shell.log):

1、1分6秒
2、33秒
3、5分29秒
4、1分2秒

看吧,时间差距还是蛮大的。我觉得用&将命令放倒linux后台去执行,linux系统就不会等待其php程序执行的返回,从而更节省了时间。

参考文章:
php多进程并发控制的测试用例
PHP中的执行命令和管道及进程间通讯(说实话,关于实现原理那部分没怎么看懂)

php执行外部命令的更多相关文章

  1. golang os/exec 执行外部命令

    exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o. func LookPath(file string) (st ...

  2. PHP在linux上执行外部命令

    PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以 ...

  3. Java中执行外部命令

    在项目中执行一个linux的shell脚本,于是需要在java环境下执行外部命令如系统命令.linux命令的需求,本人小小研究了一下,又上网查了一些资料先整理如下. java执行外部命令主要依赖两个类 ...

  4. Powershell 执行外部命令

    Powershell 执行外部命令 724 11月, 2011  在 Powershell  tagged Powershell教程 / 程序 by Mooser Lee本文索引[隐藏]1通过nets ...

  5. Java 学习笔记 执行外部命令 包装类 枚举类型

    执行外部命令 Runtime只能通过静态方法getRuntime获得,可以用来执行外部的命令 Runtime runtime = Runtime.getRuntime(); runtime.exec( ...

  6. php -- PHP在linux上执行外部命令,system(),exec(),shell_exec()

    目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,有三种方法: 1. 调用专门函 ...

  7. php在linux中执行外部命令

    目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数. ...

  8. PHP执行外部命令【转】

    PHP是完全支持外部命令的,但是出于安全考虑,一般很少使用. PHP提供共了3种方法调用外部命令: (1)调用执行外部命令函数(system(),exec(),passthru(),shell_exe ...

  9. python 利用python的subprocess模块执行外部命令,获取返回值

    有时执行dos命令需要保存返回值 需要导入库subprocess import subprocess p = subprocess.Popen('ping www.baidu.com', shell= ...

随机推荐

  1. 基于js仿汽车之家2015新版焦点图代码

    今天给大家分享一款仿汽车之家2015新版焦点图代码.这是一款基于jQuery实现的适合电子商务网站或者企业产品展示功能特效.效果图如下: 在线预览   源码下载 实现的代码. html代码: < ...

  2. java 关于同步异步的理解

    经常看到介绍 ArrayList 和HashMap是异步,Vector和HashTable是同步,这里同步是线程安全的,异步不是线程安全的,举例说明: 当创建一个Vector对象时候, Vector ...

  3. Object中有哪些方法?

    有一种遗憾就是,每天都见到你,但是却不关注你!等到面试的时候才后悔莫及. Object类中有9大public方法: equals:判断两个对象"相等" hashCode:获取对象的 ...

  4. invalid conversion from 'void* (*)()' to 'void* (*)(void*)'

    void *thread1() ], NULL, thread1, NULL)) != ) 提示:invalid conversion from 'void* (*)()' to 'void* (*) ...

  5. wireshark教程(一)

    按照国际惯例,从最基本的说起. 抓取报文: 下载和安装好Wireshark之后,启动Wireshark并且在接口列表中选择接口名,然后开始在此接口上抓包.例如,如果想要在无线网络上抓取流量,点击无线接 ...

  6. CMake 用法导览

    Preface : 本文是CMake官方文档CMake Tutorial (http://www.cmake.org/cmake/help/cmake_tutorial.html) 的翻译.通过一个样 ...

  7. 单片机小白学步系列(二十) IO口原理

    IO口操作是单片机实践中最基本最重要的一个知识,本篇花了比較长的篇幅介绍IO口的原理. 也是查阅了不少资料,确保内容正确无误,花了非常长时间写的. IO口原理原本须要涉及非常多深入的知识,而这里尽最大 ...

  8. div绝对定位针对手机浏览器的区别

    最近在对ipad和安卓平板做测试,发现我自己写的一个下拉控件在安卓浏览器里面被遮盖了,但是PC或者ipad都没有这个现象,一开始以为是z-index 可是无论我调多少都没有用,研究了好久,发现是代码的 ...

  9. iOS边练边学--transform的简单介绍并且用transform实现键盘处理

    一.transform:形变属性,能完成功能:平移,缩放,旋转 <平移> // 根据给的移动距离平移 self.tempView.transform = CGAffineTransform ...

  10. 关于Cocos2d-x中精灵节点的透明度的设置

    1.当我们需要某个精灵作为一个大一点的容器来存放其他的小精灵的时候,我们先设置这个精灵的大小 setTextureRect(Rect(0, 0, babySize.width, babySize.he ...