php 外部命令,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不做更改):

umgenerate.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

本文转载于:博客园,如有侵犯,请联系a@php.cn删除

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值