2012-06-05 67 views
0

我正在開發一個網頁遊戲(js php mysql),其中一個點擊一個按鈕開始一個需要時間完成的動作(比方說10個小時),當它完成時,一些點被添加到該玩家的總數中。問題在於即使玩家在動作完成時不在線也需要添加這些點數。例如,我需要更新排名或發送給玩家的電子郵件。如何在一定的時間後採取行動(不同的用戶之間)?

我以爲關於一個cron作業不斷檢查結束行爲,但我認爲這會殺死資源(有時會檢查數千名玩家的行爲)。

是否有更好的解決方案來解決這個問題?

感謝您的關注!

+0

聽起來像一個cron工作正是你所需要的。 – 2012-06-05 21:40:49

+0

我討厭用大量不必要的輪詢來使服務器超載。但是,所有考慮事項,服務器端「cron」工作可能是你最好的選擇。恕我直言... – paulsm4

回答

4

您可以在數據庫完成時寫入數據庫,並在用戶登錄時將賺取的點數添加到他的帳戶中。您也可以使用cronjob進行檢查。即使你有數百萬用戶不會殺死你的服務器。

+0

美麗!我喜歡! – paulsm4

+0

那會不會讓服務器超載?考慮到數百萬用戶使用多個動作...... – pogush

+0

@pogush這對於每個數據庫都是一項簡單的工作,您可以使用存儲過程和良好索引優化大量工作。 – Oliver

0

克朗是完美的。你可以在存儲過程中編寫你的任務,然後讓cron運行一個SQL腳本來調用存儲過程來更新你的播放器的記錄。數據庫旨在有效地處理數以千萬計的信息,所以我不認爲它會殺死系統資源的想法是有效的,除非你的主機系統已經真的受到了限制。

0

如果您想避免作弊,您需要在服務器上進行檢查。如果在客戶端的Javascript中發生「等待」,則可以輕鬆地減少剩餘時間。

因此,您需要將作業發送到服務器(假定其對時鐘修改是安全的),服務器將確定結束時間戳。你可以將你的工作存儲在隊列中。

如果您只需要用戶自己提供此信息,則可以在用戶登錄時查看隊列,否則每分鐘運行一次cron作業。此作業將標記當其時間戳過去時完成的所有作業(並將其從數據庫中刪除)。

如果您需要更精確的檢查,您需要提出一種更經常執行此操作的替代服務器端解決方案(例如,每隔幾秒鐘簡單程序輪詢數據庫)。

相關問題