每天抽一點時間來看看 PHP 源碼方面的書,說實話,無法在調試器下觀察 PHP 運行狀態的上下文實在是一件痛苦的事情。不過還好不是一無所獲,雖然內容比較多,但是掌握方法挨著看下去還是可以看一些代碼的。而且本身 PHP 源碼講解就有書,所以學習起來還是較為方便的。想要調試源碼,我覺得我最好應該找一個 ...
每天抽一點時間來看看 PHP 源碼方面的書,說實話,無法在調試器下觀察 PHP 運行狀態的上下文實在是一件痛苦的事情。不過還好不是一無所獲,雖然內容比較多,但是掌握方法挨著看下去還是可以看一些代碼的。而且本身 PHP 源碼講解就有書,所以學習起來還是較為方便的。想要調試源碼,我覺得我最好應該找一個前一天充分休息並且是陽光明媚的早上來學習關於調試 PHP 源碼的知識,那樣可能效率會高一些,但是這樣的機會好像又不多。 以前學習逆向分析的時候需要看反彙編代碼,當時也看得非常的暈,後來看書學習時書中也給出了閱讀反彙編的經驗。首先把指令進行分類,比如函數調用的指令,流程式控制制的指令和數據處理的指令等。然後把要進行逆向分析的部分按照指令分類進行標註,閱讀的反彙編的時候,遇到函數調用的部分基本比較明顯,就是堆棧操作、函數調用等,遇到流程式控制制的時候把這些反彙編直接根據特征對應到 if、for、while 等相應的控制結構中,而遇到數據處理的部分則需要一行一行的閱讀。 其實對應到閱讀 PHP 的源碼也是類似的吧。 說說我學習 PHP 源碼的方法吧。雖然有講解 PHP 源碼方面的書,但是書中的內容在做一些基本的介紹後就開始講源碼了。而 PHP 的底層源碼中有非常多的數據結構,而且是 struct 套著 struct。這就導致一個問題,如果底層的數據結構的邏輯整理不清楚,那麼在看到代碼操作這些數據結構的時候,必然也是暈的。因此,我看書的時候,我會把相關的數據結構按照類似 UML 圖的方式整理一下,其實就是畫幾個圖,標記一下所遇到的數據結構,標記數據結構時我會把結構體的名稱和幾個關鍵的欄位標註好,並且把數據結構之間的關聯關係整理出來,這樣就會把所涉及的數據結構及數據關係搞明白了,在看代碼的時候,把自己整理的數據結構打開對照著看,就不是那麼暈了。當代碼操作具體數據結構中的欄位時,再把具體的欄位補充到對應的數據結構中,這樣不但 PHP 源碼底層的處理邏輯瞭解了,而且對於底層的數據結構也就有了清晰和全面的掌握了。 這就是我的方法吧,雖然不複雜但是還是比較有用的。畢竟笨人的辦法就是這麼的原始和簡單!