2011-10-21 66 views
3

情況如下:我們有一堆連續不斷的Python腳本,最終在mysql中寫入數據,我們需要一個日誌來分析錯誤率和腳本性能。針對Python和PHP的異步日誌記錄策略

我們也有php前端與mysql數據交互,我們還需要記錄用戶操作,以便我們可以分析他們的行爲,並計算一些評分函數。 所以我們認爲每個案例都有一個mysql表格表(一個用於「python腳本」日誌,一個用於「用戶操作」日誌)。

理想情況下,我們會以性能和低延遲的原因異步寫入這些日誌表。有沒有辦法在Python(我們使用django ORM)和PHP(我們使用的是Yii Framework)中這樣做?

有沒有更好的方法來解決這個問題?

更新: 用戶的動作,(網頁UI),我們現在正在考慮通過簡單的Apache配置加載Apache日誌與相關的會話信息的MySQL自動

回答

2

有(據我所知)只有兩種方式在PHP中做任何事情,同步:

  • 叉進程(需要pcntl_fork
  • exec()的過程,並通過(假設* nix中)追加釋放到命令字符串的末尾。

這兩種方法產生一個新的進程被創建,雖然只是暫時的,那麼這是否會承受任何的性能提升是值得商榷的,高度依賴於您的服務器環境 - 我懷疑這會讓事情變得更糟,而不是更好。如果你的數據庫負載很重(因此導致你的速度變慢),你可能會得到一個更快的結果,將日誌消息轉儲到文件中,並且有一個守護進程腳本抓取事物進入數據庫 - 但是,這是否有幫助是有爭議的。

Python supports multi-threading這使生活變得更容易。

+0

通過一個獨立的HTTP服務器進行日誌記錄? – jaz

+3

@jaz - 我期望追加到日誌文件比發送HTTP請求更快。 –

2

您可以打開一個原始的Unix或網絡套接字到一個日誌記錄服務,該服務緩存消息並將它們異步寫入磁盤或數據庫。如果您的PHP和Python進程長時間運行並且每次執行都會生成許多消息,那麼保持開放套接字的性能會比同時執行單獨的HTTP /數據庫請求的性能更高。

您必須測量它與附加到文件(打開一次,然後在運行時鎖定,查找,寫入和解鎖以及在結束時關閉時)以查看哪個更快。

+0

+1 - 我忘記了非阻塞套接字,大概這也適用於非阻塞文件流(至少在PHP中,Py並不是我的專長)。 – DaveRandom