2017-07-15 58 views
0

我使用PHP開發網站,具體使用YII 2 framewor k。網絡服務器使用的是Nginx,PHP engine是php-fpm。問題是我想跟蹤哪個用戶訪問哪個webpage URL地址的參數。 Yii2本身有一個日誌記錄系統,但主要用於錯誤和調試目的。我知道nginx有日誌記錄系統可以記錄訪問日誌,但我需要記錄在我的數據庫中的確切用戶名,用戶名,我認爲nginx不能記錄這個。php yii2的訪問日誌系統?

我想在每次用戶訪問頁面時將這些信息記錄到另一個Mysql表中,但我擔心表可能會非常快速地增長,似乎使用關係數據庫可能不是一個好主意。我應該用Hadoop?或者其他常見的做法來解決這種問題?感謝您的任何建議。

回答

1

如果你想哪個用戶訪問帶有參數,網頁URL地址

軌道,

nginx的訪問日誌是一個更好的選擇,因爲MySQL會傷害你的性能提升不少。

假設用戶ID是查詢字符串中的參數uid,您可以通過添加字段$arg_uid來定製nginx的訪問日誌。如果用戶標識是uri的一部分,則可能需要配置位置和正則表達式來捕獲它。

如果不能直接從請求中獲取用戶標識,那麼必須有一個令牌與一個且只有一個用戶關聯,這些用戶可以從mysql或redis進行回溯。在這種情況下,有2種方法:

  1. 返回用戶ID作爲在PHP例如X-UID的報頭,那麼在訪問日誌添加變量$upstream_http_X_UID。如果你不想把這個頭部返回給客戶端,添加一個指令proxy_hide_header X-UID;來從php響應中刪除這個頭部。
  2. 建立nginx與nginx-lua模塊並寫一塊lua腳本log_by_lua指令,其中根據該令牌從mysql或redis查詢用戶標識。然後通過添加用戶ID變量來自定義nginx的訪問日誌。

根據您的具體情況,選擇最佳解決方案。 我希望這可以幫助你。

+0

我不能在每個請求參數中放置uid,因爲我有session和cookie來跟蹤它們。因此,你的建議很好,我可以在http響應頭中輸出uid,並讓nginx記錄它們。後來我打算使用Logstash工具來分析nginx日誌。謝謝! –

0

我沒有使用Hadoop的經驗,但由於在MySQL表(40GB)中存儲了數百萬次瀏覽量,因此我在過去遇到了問題。

但基本上這個問題不存儲,但你怎麼實際上要使用該數據。

MySQL可以處理大量的數據我認爲,但取決於你需要如何顯示它你可能有一些cronjob做一些優化和保存在一個不同的格式到另一個表,所以它很容易顯示它,或者學習關於一些可能有所幫助的NoSQL數據庫。

順便說一句,我聽說在GetClicky Analytics的傢伙使用純文本文件來存儲數據,所以..我想你也可以選擇這個選項。

一些其他的想法,如果你選擇去與MySQL:

  • 也許看看錶分區?
  • 也許在Yii2中創建一個單獨的數據庫和單獨的數據庫連接,並使用該數據庫連接來存儲訪問日誌?這樣您就不會將訪問數據與應用程序數據混合起來
  • 也許這兩種?
+0

你的答案也給我提示。我真正想要做的是知道哪個用戶或什麼樣的用戶(年齡,性別等)喜歡閱讀哪種博客帖子,後來我們可以提醒他們類似的新帖子。因此我們不需要存儲所有的歷史日誌。一個月的數據可能已經足夠,或者最多六個月,這沒什麼大不了的,可以保存在Mysql中。 –