Browse Source

first commit

HonorLee 7 years ago
commit
8a992477b1

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+node_server/node_modules

BIN
Chrome-crx/src.crx


+ 28 - 0
Chrome-crx/src.pem

@@ -0,0 +1,28 @@
+-----BEGIN PRIVATE KEY-----
+MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCwm5V31wJly2Sb
+D+DUMHaBo9N9/KBxDdbqMGSkW36u8N83cX00zhEJ73ZV7347YcXGUu7V+oL+BcjF
+BzIi6EczAv0v+u2cDdSopxm0oXT+u4LiRI3av8aCUOLC3WhTI2dqFNRZTOXjX67F
+W99gHGdKG/jtiKNyJYwdq+crclZBTTuj7X+iWvxLQ0uLAoaCWR5fiGuRNqNC7zzf
+UjDe/xC/rWhcmscDztxG0J8Db5sH57RnLEw+0rIFBgmHgLiVDwrmB1x4rUhHvuXZ
+wKXE3xWr5rYPQBnt47zfQe09nMj5l5wdoQLuCG5JweSabCabujM/Ml5cuX43KCWy
+xYr1SjMLAgMBAAECggEAScnXm2iUMd/XOwpZT46oFOZUGRGSH2o+3z407o7j0UgG
+m22peISYjeQlNyaHQVxKe+ButayjSms0RU4KXpdaGDAphQB8gnUs4wJeNSA4d630
+s4EdG8aAtDYDaJOFYScrsCDf0CfW7TcvGHqYS9nSNh6V1PkAAVM6xbLrNTXiYAmo
+3wEk1qg6YD/lLgFrI1hsE2fbhKiN59DncsKZI55u01khZcMZHosyfB0sPBdbIq/S
+La/bLOa9oxYk8pFjp3BnVtDnlD7I3NdAl43ub2OBm1zeutLJU99KQ4bDTUPu2UXa
+6JJvYnLqZDRx3/W10Az4B9N+G2sT2OFlbxyZst47wQKBgQDhz1iI5HdwwPJX9yEi
+WYERvGiFtfZx7EqwrpkErZR9ofGhd3hP0ohKpoB9Chu3v5MjF1apeyAZEt60csid
+bCH4xS4g6QppGgR9NwHszm3QzhFFxyVfwkaKReWygCqdp2eg8E55RMOi+8kmGcRQ
+GWfBRy3PIgNscMrJRcZBDzCUWwKBgQDIODnBIqA9ZSjxNDHu7po84Xc6wtlAr7bl
+y9hOck3GY6W0sXKUfwoWrACy1mJZU0KNjt3WGmvzJg//FIw4BcD5AUPA+3KoK+A9
+rYw8pKzCECDGDd0FY0+USmftSnoAtvvnhWEfdvLP/MZ7aKtfwfbSe4wC7TbCQDq1
+vkwwCzxbEQKBgQDJMe7nofEOJMyJNidurKMEw4O5x2R7Ixd1j0vF0EdjHRznSkSH
+ksVfBjWrs4r40JfwB0ZvIcZ6sMZ/r1oycXtfZYjxR9K/zK+9RXrQnSlZh5H6QzN4
+u+gQIbFEt0/BQrxhuFujT3Kk0ITsDr9MwyYgHySgzuSQBXuZlDLOGxOkywKBgGgZ
+69WChmRFo6r943SCtMkwxYhU5RagBe2nNjlbbxrWlsLDfHq/LuSo29ggZZRiGPl3
+LdpzdGtBABI1gc5jF3mgcbT2SCAuZ/JJuN+TE4v3TMMNVDzH7QmCQlT7Y0HZ4lH3
+ZI8yjn8bw6tIucoZFJdNy3d+FPmc4am7Xuuf++qxAoGADeF6srglS7PqDRLgtJlN
+MvV/wY2c0ZpH0znyrXTbkH38o1VB2eQea03NLqHbKh7g1xcuBSWhJByS6ikT6pNN
++W4MHLkkl3nUznHMd0kWIWBdLX7vEooz6ypSqZqKpJOiRWzYXV6SFvuBl6bo0RjD
+midn+TFbERo+u6bYnvP4P2A=
+-----END PRIVATE KEY-----

BIN
Chrome-crx/src/128.png


BIN
Chrome-crx/src/16.png


+ 79 - 0
Chrome-crx/src/app.js

@@ -0,0 +1,79 @@
+var socket,keepalive;
+var opt = {debug:1,log:1,warning:1,error:1,maxLine:1000};
+// var scroll = 1;
+
+function connect(){
+    $('.host,.port').attr('disabled','true').addClass('disabled');
+    var host = $('.host').val(),port = $('.port').val();
+    if(!host) host = '127.0.0.1';
+    if(!port) port = 4002;
+    socket = io('http://'+host+':'+port);
+    socket.on('connect_error',function(){
+        alert('Socket connect error!');
+        disconnect();
+    });
+    socket.on('connect', function(){
+        keepalive = setInterval(function(){socket.emit('keepalive',true);},1000);
+        $('.connect button').text('Disconnect').addClass('disabled');
+    });
+    socket.on('push', function(data){
+        addBox(data);
+    });
+    socket.on('disconnect', function(){
+        disconnect();
+    });
+}
+
+function disconnect(){
+    if(socket){
+        socket.destroy();
+        socket = null;
+    }
+    if(keepalive){
+        clearInterval(keepalive);
+        keepalive = null;
+    }
+    $('.host,.port').removeAttr('disabled').removeClass('disabled');
+    $('.connect button').text('Connect').removeClass('disabled');
+}
+
+function addBox(data){
+    var levelClass,output=data.data,msg;
+    data.level=="0"?levelClass='LOG':data.level=="1"?levelClass='DEBUG':data.level=="2"?levelClass='WARNING':data.level=="3"?levelClass='ERROR':'';
+    if((levelClass=='LOG'&&opt.log==0)||(levelClass=='DEBUG'&&opt.debug==0)||(levelClass=='WARNING'&&opt.warning==0)||(levelClass=='ERROR'&&opt.error==0)) return;
+    msg = output.msg?output.msg:output.data;
+    var pid = parseInt(data.pid);
+        pid = pid.toString(36);
+    var filterPid = $('.filter .pid').val();
+    var dom = $('<div class="box '+levelClass+'" data-pid="'+pid+'"><div class="head"><span class="level">'+levelClass+'</span><h2>'+output.backtrace.file+'</h2><span class="line">'+output.backtrace.line+' 行</span></div><div class="content">'+msg+'</div><div class="info">PID: '+pid+'<span>'+data._t+'</span></div></div>');
+    if($('.list .box').length>=opt.maxLine){$('.list .box:eq(0)').remove();}
+    if(filterPid!='' && filterPid!=pid) dom.hide();
+    $('.list').append(dom);
+}
+$(function(){
+    $('.connect button').click(function(){
+        if(socket){
+            disconnect();
+        }else{
+            connect();
+        }
+    });
+    $('.filter span').click(function(){
+        var type = $(this).attr('data-type');
+        if(opt[type]){
+            opt[type]=0;
+            $(this).addClass('disabled');
+        }else{
+            opt[type]=1;
+            $(this).removeClass('disabled');
+        }
+    });
+    $('.filter button').click(function(){
+        var pid = $('.filter .pid').val();
+        if(pid==''){
+            $('.list .box').show();
+        }else{
+            $('.list .box[data-pid!='+pid+']').hide();
+        }
+    });
+});

+ 9 - 0
Chrome-crx/src/background.js

@@ -0,0 +1,9 @@
+chrome.app.runtime.onLaunched.addListener(function() {
+    chrome.app.window.create('index.html', {
+        'bounds': {
+            'width': 400,
+            'height': 800
+        },
+        'minWidth': 400
+    });
+});

File diff suppressed because it is too large
+ 1 - 0
Chrome-crx/src/css.css


+ 99 - 0
Chrome-crx/src/css.less

@@ -0,0 +1,99 @@
+*,html,body {
+    margin: 0;
+    padding: 0;
+    font: 13px/2em Avenir,Arial,sans-serif;
+    box-sizing:border-box;
+    // background: #ffffff;
+}
+html,body{width:100%;height:100%;min-width:400px;}
+body{padding-top:87px}
+a {
+    text-decoration: none;
+    outline: none;
+    cursor: pointer;
+}
+
+table {
+    border-collapse: collapse;
+}
+
+ol, ul {
+    list-style: none;
+}
+
+li {
+    list-style-type: none;
+}
+
+.clear {
+    overflow: auto;
+    overflow-y: hidden;
+    zoom: 1;
+}
+
+.toolbar{
+    background:#00c3ef;height:82px;position:fixed;top:0;left:0;right:0;box-shadow:0 0px 10px #666;z-index:10;
+    .connect{
+        background:darken(#00c3ef,10%);padding:8px 15px;
+        input{
+            border:none;text-align:center;float:left;display:inline;width:35%;
+            &.disabled{background:darken(#00c3ef,20%)}
+        }
+        button{
+            width:30%;float:left;border:none;background:#4ab911;color:#fff;cursor:pointer;
+            &.disabled{background:#b91111}
+        }
+    }
+    .filter{
+        padding:8px 15px;
+        span{
+            display:inline-block;background:#50b31d;float:left;cursor:pointer;text-align:right;font-size:10px;color:#fff;position:relative;padding:0 8px 0 20px;margin-right:2px;
+            &:before{content:"●";text-align:left;position:absolute;left:8px;top:0px;}
+            &.disabled{
+                background:#b91111;
+                &:before{content:"○"}
+            }
+        }
+        input{height:24px;border:none;text-align:center;float:right;display:inline;font-size:12px;width:65px;}
+        button{height:24px;border:none;float:right;display:inline;font-size:12px;width:30px;background:darken(#00c3ef,10%);color:#fff}
+    }
+}
+.box{
+    border-top:1px #eee solid;
+    &:last-child{border-bottom:1px #eee solid;}
+    .head{
+        height:26px;position:relative;
+        span.line{position:absolute;right:15px;top:0;line-height:26px;}
+        span.level{position:absolute;left:15px;top:5px;line-height:16px;display:block;width:80px;height:16px;border-radius:20px;font-size:12px;text-align:center;background:#eee}
+        h2{height:26px;line-height:26px;padding:0 60px 0 100px;overflow:hidden;text-align:right;word-break: break-all;}
+    }
+    .content{padding:5px 20px;line-height:24px;word-break: break-all;font-size:14px}
+    .info{
+        line-height:18px;font-size:10px;position:relative;padding:5px 0 5px 15px;background:#eee;
+        span{position:absolute;right:15px;top:5px;line-height:18px;font-size:10px;}
+    }
+    &.LOG{
+        background:#009434;color:#fff;
+        .head{background:darken(#009434,5%)}
+        .info{background:darken(#009434,2%)}
+        span.level{background:darken(#009434,10%)}
+    }
+    &.DEBUG{
+        background:#3f83e8;color:#fff;
+        .head{background:darken(#3f83e8,5%)}
+        .info{background:darken(#3f83e8,2%)}
+        span.level{background:darken(#3f83e8,10%)}
+    }
+    &.WARNING{
+        background:#f7bf21;color:#fff;
+        .head{background:darken(#f7bf21,5%)}
+        .info{background:darken(#f7bf21,2%)}
+        span.level{background:darken(#f7bf21,10%)}
+    }
+    &.ERROR{
+        background:#ca004a;color:#fff;
+        .head{background:darken(#ca004a,5%)}
+        .info{background:darken(#ca004a,2%)}
+        span.level{background:darken(#ca004a,10%)}
+    }
+}

+ 29 - 0
Chrome-crx/src/index.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Document</title>
+    <link rel="stylesheet" href="css.css" />
+    <script src="socket.io.js" type="text/javascript"></script>
+    <script src="jquery.min.js" type="text/javascript"></script>
+</head>
+<body>
+    <div class="toolbar">
+        <div class="connect clear">
+            <input type="text" class="host" placeholder="127.0.0.1" />
+            <input type="text" class="host" placeholder="4002" />
+            <button>Connect</button>
+        </div>
+        <div class="filter clear">
+            <span class="LOG" data-type="log">LOG</span>
+            <span class="DEBUG" data-type="debug">DEBUG</span>
+            <span class="WARNING" data-type="warning">WARN</span>
+            <span class="ERROR" data-type="error">ERROR</span>
+            <button>Filter</button>
+            <input type="text" class="pid" placeholder="PID" />
+        </div>
+    </div>
+    <div class="list"></div>
+<script src="app.js" type="text/javascript"></script>
+</body>
+</html>

File diff suppressed because it is too large
+ 5 - 0
Chrome-crx/src/jquery.min.js


+ 12 - 0
Chrome-crx/src/manifest.json

@@ -0,0 +1,12 @@
+{
+    "name": "PHP Runtime Debug",
+    "description": "PHP运行过程调试工具客户端。",
+    "version": "0.1",
+    "manifest_version": 2,
+    "app": {
+        "background": {
+            "scripts": ["background.js"]
+        }
+    },
+    "icons": { "16": "16.png", "128": "128.png" }
+}

File diff suppressed because it is too large
+ 7248 - 0
Chrome-crx/src/socket.io.js


+ 72 - 0
Library/rtdebug.php

@@ -0,0 +1,72 @@
+<?php
+class RTDEBUG {
+    //Is debug on
+    private static $is_debug = false;
+    //
+    private static $fo       = null;
+    private static $pid      = -1;
+    private static $host     = '';
+    private static $uri      = '';
+    private static $port     = '';
+
+    //Log Type
+    const LEVEL_LOG     = 0;
+    const LEVEL_DEBUG   = 1;
+    const LEVEL_WARNING = 2;
+    const LEVEL_ERROR   = 3;
+    /**
+     * Init stream socket
+     * @param socketURL
+     * @param port
+     */
+    public static function init($host='',$uri='',$port=80){
+        if($host=='') return;
+        $fo = @fsockopen($host,$port,$errno,$errstr,30);
+        if(!$fo) return;
+        @stream_set_blocking($fp, 0);
+        self::$fo = $fo;
+        self::$host = $host;
+        self::$port = $port;
+        self::$uri = $uri;
+        self::$pid = time().rand(100000, 999999);
+        self::$is_debug = true;
+    }
+
+    /**
+     * @param msg require!!!
+     */
+    public static function addLog($msg,$level=0){
+        // print_r();
+        if(!self::$is_debug || !$msg) return false;
+        //Add last calling func. info
+        $_backtrace = debug_backtrace();
+        $data = '';
+        switch(gettype($msg)){
+            case 'array':
+            case 'object':
+                $data = array('data'=>$msg);
+                break;
+            default:
+                $data = array('msg'=>$msg);
+        }
+        $data['backtrace'] = array('file'=>str_replace($_SERVER['DOCUMENT_ROOT'], '', $_backtrace[0]['file']),'line'=>$_backtrace[0]['line']);
+        self::sendLog($data,$level);
+        
+    }
+
+    private static function sendLog($data,$level){
+        if(!self::$is_debug || !$data || $data=='' || $level<0) return false;
+        $data = urlencode(json_encode($data));
+        $url = self::$uri.'?data='.$data.'&level='.$level.'&pid='.self::$pid.'&_t='.time().round(microtime()*1000,0);
+        $http = array(
+            'GET '.$url.' HTTP/1.1',
+            'Host: '.self::$host.':'.self::$port,
+            'Connection: close',
+            'User-Agent: RTDEBUG/1.0 RTDEBUG'
+        );
+
+        $request = join("\n",$http)."\n\n";
+        fputs(self::$fo,$request);
+        // fclose(self::$fo);
+    }
+}

+ 0 - 0
README.md


+ 3 - 0
node_server/TODO

@@ -0,0 +1,3 @@
+TODO:
+1.本地日志记录功能
+2.配色不要太瞎眼

+ 28 - 0
node_server/main.js

@@ -0,0 +1,28 @@
+'use strict'
+// global.ROOTPATH  = __dirname;
+let URL          = require('url');
+let DateFormat   = require('date-format');
+let server       = require('http').createServer(serverHandler);
+let socketServer = require('http').createServer();
+let socketIO     = require('socket.io')(socketServer);
+let socketLib    = [];
+
+socketIO.on('connection', function(socket){
+    socket.join('pushLib');
+    socket.on('keepalive', function(data){});
+    socket.on('disconnect', function(){
+        socket.leave('pushLib');
+    });
+});
+
+server.listen(4001);
+socketIO.listen(4002);
+
+function serverHandler(req,res){
+    let URLParse = URL.parse(req.url,true);
+    let query    = URLParse.query;
+    if(query.data) query.data = JSON.parse(unescape(query.data));
+    if(query.data.data) query.data.data = JSON.stringify(query.data.data);
+    if(query._t) query._t = DateFormat('yyyy/MM/dd hh:mm:ss.SSS',new Date(parseInt(query._t)));
+    socketIO.to('pushLib').emit('push',query);
+}

+ 22 - 0
node_server/package.json

@@ -0,0 +1,22 @@
+{
+  "name": "PHP-Runtime-Debug",
+  "version": "0.1.0",
+  "description": "PHP runtime debug tool",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "dependencies": {
+    "date-format": "0.0.2",
+    "fs-extra": "^0.30.0",
+    "socket.io": "^1.4.8",
+    "tracer": "^0.8.3"
+  },
+  "engines": {
+    "node": ">=0.12.5"
+  },
+  "repository": {
+    "private": true
+  },
+  "author": "HonorLee",
+  "license": "ISC"
+}

+ 39 - 0
test.php

@@ -0,0 +1,39 @@
+<?php
+require_once('./Library/rtdebug.php');
+define('DEBUG',true);
+if(DEBUG) RTDEBUG::init('127.0.0.1','/postlog',4001);
+$abc = array (
+    'd0' => 1,
+    'abc' => 1,
+    'sadf' => 1,
+    'ff' => 1,
+    'sdf' => 1,
+    'zxc' => 1,
+    'dfgh' => 1,
+    'gjh' => 1,
+    '52d678' => 1,
+    'a0' => 1,
+    'q0' => 1,
+    'w0' => 1,
+    'e0' => 1,
+    'r0' => 1,
+    't0' => 1,
+    'y0' => 1,
+    'n0' => 1,
+    'u0' => 1,
+    'i1' => 2
+);
+function test1(){
+    global $abc;
+    RTDEBUG::addLog($abc,RTDEBUG::LEVEL_LOG);
+}
+
+function test2(){
+    global $abc;
+    RTDEBUG::addLog('test!!!!!!',RTDEBUG::LEVEL_DEBUG);
+    RTDEBUG::addLog('test!!!!!!',RTDEBUG::LEVEL_WARNING);
+    RTDEBUG::addLog('test!!!!!!',RTDEBUG::LEVEL_ERROR);
+}
+
+test1();
+test2();