<?php

/**
 * @author Tuesday [104979058@qq.com]
 * @copyright 2015
 */
// 文件为 utf-8, 请求项为gbk,所以转换. mb_convert_encoding
date_default_timezone_set('UTC');
error_reporting(0);
$argv $_SERVER['argv'];

$_GET = array();
$_POST = array();
$_FILES = array();

$prot $argv[1];
empty(
$prot) && $prot=80;
$prot = ($prot != 80)?':'.$prot:'';

$url "http://127.0.0.1{$prot}/server-status/";
$data curlquery($url);

$data mb_convert_encoding($data,'utf-8');
if (!
$data){
    echo 
'Cannot access links';
    exit();
}

preg_match_all('/<dl>.*<\/dl>/isU'$data$reg);
$dl '';
if(
$reg[0]){
    foreach(
$reg[0] AS $val){
        
$dl .= $val;
    }
}

if(
$dl){
   
$data strtr($data, array($dl=>''));
   
preg_match_all('/<dt>([^<]*)<\/dt>/isU'$dl$reg);
   
$dl = array();
   if(
$reg[1]){
        foreach(
$reg[1] AS $key => $val){
            if(
strpos($val,'?') !== false)
                
$val preg_replace('/\?.*$/isU''',$val);
            
$dl[$key] = trim($val);
        }
   }
}

$keys = array();
$keys['_'] = 'Waiting for Connection';
$keys['S'] = 'Starting up';
$keys['R'] = 'Reading Request';
$keys['W'] = 'Sending Reply';
$keys['K'] = 'Keepalive (read)';
$keys['D'] = 'DNS Lookup';
$keys['C'] = 'Closing connection';
$keys['L'] = 'Logging';
$keys['G'] = 'Gracefully finishing';
$keys['I'] = 'Idle cleanup of worker';
$keys['.'] = 'Open slot with no current process';


$meuns = array();
$meuns['Srv'] = 'Child Server number - generation'
$meuns['PID'] = 'OS process ID'
$meuns['Acc'] = 'Number of accesses this connection / this child / this slot'
$meuns['M'] = 'Mode of operation'
$meuns['SS'] = 'Seconds since beginning of most recent request'
$meuns['Req'] = 'Milliseconds required to process most recent request'
$meuns['Child'] = 'Kilobytes transferred this connection'
$meuns['Child'] = 'Megabytes transferred this child'
$meuns['Slot'] = 'Total megabytes transferred this slot'
$meuns['Client'] = 'Client information';
$meuns['VHost'] = 'Host information'
$meuns['Request'] = 'Request information'

preg_match_all('/<table.*<\/table>/isU'$data$reg);
if(
$reg[0]){
    if(
$reg[0][0])
    
$list $reg[0][0];
    
$ssl end($reg[0]);
}

if(
$ssl){
    
preg_match('/<td.*?>(.*b>SHMCB<\/b>.*)<\/td>/isU',$ssl$reg);
    if(
$reg[1]){
        
$tem explode('<br>'$reg[1]);
        
$ssl = array();
        if(
$tem){
            foreach(
$tem AS $key => $val){
                
$val strip_tags(trim($val));
                if(
$val)
                
$ssl[$key] = $val;
            }
        }
    }
}else{
    
$ssl = array();
}

$list_meun = array();
$list_all = array();
if(
$list){
    
preg_match_all('/<tr>.*<\/tr>/isU'$list$reg);
    if(
$reg[0][0]){
        
$list strtr($list, array($reg[0][0]=>''));
        
preg_match_all('/>([^<]+)</isU'$reg[0][0], $regs);
        foreach(
$regs[1] AS $val){
            
$val trim($val);
            
$list_meun[] = $val;
        }
    }
        
    unset(
$reg[0][0]);
    foreach(
$reg[0] AS $val){
        
$val strip_tags($val,'<td>');
        
preg_match_all('/>([^<]+)</isU'$val$regs);
        
        
$tem = array();
        foreach(
$regs[1] AS $key => $val){
            
$tem[$list_meun[$key]] = trim($val);
        }
        
$list_all[] = $tem;
    }
}

if(
$list_all)
    
$list_all array_orderby($list_all'M'SORT_ASC,'Conn',SORT_DESC);

echo 
jsonencode(array('header'=>$dl'keys'=>$keys,'tag'=>$meuns,'list_meun'=>$list_meun,'list'=>$list_all));
exit();

function 
array_orderby(){
    
$args func_get_args();
    
$data array_shift($args);
    foreach (
$args as $n => $field) {
        if (
is_string($field)) {
            
$tmp = array();
            foreach (
$data as $key => $row)
                
$tmp[$key] = $row[$field];
            
$args[$n] = $tmp;
            }
    }
    
$args[] = &$data;
    
call_user_func_array('array_multisort'$args);
    return 
array_pop($args);
}

function 
jsonencode($array){
    if (
version_compare(PHP_VERSION,'5.4.0','>=')){
        return 
json_encode($array,JSON_UNESCAPED_UNICODE);
    }else{
        return 
json_encode($array);
    }
}

function 
curlquery($url){
    
$ch curl_init();  
    
$timeout 2;  
    
curl_setopt ($chCURLOPT_URL$url);  
    
curl_setopt ($chCURLOPT_RETURNTRANSFER1);  
    
curl_setopt ($chCURLOPT_CONNECTTIMEOUT$timeout);  
    
$file_contents curl_exec($ch); 
    
curl_close($ch);
    return 
$file_contents;  
}