SocketLog適合Ajax調試和API調試, 舉一個常見的場景,用SocketLog來作微信調試, 咱們在作微信API開發的時候,若是API有bug,微信只提示「改公衆帳號暫時沒法提供服務,請稍候再試」 ,咱們根本不知道API出來什麼問題。 有了SocketLog就不同了, 咱們能夠知道微信給API傳遞了哪些參數, 程序有錯誤咱們也能看見錯誤信息(下方有張圖片,可能加載慢,請耐心等待一下)php
node server/index.js
, 將會在本地起一個websocket服務 ,監聽端口是1229 。 若是想服務後臺運行: nohup node server/index.js > /dev/null &
在本身的程序中發送日誌:css
<?php include './php/SocketLog.class.php'; slog('hello world'); ?>
用slog函數發送日誌, 支持多種日誌類型:html
slog('msg','log'); //通常日誌 slog('msg','error'); //錯誤日誌 slog('msg','info'); //信息日誌 slog('msg','warn'); //警告日誌 slog('msg','trace');// 輸入日誌同時會打出調用棧 slog('msg','alert');//將日誌以alert方式彈出 slog('msg','log','color:red;font-size:20px;');//自定義日誌的樣式,第三個參數爲css樣式
經過上面例子能夠看出, slog函數支持三個參數:node
例如:咱們若是想將程序的報錯信息頁輸出到console,能夠配置mysql
<?php include './php/SocketLog.class.php'; slog(array( 'error_handler'=>true ),'set_config'); echo notice;//製造一個notice報錯 slog('這裏是輸出的通常日誌'); ?>
還支持其餘配置項git
<?php include './php/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'); ?>
[運行時間:0.081346035003662s][吞吐率:12.29req/s][內存消耗:346,910.45kb]
設置client_id後能實現如下功能:github
1,配置allow_client_ids 配置項,讓指定的瀏覽器才能得到日誌,這樣就能夠把調試代碼帶上線。 普通用戶訪問不會觸發調試,不會發送日誌。 開發人員訪問就能看的調試日誌, 這樣利於找線上bug。 Client_ID 建議設置爲姓名拼命加上隨機字符串,這樣若是有員工離職能夠將其對應的client_id從配置項allow_client_ids中移除。 client_id除了姓名拼音,加上隨機字符串的目的,以防別人根據你公司員工姓名猜想出client_id,獲取線上的調試日誌。web
設置allow_client_ids示例代碼:sql
slog(array( 'allow_client_ids'=>array('luofei_zfH5NbLn','easy_DJq0z80H') ),'set_config')
2, 設置force_client_id配置項,讓後臺腳本也能輸出日誌到chrome。 網站有可能用了隊列,一些業務邏輯經過後臺腳本處理, 若是後臺腳本須要調試,你也能夠將日誌打印到瀏覽器的console中, 固然後臺腳本不和瀏覽器接觸,不知道當前觸發程序的是哪一個瀏覽器,因此咱們須要強制將日誌打印到指定client_id的瀏覽器上面。 咱們在後臺腳本中使用SocketLog時設置force_client_id 配置項指定要強制輸出瀏覽器的client_id 便可。chrome
示例代碼:
<?php include './php/SocketLog.class.php'; slog(array( 'force_client_id'=>'luofei_zfH5NbLn' ),'set_config'); slog('test'); `
用slog函數打印sql語句是,第二個參數傳遞爲mysql或mysqli的對象便可。 示例代碼:
$link=mysql_connect( 'localhost:3306' , 'root' , '123456' , true ) ; mysql_select_db('kuaijianli',$link); $sql="SELECT * FROM `user`"; slog($sql,$link);
後面會以OneThink爲實例再對數據庫調試進行演示。
經過上面的方法,socketlog還能自動爲你檢測沒有where語句的sql操做,而後自動提示你。
網站調用了API ,如何將API程序的調試信息也打印到瀏覽器的console中? 前面咱們講了一個配置 force_client_id, 能將日誌強制記錄到指定的瀏覽器。 用這種方式也能夠將API的調試信息打印到console中,可是force_client_id 只能指定一個client_id, 若是咱們的開發環境是多人共用,這種方式就不方便了。 其實只要將瀏覽器傳遞給網站的User-Agent 再傳遞給API, API程序中不用配置force_client_id, 也能識別當前訪問程序的瀏覽器, 將日誌打印到當前訪問程序的瀏覽器, 咱們須要將SDK代碼稍微作一下修改。 調用API的SDK,通常是用curl寫的,增長下面代碼能夠將瀏覽器的User-Agent傳遞到API 。
$headers=array(); if(isset($_SERVER['HTTP_USER_AGENT'])) { $headers[]='User-Agent: '.$_SERVER['HTTP_USER_AGENT']; } if(isset($_SERVER['HTTP_SOCKETLOG'])) { $headers[]='Socketlog: '.$_SERVER['HTTP_SOCKETLOG']; } curl_setopt($ch,CURLOPT_HTTPHEADER,$headers);
進入chrome瀏覽器的「工具」-->「擴展程序」 , 點擊SocketLog的「選項」進行設置。
有了SocketLog,咱們能很方便的分析開源程序,下面以OneThink爲例, 你們能夠在http://www.topthink.com/topic/2228.html 下載最新的OneThink程序。 安裝好OneThink後,按下面步驟增長SocketLog程序。
編輯入口文件index.php, 再代碼的最前面加載SocketLog.class.php ,並設置SocketLog
<?php include './SocketLog.class.php'; slog(array( 'error_handler'=>true, 'optimize'=>true, 'show_included_files'=>true ),'set_config');
編輯ThinkPHP/Library/Think/Db/Driver.class.php 文件,在這個類中的execute 方法爲一個執行sql語句的方法,增長代碼:
slog($this->queryStr,$this->_linkID);
類中的query方法也是一個執行sql語句的地方, 一樣須要增長上面的代碼
而後瀏覽網站看看效果:
經過console的日誌,訪問每一頁咱們都知道程序幹了什麼,是一件很爽的事情。