2011-02-23 58 views
3

好吧,所以我建立一個網站,人們可以發佈新聞,評論,問題等。人們也可以評價所有這些對象,最喜歡的大多數,共享他們等等。該網站是PHP + MySQL。我在PHP中編寫了一個腳本,它可以執行以下操作:最有效的方法來計算在網站上的對象'流行'

  1. 獲取所有評論以及在過去5分鐘內添加的分數。向每個評論對象的流行度變化添加一條記錄到'流行'表。
  2. 獲取所有新聞和分數/觀點/收藏夾/分享添加到他們。計算每個新聞報道的受歡迎程度(考慮到步驟1中附加的評論的受歡迎程度的變化),並將記錄插入流行度表中,同時每個新聞對象的受歡迎度發生變化。提問
  3. 重複步驟2和其他對象類型

我試圖運行此腳本(它實際上是一個symfony的任務),每5分鐘一個cron作業和PHP開始窒息,吃了我所有的服務器資源。

運行後臺分析腳本的首選方法是根據MySQL DB中的數據計算新數據,然後將計算後的數據插入到數據庫中?我確定我在這裏錯過了一些基本的程序。我應該注意到數據庫位於不同的服務器上,並且該服務器沒有資源問題。這個問題似乎侷限於應用程序服務器上循環遍歷對象的PHP窒礙,計算流行度(簡單計算)以及插入數據庫。

感謝

- 編輯

如何複製DB只是用於計算中使用的服務器。我可以使用複製的數據庫在計算服務器上運行流行度腳本,並將計算的流行度記錄插入到活動數據庫中。這當然會稍微延遲,但這並不是什麼大問題。我不確定這是否會解決PHP資源消耗問題。

回答

1

那麼首先要做的就是嘗試減少執行的查詢次數。如果你的sql和web服務器在不同的機器上,這一點尤其重要。嘗試使用JOIN來計算新聞項目的流行度,而無需逐個查看所有評論。

那麼您可以計算評論的流行度和新項目在同一查詢中的受歡迎程度。 (例如,選擇總和(評級)從新聞,評論,評級WHERE comments.news_id = news.id和rating.comment_id = comments.id(這個查詢過於簡化但仍然...))因爲你的主要問題是查詢的數量你必須執行,當然你的mysql服務器上會有足夠的資源。因爲大部分時間sql服務器都會等待下一個查詢到達。通過網絡的通信速度比CPU和RAM之間的通信速度慢得多。基本上會發生什麼是:PHP發送一個查詢到MySQL服務器並等待響應。 Mysql獲取查詢進程,發送響應並等待下一個查詢。這種等待是花費時間......所以要麼減少查詢量或在同一時間使用mysqli發送所有quires http://php.net/manual/en/mysqli.multi-query.php

+0

好了,所以我原本打算只依據用戶如何打進對象本身的對象的知名度。從那以後,我決定嘗試通過一系列因素來計算對象的流行度(通過上述方法),其中一個因素是所有附加到對象的註釋的流行度。所以首先我需要計算的意見普及,然後根據雙方的比分消息變化,查看變化的消息普及,評論熱度變化等 – Marc 2011-02-23 15:09:47

+0

我已經添加了一些更多的信息給我的答案 – Ivan 2011-02-23 15:42:58

+0

伊萬,多查詢修復了一切!現在快得多。謝謝! – Marc 2011-03-10 20:41:41

0

如果數據庫在不同的服務器上,我寧願選擇編寫MySQL過程來計算,或者至少使用持續連接。無論如何,5分鐘尤其適用於繁忙的服務器。 通常我認爲這樣的任務應該每天執行一次到幾次。

+0

我實際上並沒有在數據庫服務器上消耗大量資源。只有在應用程序服務器和PHP進程上。它被頻繁計算的原因是因爲我根據流行度對對象進行排序,並且用戶看到接近實時的流行度很好。 – Marc 2011-02-23 15:11:15

+0

我明白了,確保你只計算「髒」的對象。第二件事你可以選擇以小塊進行計算,並在停止的地方寫入索引。 – Michal 2011-02-23 15:18:46

0

與其將此作爲cron作業運行,您可以在每次執行改變它的操作時更新流行度。因此,例如,當用戶添加評論或對項目評分時,一旦完成,您就更新該項目的受歡迎程度。

相關問題