它实际上取决于您的业务逻辑布局的偏好所在,你要如何实时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