讓程式設計師不再苦逼的神器(下)

發表於2019-05-11
乘風破浪,啟航未來!

SocketLog
作為程式設計師,除了新功能開發之外,最常見的一個工作就是查錯,尤其是遠端使用者的查錯,還是一個很痛苦的過程。當前又加上了微信開發,API 開發等操作。對於微信內、API 由遠端使用者所呼叫的時候,情況多變,查錯也更加地麻煩。這個時候,我們的第三個神器登場了。那就是 SocketLog。
SocketLog 是國內知名 PHP 開發者羅飛的作品,羅飛是 ThinkPHP 的核心開發者,也是優才學院全棧工程師主力講師。現任三生社群 CTO。SocketLog 的 github 地址為:https://github.com/luofei614/SocketLog ,在專案的主頁上,詳細地介紹了用法和所用的技術。這裡簡單地彙總講解一下。
SocketLog 的使用,主要要分成三個步驟,第一步是安裝 Chrome 外掛。可以從 github 下載的安裝包中去安裝,或者可以從 Chrome 應用商店下載。
第二步是需要啟動 Socket 服務,Socket 服務是 WebSocket 協議的,早期版本是 PHP 編寫的伺服器,新的版本已經使用 Node.js 來實現了。啟動方法很簡單,進入解壓後的目錄。
執行 node server/index.js 即可。
安裝好外掛之後,就在 Chrome 上看到如下圖示。灰色表示沒有連線上。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/309049395.png[/img]


同時啟動了伺服器,做好設定,就會看到圖示變成藍色了。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/-70979525.png[/img]


需要注意的是,儘管我們這裡監聽地址配置成了本地地址,其實也可以配置遠端地址。不過遠端地址的話記得開啟伺服器上的防火牆,因為一般1229埠在防火牆中是關閉的。
SocketLog 的原理,是在伺服器端,往 WebSocket 伺服器上寫資料,作為客戶端的 Chrome 外掛,即能收到資料。所以不管是遠端 API 呼叫,還是網頁訪問,只要在程式中往這個 WebSocket 伺服器寫了資料,只要監聽了這個 Websocket 服務的客戶端都能收到相應的除錯日誌。
第三步是埋程式碼。使用方法也很簡單。比如我們在上面的 ThinkPHP 的 index.php 加入兩行程式碼。會看到如下輸出 。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/-8536999.png[/img]


然後我們在其他終端上也訪問一下這臺機器的這個頁面地址,看看是否能得到輸出呢?開始沒有任何輸出效果。因為預設情況下是不記錄普通使用者所呼叫的 slog 的。
在 slog 之上的語句加上這一行,就有了。
?
1
slog(array('force_client_id'=>'test'),'set_config');

Test 這個外掛的使用者,收到了所有的 slog 訊息。如下圖所示:

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/670057213.png[/img]


並且這種輸出 ,無論是別的使用者觸發,而還後臺服務程式,均可以輸出 。所以非常地方便,開發人員在自己的機器上就收集到了想要收集的使用者所觸發的除錯資訊。
然後為了體現對 SQL 語句的監聽。我們在 ThinkPHP/Library/Think/Db/Driver.class.php的第1139行加上 slog($str),然後再訪問頁面,就得到了如下輸出 ,可見實現了對 SQL 日誌的監控。
SocketLog 的功能看起來雖然簡單,但是卻非常有用、好用,是不可多得的開發神器。有關 SocketLog 的更多介紹和使用說明,建議現在就立刻下載,並且進入 github 主頁好好地研究吧!

OneAPM

從上面的使用來看,SocketLog 和 XHProf 都有兩個不足之處,一是需要埋程式碼,二是隻是基於單獨一個頁面會話的。而 OneAPM 相對來講,就更強大了,可以理解為雲端 SaaS 版的 XHProf 和更強大的 SocketLog。不過有著更為強大的優勢。比如:
① OneAPM 的 PHP 探針,安裝完成之後,並不需要在程式碼中埋入任何程式碼。
② 在資料收集的過程中,不需要開發和運維的參與,探針全自動收集,並提交到遠端伺服器。
③ 由於資料累積,所以支援歷史報表,以及比 XHProf 和 SocketLog 更豐富的功能。
④ PHP 只是 OneAPM 所支援的一種語言,它可以支援多種語言,HTML5、iOS、Android、Java、.NET、python、Node.js、PHP、ruby等。
OneAPM 的安裝過程也比較簡單,不過由於是 SaaS 服務,所以得上官網註冊一個賬號。登入了之後,在應用程式裡,點選新增,再選中 PHP,就進入了安裝探針的說明。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/-695290341.png[/img]


分為如下幾步:
1. 獲取授權編號
OneAPM 授權憑證,用於配置和身份識別。
2. 下載 OneAPM PHP agent 安裝程式
3. 解壓 OneAPM PHP Agent
?
1
tar -xzf OneAPM_php_Agent_2.3.11.tar.gz

4. 安裝 OneAPM PHP Agent
定位路徑至您的安裝包所在資料夾
?
1
cd oneapm-php5-linux-install-script

執行安裝命令
?
1
sudo ./oneapm-install install

5. 輸入 License Key
請點選步驟1中的「生成授權編號按鈕」成功安裝,介面如下

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/1820469177.png[/img]



若出現以下資訊,則代表安裝成功。
?
1
OneAPM is now installed on your system. Congratulations!

當頁面出現以下提示時,啟動 Daemon
?
1
sudo /usr/bin/oneapm-daemon

?
1
<span style="font-family: Microsoft YaHei; font-size: 16px;">執行以下指令來啟動 Daemon</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">重啟 Apache 或你使用的 web 排程程式 「如 php-fpm 」</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">6. 靜候5分鐘,開啟 OneAPM 之旅</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">靜候5分鐘,等待應用程式向 OneAPM 傳送應用程式效能資料,即可開始使用 OneAPM 應用效能管理。</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">OneAPM 收集的資料很豐富。將收集的響應時間資料,分為四個大塊:</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">① Web 事務,就是頁面業務邏輯本身</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">② 資料庫,資料庫的連線和資料讀取</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">③ 錯誤統計,對所有型別的錯誤做了歸類統計</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">④ 外部服務,即外部 API 等的裝置</span> <span style="font-family: Microsoft YaHei; font-size: 16px;">以筆者的站點為例,12小時的資料如下圖:</span>

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/794389974.png[/img]



從上面這個圖,我們看到響應時間,慢的達到了600 ms 以上,那是什麼導致的呢?我們可以分別檢視:

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/987880064.png[/img]


可見 Web 事務比較穩定,可以比較清楚地看到平均的響應時間在 50ms-75ms之間。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/-1967200312.png[/img]



資料庫響應時間也很短,在幾 ms 這個級別。而外部服務就明顯在幾百 ms 這個級別,還有的高達 600 ms 。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/-1247513942.png[/img]


不說別的,就通過這簡單的報表,從目前看,就可以定位到,想要做優化,從外部服務的響應時間上下手優化,帶來的效果是最大的。
下面我們再來看看三個細化一層的報表 ,在 Web 事務統計中,儘管平均數很低,但是也列出了響應時間最長的5個請求。如下:

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/507483638.png[/img]


從上面的資料可以看出,響應時間最長的幾個,主要突出在 bind.php,這個是負責 QQ 登入的請求,需要向騰訊請求資料。
而在資料庫一欄中,可以看到最慢的5個表格的情況。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/-127776944.png[/img]



在外部的服務中,果不出所料,是對微博、微信、QQ 登入、七牛上傳、支付寶通知等外部服務,所佔時間最長。如下圖所示。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/-2101781418.png[/img]



這只是普通的統計報表,對於具體的某一個慢的頁面,更有詳細的呼叫分析。
比如上面的 bind.php ,果真最慢的是從網路上獲取資料。也就是說,第三方登入時,從第三方網站取資料花了絕大部分時間。 去檢視詳情,OneAPM 稱為慢事務追蹤,拉到頁面的最底部就能看到。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/2104252212.png[/img]

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/1990071095.png[/img]



在後臺報表中,我們同樣也能看到是哪些 SQL 語句慢。比如如下是 bind.php 中慢的 SQL 語句。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/680023793.png[/img]



更為重要的是,還有所有錯誤資訊的收集,也一目瞭然。

[img=PHP,程式猿,程式設計]https://jf-bucket-public.oss-cn-qingdao.aliyuncs.com/jfperiodical/attached/image/20150702/-1398440159.png[/img]


所以無論從功能之強大,還是易用之方便,OneAPM 不愧是商業化的 SaaS 服務,比 XHProf 勝去了不少。在筆者的專案中,已經大量使用。並取得了好的效果。
以上四個專案,讓我們對自己所寫的程式碼,更加成竹在胸,無論是執行過程還是調優著手了都有了充分的把握。特意對比,彙總整理的這四大神器,希望它們能改善每一位 PHP 開發者的生活,讓我們的 PHP 開發不再那麼地苦逼!
回覆

相關文章