PHP 版古老 UNIX syslog 提供了簡單有效的調試工具php
簡介: 探索正在運行中的程序的一種老技術是在策略點上放置代碼,顯示變量當前值。可是如何完成此操做而不干擾程序的標準輸出呢?使用 PHP 的 syslog()
工具,能夠很是容易檢驗這些值。閱讀本文了解如何操做。html
本文的標籤: php_(hypertext_preprocessor), 調試程序員
發佈日期: 2007 年 10 月 16 日
級別: 中級
訪問狀況 558 次瀏覽
建議: 0 (添加評論) 數據庫
用計算機編程是一件單調乏味的事情,可是它也頗有趣。編程有趣的一面在於瞭解使用舊工具的新方法。最近,我簽了一份合同幫助解決基於 Linux®、Apache、MySQL 和 Linux、Apache、MySQL、PHP/Perl (LAMP) 的大型複雜內容管理系統 (CMS) 中的若干個錯誤。該 CMS 的架構是標準的 LAMP 模型,使用運行 Apache V2.0 的 Enterprise Red Hat Linux。驅動 Web 站點的代碼由分佈在 Apache 文檔根目錄的 30 個子目錄中的幾百個 PHP 源模塊組成。系統的 Apache 和 MySQL 部分不須要更改,由於個人全部糾錯操做都是在 PHP 工做區中進行的。apache
在研究了該 CMS 的工做原理一段時間以後,我漸漸開始欣賞該系統優雅的設計而且意識到在大多數成熟的編程環境中,此係統只依賴於少許的可用 PHP 函數(在這裏想起了舊的 80/20 法則,其中 80% 的工做是用 20% 的可用函數來完成的)。本文將展現如何調試未知的複雜系統,以幫助您瞭解那些不多使用的函數,並提供如何使用 syslog()
函數的豐富功能來應用新知識的示例。瀏覽器
調試程序安全
雖然表面上 PHP 編程語言有成百上千個函數可用,可是在讀到與本文相似的文章以前,您可能從未使用過某些函數(或許大多數函數)。另外一種深刻學習語言的方法是調試別人已經用該語言編寫的程序。我老是對程序員用具備創造性的方法使用工具印象深入。服務器
調試像計算機編程同樣,一半是科學,一半是藝術。在不是由您建立的系統中跟蹤並不明顯的錯誤時,須要可以很快地定位這些錯誤在代碼中的位置。因爲要處理的代碼模塊有成百上千個,所以最佳起點是顯示找到錯誤的輸出位置,而後從該位置開始逆向查找來隔離問題。網絡
例如,若是知道輸出的計算值不正確,則必須設計一種方法來查看致使出現問題的中間值。經過重要的數據庫查詢獲得的錯誤數據能夠證實存在其餘問題。您必須可以查看生成(並由代碼提交給 MySQL 引擎)的 SQL 語句以查看問題是否是出在語句裏。
完成此操做的一項古老技術是插入能夠打印這些字符串和值的代碼。不幸的是,使用諸如 PHP 之類的工具或任何基於 Web 的應用程序,您不但願在這樣的系統固有輸出(即,被髮送給瀏覽器的 HTML 代碼)中摻入調試信息,尤爲是在要檢驗的系統是一臺生產服務器時。
您能夠建立自定義日誌記錄文件並向其中寫入日誌消息,可是爲何不使用已經提供給您的工具呢?請始終記住:不要把工具塵封 起來。您值得花一些時間查看語言建立者是否已經提供了一種庫例程或函數,能夠執行您一般須要的功能。實際上,只要您以爲某些內容很明顯應當是編程包的一部 分,那麼它極可能就包含在其中。
我意識到須要使用相似於 UNIX® 的 syslog 的工具。我想 PHP 頗有可能有 syslog 功能,所以在快速查看了 PHP 文檔後,我找到了它!PHP syslog()
函數是我多年來沒注意到的函數,直到我簽約來作這個項目。使用 syslog()
,我能夠搜索直至找到並消除生產系統中的大多數錯誤,除了須要幾分鐘時間執行各個函數以外,不會引入其餘反作用。
隨着知識的積累而且在專業領域中愈來愈有經驗,顯然能夠採用不一樣的方法來作事情,而且某種方法將最終成爲執行必要任務的首選方法。必須始終牢記的是您認爲很明顯的事情對其餘人來講並不必定是明顯的。對您來講很簡單的事情對於其餘人來講可能很是複雜。
使用諸如 syslog()
函數之類的工具能夠控制複雜度,並容許經過配置文件(例如 syslog.conf)來輕鬆地進行自定義。例如,能夠插入代碼來設定 SQL 語句的格式,將它記錄到 syslog()
中並將其傳遞給 MySQL 來執行。隨後,對 syslog.conf 文件稍微修改一下,把文本發送給另外一個日誌文件或者可能就發送給位桶(bit bucket)。幾個星期或幾個月以後,若是有必要再次查看發生的狀況,則再對 syslog.conf 文件進行簡單更改將還原該功能。
syslog 在 UNIX 世界中有着豐富多彩的歷史。syslog 最初是做爲 Sendmail 項目的一部分開發的,實踐證實它很是有用,所以許多其餘工具引入了 syslog 功能,證實了最簡單的想法有時最有效。
簡要地說,syslog 容許應用程序將帶有標記的消息寫入一組公共系統日誌文件中,這些日誌文件能夠駐留在程序員和網絡管理員可以輕鬆訪問的位置。這意味着,例如,您能夠配置 Web 服務器上的 syslog 以記錄另外一臺服務器上的系統消息 —— 這臺服務器多是在安全防火牆後面幾層而且更易於讓前述管理員訪問。可是按照個人目的,我只接受將文件寫入 /var/log 目錄的默認行爲。
syslog 機制是在啓動時啓動的,而且其初始行爲是由 syslog.conf 文件中的規則定義的。這些規則使您能夠很好地調整使用該機制記錄的內容 —— 在一臺高容量並且工做繁重的服務器上使用 syslog 機制能夠轉換爲可改變大小的日誌文件。
每條規則都包含兩個字段:selector 和 action。基本上,selector 字段選擇要記錄的工具(例如,kern、user、mail、lpr)和工具擁有的優先級。優先級字段包含一個關鍵字,例如 debug、info、notice 或者 warning。而規則的 action 字段用於定義對匹配 selector 字段的那類消息執行的操做。規則能夠指定記錄消息的文件,將記錄消息發送給哪臺計算機,將消息發送給什麼用戶(以控制檯消息的形式)等。
研究與 syslog 工具相關的信息和手冊頁以瞭解如何根據須要配置系統。在個人例子中,我須要知道在生產 CMS 系統每次運行時各個 PHP 變量的值是什麼。我還須要知道某些模塊什麼時候啓動及什麼時候中止以及各個中間變量值。在說明須要記錄哪些信息的細節以前,讓咱們先來設置日誌的基本信息。
使用您最喜歡用的編輯器,建立清單 1 中所示的文件,將其命名爲 test.php 並把它放在 Apache 文檔根目錄中(在個人系統中,它是 /var/www)。
<html> <head> <title>PHP Test Page</title> </head> <body> <?php syslog(LOG_NOTICE, "{$_SERVER['REMOTE_ADDR']}: test.php - PHP Index page accessed."); echo '<p>PHP Test Page</p>'; ?> </body> </html> |
您一樣應當安裝並配置了 PHP。若是沒有,請查看 參考資料 以得到介紹如何安裝和配置的連接。若是一切配置正確,那麼當您訪問 URL 爲 http://localhost/test.php 的頁面時應當會在瀏覽器中看到如下文本:
PHP Test Page |
接下來,打開一個 X 終端窗口並鍵入如下命令來查看記錄到 /var/log/messages 文件中的內容:
tail /var/log/messages |
若是一切運行正常,您應當會在接近清單末尾的位置看到下面一行:
Jul 23 14:43:42 localhost apache2: 127.0.0.1: test.php - PHP Index page accessed. |
若是您看到了,那很好。您如今已經準備好開始詳細調試所使用的複雜系統。
我發現了一個優秀實踐:對全部 PHP/MySQL 調用使用 syslog()
,這樣每次都與 Web 站點交互,能夠看到實時生成了哪些 SQL 查詢以構建返回給您的頁面。一種簡單的實現方法是打開另外一個 X 終端窗口並結合使用 tail
命令與 -f
選項來 「實時」 查看消息日誌:
tail -f /var/log/messages |
如今您已經檢驗了日誌能夠正常工做而且能夠看到記錄機制的結果,下面的提示介紹瞭如何使用這些工具儘量快速地縮短學習陌生系統的過程。
必須知道哪些模塊執行了超出其文檔所述範圍的操做。因爲這個緣由,我喜歡記錄標記模塊開頭和結尾的日誌消息。這樣,您能夠對 Web 站點的頁面進行操做,同時監視運行 tail -f /var/log/messages
命令的另外一個 X 終端窗口。這樣能夠看到哪些模塊在執行而且瀏覽器每次請求新頁面時的順序。
我還須要記錄在 PHP 代碼運行期間被調用的各個程序之間的邊界。例如,查詢數據庫時調用 MySQL,或者修改數據格式時調用外部程序(例如,Extensible Stylesheet Language Transformation(XSLT)引擎)。系統地把這些檢查點插入每一個 PHP 代碼模塊中,這種實踐將幫助您熟悉模塊的名稱和位置。當瀏覽各個頁面時代碼把您在另外一個 X 終端中看到的消息發送給您時,您將得到推進和加強系統知識的重要反饋。
syslog 工具是調試由其餘人編寫的應用程序的強大工具。它容許您查看哪些模塊正被執行,哪些 SQL 語句正在執行,以及在您瀏覽 Web 站點時哪些變量值發生更改。這有助於查找可能會發生問題的模塊。
學習
syslog()
函數的更多信息。得到產品和技術
討論
Bill Zimmerly 是一名知識工程師和專長於不一樣版本 UNIX® 和 Microsoft® Windows® 軟件的底層系統程序員,同時他也是一名崇尚邏輯至上的自由思想者。他熱衷於建立新技術並撰寫相關的文章。他住在 Missouri 的 Hillsboro 郊外,那裏空氣新鮮、景色怡人,處處都有上等的葡萄酒廠。