zoukankan      html  css  js  c++  java
  • 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." ".date('H:i:s')." ",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中的执行命令和管道及进程间通讯(说实话,关于实现原理那部分没怎么看懂)

  • 相关阅读:
    es-07-head插件-ik分词器插件
    es-01-简介
    es-02-elasticsearch安装及遇到的问题
    es-03-DSL的简单使用
    es-04-mapping和setting的建立
    lucene-01-简介
    Scipy---1.常数和特殊函数
    Pandas---12.数据加载和保存
    Pandas---11.移动窗口函数
    Pandas---10.DataFrame绘图
  • 原文地址:https://www.cnblogs.com/lixiuran/p/3754625.html
Copyright © 2011-2022 走看看