它實際上取決於您的業務邏輯佈局的偏好所在,你要如何實時acheivements是。如果你想在你的sql服務器上卸載一堆業務邏輯,把它放在一個存儲過程中,否則,將計算分類到一個php類中,然後使用該類來確定新的成就。
我肯定會建議在正常頁面響應之外進行處理。也許會啓動一個服務器端的php cli調用,或者設置一個cron作業來運行所有的個體,並通過一定的時間間隔檢查結果。
編輯:
爲獎勵成績的實際方法,我會認爲你是最靈活,最簡單的實現(你會發現更多的簡單/不太靈活,更靈活/更少簡單的選擇我敢肯定)將創建一個AwardRunner類,一個IAward接口和一系列IAward的獨立實現,以獲得您的每個獎項。基本的想法是這樣的:
<?php
class AwardRunner {
var $UserId = 0;
function AwardRunner($userId) {
$this->UserId = $userId;
$dir = "/path/to/your/folder/full/of/IAwards/";
$includes = read_dir($dir);
//include all files that exist
foreach($includes as $include)
{
if (is_file($include))
{
require($include);
}
}
}
public function Run() {
$classList = get_declared_classes();
foreach($classList as $key => $className)
{
if (in_array('IAward', class_implements($className))) {
$award = $className();
$award->UserId = $this->UserId;
$award->GrantIfUserQualifies();
}
}
}
//function for reading all files in a directory.
//this is recursive, so any files in subfolders will also make it in
function read_dir($dir)
{
$array = array();
$d = dir($dir);
while (false !== ($entry = $d->read())) {
if($entry!='.' && $entry!='..') {
$entry = $dir.'/'.$entry;
if(is_dir($entry)) {
$array = array_merge($array, read_dir($entry));
} else {
$array[] = $entry;
}
}
}
$d->close();
return $array;
}
}
?>
我想的IAward接口將是什麼樣子會從使用很清楚的,雖然你可能從你的表添加到它的ID字段想法所以它可以將自己插入到數據庫中,就像調用AwardRunner類一樣。
這個想法應該是有效的,無論你是否有一些批處理循環遍歷所有用戶的獎勵過程,或者是在每次提交任務後將其關閉。
運行檢查服務器上的成就,獨立於用戶的體驗,聽起來像迄今爲止的最佳解決方案。我只是不確定我應該如何去檢查成就獎。現在我有一個頁面,其中包含一系列成就條件。然而,由於各種原因,這似乎不是最佳解決方案。有任何想法嗎? – daveomcd 2011-05-11 18:07:07
@daveomcd,看修改後的答案。 – 2011-05-12 16:56:57
非常感謝,我覺得我很接近一個完整的新手在這個東西,但我相信能理解你在上面做的所有事情。我從來沒有想過這樣做,至少現在似乎是一個令人驚歎的建立方式! :)感謝所有的幫助,現在我將開始設置它! – daveomcd 2011-05-12 18:08:38