php执行外部命令
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执行外部命令的更多相关文章
- golang os/exec 执行外部命令
exec包执行外部命令,它将os.StartProcess进行包装使得它更容易映射到stdin和stdout,并且利用pipe连接i/o. func LookPath(file string) (st ...
- PHP在linux上执行外部命令
PHP在linux上执行外部命令 一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以 ...
- Java中执行外部命令
在项目中执行一个linux的shell脚本,于是需要在java环境下执行外部命令如系统命令.linux命令的需求,本人小小研究了一下,又上网查了一些资料先整理如下. java执行外部命令主要依赖两个类 ...
- Powershell 执行外部命令
Powershell 执行外部命令 724 11月, 2011 在 Powershell tagged Powershell教程 / 程序 by Mooser Lee本文索引[隐藏]1通过nets ...
- Java 学习笔记 执行外部命令 包装类 枚举类型
执行外部命令 Runtime只能通过静态方法getRuntime获得,可以用来执行外部的命令 Runtime runtime = Runtime.getRuntime(); runtime.exec( ...
- php -- PHP在linux上执行外部命令,system(),exec(),shell_exec()
目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍 在PHP中调用外部命令,有三种方法: 1. 调用专门函 ...
- php在linux中执行外部命令
目录:一.PHP中调用外部命令介绍二.关于安全问题三.关于超时问题四.关于PHP运行linux环境中命令出现的问题 一.PHP中调用外部命令介绍在PHP中调用外部命令,可以用,1>调用专门函数. ...
- PHP执行外部命令【转】
PHP是完全支持外部命令的,但是出于安全考虑,一般很少使用. PHP提供共了3种方法调用外部命令: (1)调用执行外部命令函数(system(),exec(),passthru(),shell_exe ...
- python 利用python的subprocess模块执行外部命令,获取返回值
有时执行dos命令需要保存返回值 需要导入库subprocess import subprocess p = subprocess.Popen('ping www.baidu.com', shell= ...
随机推荐
- pyqt布局管理器QGridLayout简单示例
# _*_ coding:utf-8 _*_ import sys from PyQt4 import QtGui class Example(QtGui.QWidget): def __init__ ...
- 基于jQuery/CSS3实现拼图效果的相册插件
今天我们要来分享一款很酷的jQuery相册插件,首先相册中的图片会以一定的角度倾斜放置在页面上,点击图片缩略图就可以展开图片,并且图片是由所有缩略图拼接而成,图片展开和收拢的动画效果也非常不错.当然图 ...
- JDBC的介绍
JDBC详解 1.JDBC是什么? JDBC(JAVA DataBase Connection)即JAVA数据库连接技术,JDBC API是一个Java API,可以访问任何类型表列数据,特别是存 ...
- 汇编入门学习笔记 (九)—— call和ret
疯狂的暑假学习之 汇编入门学习笔记 (九)-- call和ret 參考: <汇编语言> 王爽 第10章 call和ret都是转移指令. 1. ret和retf ret指令:用栈中的数据 ...
- 【Unity笔记】Behaviour Designer的使用方法
Tasks列表 -- Composites选项 Sequence:图标是“箭头”,相当于And逻辑.下接多个子任务,它们从左到右依次执行.所有子任务执行成功,则Sequence返回成功:任一子任务执行 ...
- 经典SQL回顾之晋级篇
上篇博文在说SQL基础的时候,有一个地方有点误导大家,文中说到SQL 中的substring()和C#中的substring()相同,这有点歧义.基本原理虽然相同,但是有一点很不一样,就是C#中索引是 ...
- iscsi线缆
- Linux启动与禁止SSH用户及IP的登录
以下就针对SSH方面讨论一下.假设有人特别关注Linux环境的安全性,第一就从login方面来进行讨论 1:Linux启动或禁止SSH root用户的登录 2:Linux限制SSH用户 事实上这些东西 ...
- 【MySQL】MySQL 常用语法之锁表与解锁表
mysql 锁表语句: Lock锁整张表: 写锁定: LOCK TABLES products WRITE: 写锁,锁定之后,只有当前线程可以进行读操作和写操作,其他线程读操作和写操作均被堵塞.... ...
- 在tomcat下context.xml中配置各种数据库连接池(JNDI)
1. 首先,需要为数据源配置一个JNDI资源.我们的数据源JNDI资源应该定义在context元素中.在tomcat6版本中,context元素已经从server.xml文件中独立出来了,放在一个 ...