通過SocketLog快速分析php程式

2022-05-04 17:00:11 字數 4397 閱讀 4572

**自

#使用方法

* 首先,請在chrome瀏覽器上安裝好外掛程式。

* 然後,啟用websocket服務, 在命令列中執行 `php php/socketlog.server.php` , 將會在本地起乙個websocket服務 ,監聽埠是1229 。 如果想服務後台執行: `nohup php php/socketlog.server.php > /dev/null &`

* 在自己的程式中傳送日誌:

<?php

include './php/socketlog.class.php';

slog('hello world');

?>

複製**

* 用slog函式傳送日誌, 支援多種日誌型別:

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函式支援三個引數:

* 第乙個引數是日誌內容,日誌內容不光能支援字串喲,大家如果傳遞陣列,物件等一樣可以列印到console中。

* 第二個引數是日誌型別,可選,如果沒有指定日誌型別預設型別為log, 第三個引數是自定樣式,在這裡寫上你自定義css樣式即可。

##配置

* 在載入socketlog.class.php檔案後,還可以對socketlog進行一些配置。

* 例如:我們如果想將程式的報錯資訊頁輸出到console,可以配置

<?php

include './php/socketlog.class.php';

slog(array(

'error_handler'=>true

),'set_config');

echo notice;//製造乙個notice報錯

slog('這裡是輸出的一般日誌');

?>

複製**

* 配置socketlog也是用slog函式, 第乙個引數傳遞配置項的陣列,第二個引數設定為set_config

* 還支援其他配置項

<?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');

?>

複製**

* 設定client_id後能實現以下功能:

* 1,配置allow_client_ids 配置項,讓指定的瀏覽器才能獲得日誌,這樣就可以把除錯**帶上線。 普通使用者訪問不會觸發除錯,不會傳送日誌。 開發人員訪問就能看的除錯日誌, 這樣利於找線上bug。 client_id 建議設定為姓名拼命加上隨機字串,這樣如果有員工離職可以將其對應的client_id從配置項allow_client_ids中移除。 client_id除了姓名拼音,加上隨機字串的目的,以防別人根據你公司員工姓名猜測出client_id,獲取線上的除錯日誌。

* 設定allow_client_ids示例**:

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 即可。

* 示例**:

<?php

include './php/socketlog.class.php';

slog(array(

'force_client_id'=>'luofei_zfh5nbln'

),'set_config');

slog('test');`

複製**

##對資料庫進行除錯

* socketlog還能對sql語句進行除錯,自動對sql語句進行explain分析,顯示出有效能問題的sql語句。 如下圖所示。 

* 圖中顯示出了三條sql語句 , 第一條sql語句字型較大,是因為它又效能問題, 在sql語句的後台已經標註using filesort。 我們還可以點選某個sql語句看到sql執行的呼叫棧,清楚的知道sql語句是如何被執行的,方便我們分析程式、方便做開源程式的二次開發。圖中第三條sql語句為被點開的狀態。

* 用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為例項再對資料庫除錯進行演示。

* 注意,有時候在資料比較少的情況下,mysql查詢不會使用索引,explain也會提示using filesort等效能問題, 其實這時候並不是真正有效能問題, 你需要自行進行判斷,或者增加更多的資料再測試。

##對api進行除錯

**呼叫了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 。 

複製**

<?php

include './socketlog.class.php';

slog(array(

'error_handler'=>true,

'optimize'=>true,

'show_included_files'=>true

),'set_config');

複製**

- 編輯thinkphp/library/think/db/driver/mysqli.class.php 檔案, 如果你用的資料庫驅動型別不是mysqli,而是mysql,那麼請開啟mysql.class.php, 找到執行sql語句的地方, 這個類中得execute 方法為乙個執行sql語句的方法,大約在119行處,增加**:

slog($this->querystr,$this->_linkid);

複製**

- 類中的query方法也是乙個執行sql語句的地方, 同樣需要增加上面的**, 大約在92行增加slog($this->querystr,$this->_linkid);

- 然後瀏覽**看看效果: 

快速通過CMMI評估

終於訪談結束了,最近的幾個月,進行了備受煎熬的cmmi 認證活動,起初對這個東西非常的陌生,也沒有很多的資料可供參考,經過幾個月的摸索,也掌握了 cmmi 認證的一些道道,其實現在說來倒是覺得cmmi 認證沒有想象的那麼複雜,但如果起初沒有足夠的經驗可供參考,那麼摸索的過程是很痛苦的,趁著現在頭腦還...

通過CodeIgniter快速開發Web應用(一)

基礎概覽 1 codeigniter 生成的 url 非常乾淨,而且對搜尋引擎友好。不同於標準的 查詢字串 方法,codeigniter 使用了基於段的方法 2 codeigniter 可擴充套件 系統可以非常簡單的通過你自己的類庫和輔助函式來擴充套件,也可以通過 類擴充套件或系統鉤子來實現 cod...

如何快速通過CMMI評估

終於訪談結束了,最近的幾個月,進行了備受煎熬的cmmi認證活動,起初對這個東西非常的陌生,也沒有很多的資料可供參考,經過幾個月的摸索,也掌握了 cmmi認證的一些道道,其實現在說來倒是覺得cmmi認證沒有想象的那麼複雜,但如果起初沒有足夠的經驗可供參考,那麼摸索的過程是很痛苦的,趁著現在頭腦還比較熱...