纯php写的批处理管理工具.

分类
代码库
更新时间
2018-09-29 18:05:21

运行条件

1: 命令行: php-cgi.exe -nd extension_dir="D:/Qampp/php/ext" -f Data_lib/phpcgi.php (自行处理路径)

2: 由于需要com调用, 所有需要加载php_com_dotnet.dll

3: 可扩展编写..


Qampp用户即将内置此工具.

<?php
// php-cgi.exe -nd extension_dir="D:/Qampp/php/ext" -f Data_lib/phpcgi.php
// 20180929

ob_start();
set_time_limit(0);
error_reporting(E_ALL ^ E_NOTICE);
register_shutdown_function('Qend');

$dll = dl('php_com_dotnet.dll');
if(!defined('STDIN')){
    define('STDIN', fopen('php://stdin', 'r'));
    define('STDOUT', fopen('php://stdout', 'w'));
}

if(function_exists('mb_internal_encoding')){
   mb_internal_encoding('gbk');
   mb_http_output('gbk');
};

if(!is_cli()){
   exit('Cli run');
}

define('CGI_USERNAME', $_ENV['USERNAME']);
define('CGI_PHPBIN', $_ENV['PHP_PEAR_PHP_BIN']);
define('LANG_EMPTY', '没有任何结果!');
define('LANG_PINPUT', '请输入操作键数字或者dos命令:');
define('LANG_PLOGOUT', '你已经退出了系统');
define('LANG_PLOGOUTING', '确认退出系统');
define('LANG_PBACKL', '现在返回主页');
$_ENV['wmi'] = new COM('winmgmts://127.0.0.1/root/CIMV2');
$_ENV['orderlist'] = array();
$_ENV['orderlist'][1] = array('msg'=>'检测80,443端口占用','func'=>'Get_Netstat');
$_ENV['orderlist'][2] = array('msg'=>'检测Qampp服务状态','func'=>'Get_Server');
$_ENV['orderlist'][3] = array('msg'=>'检测PHP信息','func'=>'Get_Proinfo');
$_ENV['orderlist'][88] = array('msg'=>LANG_PLOGOUTING,'func'=>'Q_STOP');
$argv = intval($_SERVER['argv'][1]);

Index($argv);

function Index($act){   
    $_ENV['actid'] = trim($act);
    if($_ENV['orderlist'][$_ENV['actid']]['func']){ 
        $ret = call_user_func_array($_ENV['orderlist'][$_ENV['actid']]['func'],array());
    }else{
        if($_ENV['actid'])
        $ret = call_user_func_array('Rundos',array());
    }
    
    if($act){
      format_print($ret);
    }

    print_orderList();
    $_ENV['actList'][] = $_ENV['actid'];
    Index(watin_in(LANG_PINPUT));
}

function Rundos(){
    return _exec($_ENV['actid']);
}

function Q_STOP(){
    fclose(STDIN);
    fclose(STDOUT);
    $_ENV['wmi'] = null;
    exit(0);
}

function print_orderList(){
    watin_out('');
    foreach($_ENV['orderlist'] AS $key => $val){
        watin_out("\t[{$key}] {$val['msg']}");
    }
    watin_out('');
}

function Get_Proinfo(){
    $out = array();
    $out['PHPver'] = phpversion();
    $out['PHPdate'] = date('Y-m-d H:i:s');
    $out['extension_dir'] = ini_get('extension_dir');
    return $out;
}

function Get_Server(){
    $processes = $_ENV['wmi']->ExecQuery("SELECT Name,State,ProcessId FROM Win32_Service where Name LIKE 'Qampp_%'");
    $out = array();
    foreach($processes as $key => $process){
        $data = wmi_fetch($process);
        $out[] = $data;
    }
    return $out;
}

function format_print($ret){
    $spl = 4;
    watin_out('');
    // 计算每一段的长度
    if(!$ret || !is_array($ret))
       $ret = array($_ENV['actid']=>LANG_EMPTY);
    
    $len = $lens = array();
    foreach($ret AS $key => $val){
        if(is_array($val)){
           foreach($val AS $k => $v){
              $len[$k] = max($len[$k],strlen($k),strlen($v)); 
           }
        }else{
            $lens['kl'] = max(strlen($key),$lens['kl']);
            $lens['vl'] = max(strlen($val),$lens['vl']); 
        }
    }

    $i = 0;
    foreach($ret AS $key => $val){
        if(is_array($val)){ 
            if($i===0){
                foreach($val AS $k => $v){
                    watin_lin(str_pad(strtoupper($k),$len[$k]+$spl,' '));
                }
                watin_out('');
                watin_out(str_pad('',array_sum($len)+(count($val)*$spl),'-'));
            }
            
            foreach($val AS $k => $v){
                watin_lin(str_pad($v,$len[$k]+$spl,' '));
            }
            watin_out('');
       }else{
            if($i===0){
                watin_lin(str_pad('KEY',$lens['kl']+$spl,' '));
                watin_lin(str_pad('VAL',$lens['vl']+$spl,' '));
                watin_out('');
                watin_out(str_pad('',$lens['kl']+$lens['vl']+20,'-'));
            }

            watin_lin(str_pad($key,$lens['kl']+$spl,' '));
            watin_lin(str_pad($val,$lens['vl']+$spl,' '));
            watin_out('');
       }
       $i++;
    }
    watin_out('');
}

function Get_Netstat(){
    $out =  _exec('Netstat -ano | find "TCP" | find "LISTENING"'); 
    $wher = '';
    $newarr = array();
    foreach($out AS $key => $val){
        $new = array();
        $val = explode(' ',$val);
        $val = array_keys(array_flip($val));
        $prot = end(explode(':', $val[2]));

        $new['pid'] = $val[5]; 
        $new['prot'] = $prot;    
        $new['type'] = $val[1];
        $new['ip'] = $val[3];
        if($newarr[$prot]){
            continue;
        }

        if(!$wher){
           $wher = 'ProcessId='.$new['pid'];
        }else{
           $wher = $wher.' OR ProcessId='.$new['pid'];
        }
        $newarr[$prot] = $new;
    }

    $processes = $_ENV['wmi']->ExecQuery('SELECT * FROM Win32_Process WHERE '.$wher); // Win32_Service, Win32_Process , Win32_OperatingSystem
    $DataList = array();
    foreach($processes as $pkey => $process){
        $data = wmi_fetch($process);
        $DataList[$data['ProcessId']] = $data;
    }

    foreach($newarr AS $key => $val){
        if($DataList[$val['pid']]){
            $newarr[$key]['Caption'] = $DataList[$val['pid']]['Caption'];
            $newarr[$key]['Ram'] = format_bytes($DataList[$val['pid']]['WorkingSetSize']);
        }
    }

    if($newarr)
    ksort($newarr);
    return $newarr;
}

function _exec($cmd){
   $ret = @exec($cmd.' 2>&1',$out,$ecode);
    if($ecode){
       $out = array('Ret'=>$ret, 'ErrCode'=>$ecode, 'out'=>json_encode($out)); 
    }
    if(!is_array($out))
       $out = array(); 
    
    return $out; 
}

function watin_in($msg){
    watin_lin($msg);
    return trim(fgets(STDIN));
}

function watin_out($msg){
    fwrite(STDOUT, $msg."\n");
}

function watin_lin($msg){
    fwrite(STDOUT, $msg);
}

function is_cli(){
    return (PHP_SAPI === 'cli' OR PHP_SAPI === 'cgi-fcgi' OR defined('STDIN'));
}

function format_bytes($size){ 
$units = array(' B', ' KB', ' MB', ' GB', ' TB'); 
for ($i = 0; $size >= 1024 && $i < 4; $i++) $size /= 1024return round($size, 2).$units[$i]; 
} 

function wmi_fetch($process){
    $row = array();
    foreach($process->Properties_ AS $key => $val){
        if(is_object($val->value)){
            $tval = array();
            if(count($val->value)>0){
                foreach($val->value AS $k => $v){
                    $tval[$k] = $v;
                }
                $kval = json_encode($tval);
            }else{
                $kval = null;
            }
            $kname = $val->name;
        }else{
            $kname = $val->name;
            $kval = $val->value; 
        }
        $row[$kname] = $kval;
    }
    return $row;
}

function Qend(){
    @exec('TASKKILL /F /IM conhost.exe /T');
}


分享工作室[粤ICP备16004795号-2] 腾讯云 / 腾讯AI / 南沙新区 / 信用 0.013