yhdsir@function:php

news/2024/7/4 10:03:46

 

curl 获取页面信息

function curl_get_content($url){
    $curl = curl_init(); 
    curl_setopt($curl, CURLOPT_URL, $url); // 要访问的地址 
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, 0); // 对认证证书来源的检查 
    curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.97'); // 模拟用户使用的浏览器 
    curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1); // 使用自动跳转 
    curl_setopt($curl, CURLOPT_AUTOREFERER, 1); // 自动设置Referer 
     //               curl_setopt($curl, CURLOPT_HTTPHEADER, $refer); 
    curl_setopt($curl, CURLOPT_TIMEOUT, 30); // 设置超时限制防止死循环 
    curl_setopt($curl, CURLOPT_HEADER, 1); // 显示返回的Header区域内容 
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // 获取的信息以文件流的形式返回 

    $res = curl_exec($curl); 
    curl_close($curl); 
   return $res;
}

 

 

调试用

function p($str)
{
    echo '<pre>';
    print_r($str);
    echo '</pre>';
}

 

罗飞老师的socketLog、项目地址:https://github.com/luofei614/SocketLog

<?php
/**
 * github: https://github.com/luofei614/SocketLog
 * @author luofei614<weibo.com/luofei614>
 */
function slog($log,$type='log',$css='')
{
    if(is_string($type))
    {
        $type=preg_replace_callback('/_([a-zA-Z])/',create_function('$matches', 'return strtoupper($matches[1]);'),$type);
        if(method_exists('SocketLog',$type) || in_array($type,SocketLog::$log_types))
        {
           return  call_user_func(array('SocketLog',$type),$log,$css);
        }
    }

    if(is_object($type) && 'mysqli'==get_class($type))
    {
           return SocketLog::mysqlilog($log,$type);
    }

    if(is_resource($type) && ('mysql link'==get_resource_type($type) || 'mysql link persistent'==get_resource_type($type)))
    {
           return SocketLog::mysqllog($log,$type);
    }


    if(is_object($type) && 'PDO'==get_class($type))
    {
           return SocketLog::pdolog($log,$type);
    }

    throw new Exception($type.' is not SocketLog method');
}

class SocketLog
{
    public static $start_time=0;
    public static $start_memory=0;
    public static $port=1116;//SocketLog 服务的http的端口号
    public static $log_types=array('log','info','error','warn','table','group','groupCollapsed','groupEnd','alert');

    protected static $_instance;

    protected static $config=array(
        'host'=>'localhost',
        //是否显示利于优化的参数,如果允许时间,消耗内存等
        'optimize'=>false,
        'show_included_files'=>false,
        'error_handler'=>false,
        //日志强制记录到配置的client_id
        'force_client_id'=>'',
        //限制允许读取日志的client_id
        'allow_client_ids'=>array()
    );

    protected static $logs=array();

    protected static $css=array(
        'sql'=>'color:#009bb4;',
        'sql_warn'=>'color:#009bb4;font-size:14px;',
        'error_handler'=>'color:#f4006b;font-size:14px;',
        'page'=>'color:#40e2ff;background:#171717;'
    );

    public static function __callStatic($method,$args)
    {
        if(in_array($method,self::$log_types))
        {
            array_unshift($args,$method);
            return call_user_func_array(array(self::getInstance(),'record'),$args);
        }
    }

    public static function big($log)
    {
            self::log($log,'font-size:20px;color:red;');
    }

    public static function trace($msg,$trace_level=2,$css='')
    {
        if(!self::check())
        {
            return ;
        }
        self::groupCollapsed($msg,$css);
        $traces=debug_backtrace(false);
        $traces=array_reverse($traces);
        $max=count($traces)-$trace_level;
        for($i=0;$i<$max;$i++){
            $trace=$traces[$i];
            $fun=isset($trace['class'])?$trace['class'].'::'.$trace['function']:$trace['function'];
            $file=isset($trace['file'])?$trace['file']:'unknown file';
            $line=isset($trace['line'])?$trace['line']:'unknown line';
            $trace_msg='#'.$i.'  '.$fun.' called at ['.$file.':'.$line.']';
            if(!empty($trace['args'])){
                self::groupCollapsed($trace_msg);
                self::log($trace['args']);
                self::groupEnd();
            }else{
                self::log($trace_msg);
            }
        }
        self::groupEnd();
    }


    public static function mysqlilog($sql,$db)
    {
        if(!self::check())
        {
            return ;
        }

        $css=self::$css['sql'];
        if(preg_match('/^SELECT /i', $sql))
        {
            //explain
            $query = @mysqli_query($db,"EXPLAIN ".$sql);
            $arr=mysqli_fetch_array($query);
            self::sqlexplain($arr,$sql,$css);
        }
        self::sqlwhere($sql,$css);
        self::trace($sql,2,$css);
    }


    public static function mysqllog($sql,$db)
    {
        if(!self::check())
        {
            return ;
        }
        $css=self::$css['sql'];
        if(preg_match('/^SELECT /i', $sql))
        {
            //explain
            $query = @mysql_query("EXPLAIN ".$sql,$db);
            $arr=mysql_fetch_array($query);
            self::sqlexplain($arr,$sql,$css);
        }
        //判断sql语句是否有where
        self::sqlwhere($sql,$css);
        self::trace($sql,2,$css);
    }


    public static function pdolog($sql,$pdo)
    {
        if(!self::check())
        {
            return ;
        }
        $css=self::$css['sql'];
        if(preg_match('/^SELECT /i', $sql))
        {
            //explain
            try {
                $obj=$pdo->query( "EXPLAIN ".$sql);
                if(is_object($obj) && method_exists($obj,'fetch'))
                {
                    $arr=$obj->fetch(PDO::FETCH_ASSOC);
                    self::sqlexplain($arr,$sql,$css);
                }
            } catch (Exception $e) {

            }
        }
        self::sqlwhere($sql,$css);
        self::trace($sql,2,$css);
    }

    private static function sqlexplain($arr,&$sql,&$css)
    {
        $arr = array_change_key_case($arr, CASE_LOWER);
        if(false!==strpos($arr['extra'],'Using filesort'))
        {
              $sql.=' <---################[Using filesort]';
              $css=self::$css['sql_warn'];
        }
        if(false!==strpos($arr['extra'],'Using temporary'))
        {
              $sql.=' <---################[Using temporary]';
              $css=self::$css['sql_warn'];
        }
    }
    private static function sqlwhere(&$sql,&$css)
    {
        //判断sql语句是否有where
        if(preg_match('/^UPDATE |DELETE /i',$sql) && !preg_match('/WHERE.*(=|>|<|LIKE|IN)/i',$sql))
        {
           $sql.='<---###########[NO WHERE]';
           $css=self::$css['sql_warn'];
        }
    }


    /**
     * 接管报错
     */
    public static function registerErrorHandler()
    {
        if(!self::check())
        {
            return ;
        }

        set_error_handler(array(__CLASS__,'error_handler'));
        register_shutdown_function(array(__CLASS__,'fatalError'));
    }

    public static function error_handler($errno, $errstr, $errfile, $errline)
    {
        switch($errno){
            case E_WARNING: $severity = 'E_WARNING'; break;
            case E_NOTICE: $severity = 'E_NOTICE'; break;
            case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
            case E_USER_WARNING: $severity = 'E_USER_WARNING'; break;
            case E_USER_NOTICE: $severity = 'E_USER_NOTICE'; break;
            case E_STRICT: $severity = 'E_STRICT'; break;
            case E_RECOVERABLE_ERROR: $severity = 'E_RECOVERABLE_ERROR'; break;
            case E_DEPRECATED: $severity = 'E_DEPRECATED'; break;
            case E_USER_DEPRECATED: $severity = 'E_USER_DEPRECATED'; break;
            case E_ERROR: $severity = 'E_ERR'; break;
            case E_PARSE: $severity = 'E_PARSE'; break;
            case E_CORE_ERROR: $severity = 'E_CORE_ERROR'; break;
            case E_COMPILE_ERROR: $severity = 'E_COMPILE_ERROR'; break;
            case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
            default: $severity= 'E_UNKNOWN_ERROR_'.$errno; break;
        }
        $msg="{$severity}: {$errstr} in {$errfile} on line {$errline} -- SocketLog error handler";
        self::trace($msg,2,self::$css['error_handler']);
    }

    public static function fatalError()
    {
        // 保存日志记录
        if ($e = error_get_last())
        {
                self::error_handler($e['type'],$e['message'],$e['file'],$e['line']);
                self::sendLog();//此类终止不会调用类的 __destruct 方法,所以此处手动sendLog
        }
    }



    public static function getInstance()
    {
        if (self::$_instance === null) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    protected static function _log($type,$logs,$css='')
    {
        self::getInstance()->record($type,$logs,$css);
    }


    protected static function check()
    {
        $tabid=self::getClientArg('tabid');
         //是否记录日志的检查
        if(!$tabid && !self::getConfig('force_client_id'))
        {
            return false;
        }
        //用户认证
        $allow_client_ids=self::getConfig('allow_client_ids');
        if(!empty($allow_client_ids))
        {
            if (!$tabid && in_array(self::getConfig('force_client_id'), $allow_client_ids)) {
                return true;
            }

            $client_id=self::getClientArg('client_id');
            if(!in_array($client_id,$allow_client_ids))
            {
                return false;
            }
        }
        return true;
    }

    protected static function getClientArg($name)
    {
        static $args=array();

        $key = 'HTTP_USER_AGENT';

        if (isset($_SERVER['HTTP_SOCKETLOG'])) {
            $key = 'HTTP_SOCKETLOG';
        }

        if(!isset($_SERVER[$key]))
        {
            return null;
        }
        if(empty($args))
        {
            if(!preg_match('/SocketLog\((.*?)\)/',$_SERVER[$key],$match))
            {
                $args=array('tabid'=>null);
                return null;
            }
            parse_str($match[1],$args);
        }
        if(isset($args[$name]))
        {
            return $args[$name];
        }
        return null;
    }


    //设置配置
    public static function  setConfig($config)
    {
        $config=array_merge(self::$config,$config);
        self::$config=$config;
        if(self::check())
        {
            self::getInstance(); //强制初始化SocketLog实例
            if($config['optimize'])
            {
                self::$start_time=microtime(true);
                self::$start_memory=memory_get_usage();
            }

            if($config['error_handler'])
            {
                self::registerErrorHandler();
            }
        }
    }


    //获得配置
    public static function  getConfig($name)
    {
        if(isset(self::$config[$name]))
            return self::$config[$name];
        return null;
    }

    //记录日志
    public function record($type,$msg='',$css='')
    {
        if(!self::check())
        {
            return ;
        }

        self::$logs[]=array(
            'type'=>$type,
            'msg'=>$msg,
            'css'=>$css
        );
    }

    /**
     * @param null $host - $host of socket server
     * @param string $message - 发送的消息
     * @param string $address - 地址
     * @return bool
     */
    public static function send($host,$message='',$address='/')
    {
        $url='http://'.$host.':'.self::$port.$address;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $message);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        $headers=array(
                 "Content-Type: application/json;charset=UTF-8"
        );
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);//设置header
        $txt = curl_exec($ch);
        return true;
    }

    public static function sendLog()
    {
        if(!self::check())
        {
            return ;
        }

        $time_str='';
        $memory_str='';
        if(self::$start_time)
        {
            $runtime=microtime(true)-self::$start_time;
            $reqs=number_format(1/$runtime,2);
            $time_str="[运行时间:{$runtime}s][吞吐率:{$reqs}req/s]";
        }
        if(self::$start_memory)
        {
            $memory_use=number_format(memory_get_usage()-self::$start_memory/1024,2);
            $memory_str="[内存消耗:{$memory_use}kb]";
        }

        if(isset($_SERVER['HTTP_HOST']))
        {
            $current_uri=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        }
        else
        {
            $current_uri="cmd:".implode(' ',$_SERVER['argv']);
        }
        array_unshift(self::$logs,array(
                'type'=>'group',
                'msg'=>$current_uri.$time_str.$memory_str,
                'css'=>self::$css['page']
        ));

        if(self::getConfig('show_included_files'))
        {
            self::$logs[]=array(
                    'type'=>'groupCollapsed',
                    'msg'=>'included_files',
                    'css'=>''
            );
            self::$logs[]=array(
                    'type'=>'log',
                    'msg'=>implode("\n",get_included_files()),
                    'css'=>''
            );
            self::$logs[]=array(
                    'type'=>'groupEnd',
                    'msg'=>'',
                    'css'=>'',
            );
        }

        self::$logs[]=array(
                'type'=>'groupEnd',
                'msg'=>'',
                'css'=>'',
        );

        $tabid=self::getClientArg('tabid');
        if(!$client_id=self::getClientArg('client_id'))
        {
            $client_id='';
        }
        if($force_client_id=self::getConfig('force_client_id'))
        {
            $client_id=$force_client_id;
        }
        $logs=array(
            'tabid'=>$tabid,
            'client_id'=>$client_id,
            'logs'=>self::$logs,
            'force_client_id'=>$force_client_id,
        );
        $msg=@json_encode($logs);
        $address='/'.$client_id; //将client_id作为地址, server端通过地址判断将日志发布给谁
        self::send(self::getConfig('host'),$msg,$address);

    }

    public function __destruct()
    {
        self::sendLog();
    }

}
socketLog

socketLog.class.php 下载地址:http://pan.baidu.com/s/1ntEjEe1

socketLog基本配置

<?php

include './SocketLog.class.php';

slog(array(
    'host' => 'localhost', //websocket服务器地址,默认localhost
    'port' => '1229', //websocket服务器端口,默认端口是1229
    'optimize' => false, //是否显示利于优化的参数,如果运行时间,消耗内存等,默认为false
    'show_included_files' => false, //是否显示本次程序运行加载了哪些文件,默认为false
    'error_handler' => false, //是否接管程序错误,将程序错误显示在console中,默认为false
    'force_client_id' => '', //日志强制记录到配置的client_id,默认为空
    'allow_client_ids' => array()////限制允许读取日志的client_id,默认为空,表示所有人都可以获得日志。
        )
        , 'set_config');

 

<?php
/**
 * github: https://github.com/luofei614/SocketLog
 * @author luofei614<weibo.com/luofei614>
 */
function slog($log,$type='log',$css='')
{
    if(is_string($type))
    {
        $type=preg_replace_callback('/_([a-zA-Z])/',create_function('$matches', 'return strtoupper($matches[1]);'),$type);
        if(method_exists('SocketLog',$type) || in_array($type,SocketLog::$log_types))
        {
           return  call_user_func(array('SocketLog',$type),$log,$css);
        }
    }

    if(is_object($type) && 'mysqli'==get_class($type))
    {
           return SocketLog::mysqlilog($log,$type);
    }

    if(is_resource($type) && ('mysql link'==get_resource_type($type) || 'mysql link persistent'==get_resource_type($type)))
    {
           return SocketLog::mysqllog($log,$type);
    }


    if(is_object($type) && 'PDO'==get_class($type))
    {
           return SocketLog::pdolog($log,$type);
    }

    throw new Exception($type.' is not SocketLog method');
}

class SocketLog
{
    public static $start_time=0;
    public static $start_memory=0;
    public static $port=1116;//SocketLog 服务的http的端口号
    public static $log_types=array('log','info','error','warn','table','group','groupCollapsed','groupEnd','alert');

    protected static $_instance;

    protected static $config=array(
        'host'=>'localhost',
        //是否显示利于优化的参数,如果允许时间,消耗内存等
        'optimize'=>true,
        'show_included_files'=>false,
        'error_handler'=>true,
        //日志强制记录到配置的client_id
        'force_client_id'=>'',
        //限制允许读取日志的client_id
        array('yhdsir_log', 'yhdsir_loger'),
    );

    protected static $logs=array();

    protected static $css=array(
        'sql'=>'color:#009bb4;',
        'sql_warn'=>'color:#009bb4;font-size:14px;',
        'error_handler'=>'color:#f4006b;font-size:14px;',
        'page'=>'color:#40e2ff;background:#171717;'
    );

    public static function __callStatic($method,$args)
    {
        if(in_array($method,self::$log_types))
        {
            array_unshift($args,$method);
            return call_user_func_array(array(self::getInstance(),'record'),$args);
        }
    }

    public static function big($log)
    {
            self::log($log,'font-size:20px;color:red;');
    }

    public static function trace($msg,$trace_level=2,$css='')
    {
        if(!self::check())
        {
            return ;
        }
        self::groupCollapsed($msg,$css);
        $traces=debug_backtrace(false);
        $traces=array_reverse($traces);
        $max=count($traces)-$trace_level;
        for($i=0;$i<$max;$i++){
            $trace=$traces[$i];
            $fun=isset($trace['class'])?$trace['class'].'::'.$trace['function']:$trace['function'];
            $file=isset($trace['file'])?$trace['file']:'unknown file';
            $line=isset($trace['line'])?$trace['line']:'unknown line';
            $trace_msg='#'.$i.'  '.$fun.' called at ['.$file.':'.$line.']';
            if(!empty($trace['args'])){
                self::groupCollapsed($trace_msg);
                self::log($trace['args']);
                self::groupEnd();
            }else{
                self::log($trace_msg);
            }
        }
        self::groupEnd();
    }


    public static function mysqlilog($sql,$db)
    {
        if(!self::check())
        {
            return ;
        }

        $css=self::$css['sql'];
        if(preg_match('/^SELECT /i', $sql))
        {
            //explain
            $query = @mysqli_query($db,"EXPLAIN ".$sql);
            $arr=mysqli_fetch_array($query);
            self::sqlexplain($arr,$sql,$css);
        }
        self::sqlwhere($sql,$css);
        self::trace($sql,2,$css);
    }


    public static function mysqllog($sql,$db)
    {
        if(!self::check())
        {
            return ;
        }
        $css=self::$css['sql'];
        if(preg_match('/^SELECT /i', $sql))
        {
            //explain
            $query = @mysql_query("EXPLAIN ".$sql,$db);
            $arr=mysql_fetch_array($query);
            self::sqlexplain($arr,$sql,$css);
        }
        //判断sql语句是否有where
        self::sqlwhere($sql,$css);
        self::trace($sql,2,$css);
    }


    public static function pdolog($sql,$pdo)
    {
        if(!self::check())
        {
            return ;
        }
        $css=self::$css['sql'];
        if(preg_match('/^SELECT /i', $sql))
        {
            //explain
            try {
                $obj=$pdo->query( "EXPLAIN ".$sql);
                if(is_object($obj) && method_exists($obj,'fetch'))
                {
                    $arr=$obj->fetch(PDO::FETCH_ASSOC);
                    self::sqlexplain($arr,$sql,$css);
                }
            } catch (Exception $e) {

            }
        }
        self::sqlwhere($sql,$css);
        self::trace($sql,2,$css);
    }

    private static function sqlexplain($arr,&$sql,&$css)
    {
        $arr = array_change_key_case($arr, CASE_LOWER);
        if(false!==strpos($arr['extra'],'Using filesort'))
        {
              $sql.=' <---################[Using filesort]';
              $css=self::$css['sql_warn'];
        }
        if(false!==strpos($arr['extra'],'Using temporary'))
        {
              $sql.=' <---################[Using temporary]';
              $css=self::$css['sql_warn'];
        }
    }
    private static function sqlwhere(&$sql,&$css)
    {
        //判断sql语句是否有where
        if(preg_match('/^UPDATE |DELETE /i',$sql) && !preg_match('/WHERE.*(=|>|<|LIKE|IN)/i',$sql))
        {
           $sql.='<---###########[NO WHERE]';
           $css=self::$css['sql_warn'];
        }
    }


    /**
     * 接管报错
     */
    public static function registerErrorHandler()
    {
        if(!self::check())
        {
            return ;
        }

        set_error_handler(array(__CLASS__,'error_handler'));
        register_shutdown_function(array(__CLASS__,'fatalError'));
    }

    public static function error_handler($errno, $errstr, $errfile, $errline)
    {
        switch($errno){
            case E_WARNING: $severity = 'E_WARNING'; break;
            case E_NOTICE: $severity = 'E_NOTICE'; break;
            case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
            case E_USER_WARNING: $severity = 'E_USER_WARNING'; break;
            case E_USER_NOTICE: $severity = 'E_USER_NOTICE'; break;
            case E_STRICT: $severity = 'E_STRICT'; break;
            case E_RECOVERABLE_ERROR: $severity = 'E_RECOVERABLE_ERROR'; break;
            case E_DEPRECATED: $severity = 'E_DEPRECATED'; break;
            case E_USER_DEPRECATED: $severity = 'E_USER_DEPRECATED'; break;
            case E_ERROR: $severity = 'E_ERR'; break;
            case E_PARSE: $severity = 'E_PARSE'; break;
            case E_CORE_ERROR: $severity = 'E_CORE_ERROR'; break;
            case E_COMPILE_ERROR: $severity = 'E_COMPILE_ERROR'; break;
            case E_USER_ERROR: $severity = 'E_USER_ERROR'; break;
            default: $severity= 'E_UNKNOWN_ERROR_'.$errno; break;
        }
        $msg="{$severity}: {$errstr} in {$errfile} on line {$errline} -- SocketLog error handler";
        self::trace($msg,2,self::$css['error_handler']);
    }

    public static function fatalError()
    {
        // 保存日志记录
        if ($e = error_get_last())
        {
                self::error_handler($e['type'],$e['message'],$e['file'],$e['line']);
                self::sendLog();//此类终止不会调用类的 __destruct 方法,所以此处手动sendLog
        }
    }



    public static function getInstance()
    {
        if (self::$_instance === null) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    protected static function _log($type,$logs,$css='')
    {
        self::getInstance()->record($type,$logs,$css);
    }


    protected static function check()
    {
        $tabid=self::getClientArg('tabid');
         //是否记录日志的检查
        if(!$tabid && !self::getConfig('force_client_id'))
        {
            return false;
        }
        //用户认证
        $allow_client_ids=self::getConfig('allow_client_ids');
        if(!empty($allow_client_ids))
        {
            if (!$tabid && in_array(self::getConfig('force_client_id'), $allow_client_ids)) {
                return true;
            }

            $client_id=self::getClientArg('client_id');
            if(!in_array($client_id,$allow_client_ids))
            {
                return false;
            }
        }
        return true;
    }

    protected static function getClientArg($name)
    {
        static $args=array();

        $key = 'HTTP_USER_AGENT';

        if (isset($_SERVER['HTTP_SOCKETLOG'])) {
            $key = 'HTTP_SOCKETLOG';
        }

        if(!isset($_SERVER[$key]))
        {
            return null;
        }
        if(empty($args))
        {
            if(!preg_match('/SocketLog\((.*?)\)/',$_SERVER[$key],$match))
            {
                $args=array('tabid'=>null);
                return null;
            }
            parse_str($match[1],$args);
        }
        if(isset($args[$name]))
        {
            return $args[$name];
        }
        return null;
    }


    //设置配置
    public static function  setConfig($config)
    {
        $config=array_merge(self::$config,$config);
        self::$config=$config;
        if(self::check())
        {
            self::getInstance(); //强制初始化SocketLog实例
            if($config['optimize'])
            {
                self::$start_time=microtime(true);
                self::$start_memory=memory_get_usage();
            }

            if($config['error_handler'])
            {
                self::registerErrorHandler();
            }
        }
    }


    //获得配置
    public static function  getConfig($name)
    {
        if(isset(self::$config[$name]))
            return self::$config[$name];
        return null;
    }

    //记录日志
    public function record($type,$msg='',$css='')
    {
        if(!self::check())
        {
            return ;
        }

        self::$logs[]=array(
            'type'=>$type,
            'msg'=>$msg,
            'css'=>$css
        );
    }

    /**
     * @param null $host - $host of socket server
     * @param string $message - 发送的消息
     * @param string $address - 地址
     * @return bool
     */
    public static function send($host,$message='',$address='/')
    {
        $url='http://'.$host.':'.self::$port.$address;
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, true);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $message);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 10);
        $headers=array(
                 "Content-Type: application/json;charset=UTF-8"
        );
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);//设置header
        $txt = curl_exec($ch);
        return true;
    }

    public static function sendLog()
    {
        if(!self::check())
        {
            return ;
        }

        $time_str='';
        $memory_str='';
        if(self::$start_time)
        {
            $runtime=microtime(true)-self::$start_time;
            $reqs=number_format(1/$runtime,2);
            $time_str="[运行时间:{$runtime}s][吞吐率:{$reqs}req/s]";
        }
        if(self::$start_memory)
        {
            $memory_use=number_format(memory_get_usage()-self::$start_memory/1024,2);
            $memory_str="[内存消耗:{$memory_use}kb]";
        }

        if(isset($_SERVER['HTTP_HOST']))
        {
            $current_uri=$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
        }
        else
        {
            $current_uri="cmd:".implode(' ',$_SERVER['argv']);
        }
        array_unshift(self::$logs,array(
                'type'=>'group',
                'msg'=>$current_uri.$time_str.$memory_str,
                'css'=>self::$css['page']
        ));

        if(self::getConfig('show_included_files'))
        {
            self::$logs[]=array(
                    'type'=>'groupCollapsed',
                    'msg'=>'included_files',
                    'css'=>''
            );
            self::$logs[]=array(
                    'type'=>'log',
                    'msg'=>implode("\n",get_included_files()),
                    'css'=>''
            );
            self::$logs[]=array(
                    'type'=>'groupEnd',
                    'msg'=>'',
                    'css'=>'',
            );
        }

        self::$logs[]=array(
                'type'=>'groupEnd',
                'msg'=>'',
                'css'=>'',
        );

        $tabid=self::getClientArg('tabid');
        if(!$client_id=self::getClientArg('client_id'))
        {
            $client_id='';
        }
        if($force_client_id=self::getConfig('force_client_id'))
        {
            $client_id=$force_client_id;
        }
        $logs=array(
            'tabid'=>$tabid,
            'client_id'=>$client_id,
            'logs'=>self::$logs,
            'force_client_id'=>$force_client_id,
        );
        $msg=@json_encode($logs);
        $address='/'.$client_id; //将client_id作为地址, server端通过地址判断将日志发布给谁
        self::send(self::getConfig('host'),$msg,$address);

    }

    public function __destruct()
    {
        self::sendLog();
    }

}
配置好的SocketLog.class.php

 

转载于:https://www.cnblogs.com/yhdsir/p/4987195.html


http://www.niftyadmin.cn/n/4640338.html

相关文章

hdu1573(线性同余方程组)

套模板&#xff0c;因为要是正整数,所以处理一下x0的情况。 X问题 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 4444 Accepted Submission(s): 1439 Problem Description求在小于等于N的正整数中有多少个X满…

Redis3.0.5集群安装

为什么80%的码农都做不了架构师&#xff1f;>>> 首先&#xff0c;直接访问redis.io官网&#xff0c;下载redis.tar.gz&#xff0c;现在版本3.0.5&#xff0c;我下面已经在虚拟机启动了两个linux来部署redis。 1. 下载和解包 cd /usr/local/ wget http://download.r…

TensorFlow实战之Scikit Flow系列指导:Part 2

原文地址&#xff1a;这里 本部分我们将继续深入并且尝试构建多层全连接的神经网络&#xff0c;并且自定义网络模型并在此基础上尝试卷积网络。 Multi-layer fully connected neural network 当然&#xff0c;这里并没有太多关于其他的线性/Logistic拟合的框架。TensorFlow一个…

quad 和 plane 区别是什么?

Quad就是两个三角形组成四边形&#xff0c;Plane会有很多三角形&#xff0c;哦也 貌似Quad拖上去后看不见&#xff0c;很薄的感觉

Oracle使用杂记

2019独角兽企业重金招聘Python工程师标准>>> 1&#xff09;首先安装oracle网上应该有好多文档&#xff0c;这就不说了。安装过程经常忘记创建用户&#xff0c; 我们可以使用默认创建好的用户 system 来进行登录&#xff0c;然后在创建其他的用户。&#xff08;小菜我…

实现部分库函数

1.模拟实现strncat//与strcat无异&#xff0c;只是追加的块大小不一样&#xff0c;strncat只是向后追加n个字节的内容char *my_strncat(char * dst, const char *src,int count){char *p dst;while (*dst){dst;}while (count--) // 用数count控制循环的次数*dst *src;}…

修改 linux 默认启动级别 设置系统时间   定时关机

1、设置系统时间 为 2016 -1-1 11&#xff1a;11date -s "2016-1-1 11:11" 2、显示时间 为 2016 -1-1 11&#xff1a;11date "%F %H:%M" 3、设置一小时后自动关机 取消为 -cshutdown -h 60 -tsec &#xff1a; -t 后面加秒数…

关于什么是句柄(经典)

句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数&#xff0c;WINDOWS使用各种各样的句柄标识诸如应用程序实例&#xff0c;窗口&#xff0c;控制&#xff0c;位图&#xff0c;GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。 从上面的定义中的我们可以看到&a…