3

我的网站是一个社区;我们有论坛和用户资料,每个人都有所谓的“优点”,有点像 StackOverflow 上的“声誉”。我有一个在我制作的计时器上运行的代码。这个计时器有两个脚本运行;一个脚本每天运行一次(完美运行),另一个每周运行一次。

计时器本身工作正常,但是当运行每周代码时,会发生一些非常奇怪的事情:1) 每周代码第一次运行完美,但由于某种原因,整个代码第二次运行时间,并且会发生一些日志记录错误。2) 该程序第二次运行时,忘记了上一次大家登录的时间(如果用户连续两周不活动,系统应该将其功勋状态减一),因此无论如何都会减少大家的功勋他们一直很活跃。

我已经完成了我的作业,我认为这是我的浏览器出错(Firefox 会加载每个页面两次,具体取决于您拥有的插件),但事实并非如此;每个用户都有一个绩效日志,记录影响其绩效状态的每一笔交易。每个人都有两笔系统交易,第二笔交易正好在第一笔交易之后一秒。每个人都有相同的两个时间戳。这意味着,代码贯穿始终,给每个人他们所得到的东西,然后从头开始,正好在一秒钟后。然而,这一次,它无条件地给每个人一个缺点(从他们的优点中减去)。

这一切都不应该发生,因为我的每周计时器做的第一件事是检查它是否是正确的日子,它做的第二件事(如果它正确的日子)是将计时器更新到下周,所以它一天不会跑两次。

这里是:

<?php
mysql_connect("connect","username","password");
mysql_select_db("seriamus");
$feduby = mysql_query("SELECT day,week FROM timer WHERE name='timer'");
$timer = mysql_fetch_array($feduby);
//Daily Timer
if($timer[0]==date("M j, Y"))
{
    $tomorrow = strtotime("+1 day");
    mysql_query("UPDATE timer SET day='" . date('M j, Y', $tomorrow) . "' WHERE name='timer'");
    mysql_connect("connect","username","password") or die(mysql_error());
    mysql_select_db("agluserdatabase");
    $getsuspendinfo = mysql_query("SELECT gamertag,rank,sdate,srank FROM users");
    while($suspo = mysql_fetch_array($getsuspendinfo))
    {
        if($suspo[1]=="Suspended")
        {
            if($suspo[2]==date("M j, Y"))
            {
                mysql_query("UPDATE users SET rank='" . $suspo[3] . "', srank='', sdate='' WHERE gamertag='" . $suspo[0] . "'");
            }
        }
    }
}
//Weekly Timer
if($timer[1]==date("M j, Y"))
{
    $inaweek = strtotime("+7 days");
    mysql_query("UPDATE timer SET week='" . date('M j, Y', $inaweek) . "' WHERE name='timer'");
    mysql_connect("connect","username","password") or die(mysql_error());
    mysql_select_db("agluserdatabase");
    $getmeritinfo = mysql_query("SELECT merits,logins,lastseen,demerit,gamertag,rank,userid FROM users");
    while($meritinfo = mysql_fetch_array($getmeritinfo))
    {
        if($meritinfo[3]==0)
        {
            if($meritinfo[1]>=3)
            {
                if($meritinfo[5]!="Suspended"&&$meritinfo[5]!="Banned")
                {
                    $newmerits = $meritinfo[0] + 1;
                    mysql_query("UPDATE users SET merits='" . $newmerits . "' WHERE gamertag='" . $meritinfo[4] . "'");
                    mysql_query("INSERT INTO meritlog" . $meritinfo[6] . " VALUES ('System', 'Merit', 1, 'Active for a week without getting a demerit', '" . date('M j, Y g:i:s') . "')");
                }
            }
            else if ($meritinfo[1]==0)
            {
                $two_weeks_ago = strtotime('-14 days', strtotime(date("M j, Y")));
                $last_seen = strtotime($meritinfo[2], strtotime(date("M j, Y")));
                if($last_seen <= $two_weeks_ago)
                {
                    if($meritinfo[5]!="Suspended"&&$meritinfo[5]!="Banned")
                    {
                        $newmerits = $meritinfo[0] - 1;
                        mysql_query("UPDATE users SET merits='" . $newmerits . "' WHERE gamertag='" . $meritinfo[4] . "'");
                        mysql_query("INSERT INTO meritlog" . $meritinfo[6] . " VALUES('System', 'Demerit', 1, '2+ weeks of inactivity', '" . date('M j, Y g:i:s') . "')");
                        if($newmerits <= -10)
                        {
                            mysql_query("UPDATE users SET merits = 0 WHERE gamertag = '" . $meritinfo[4] . "'");
                            mysql_query("UPDATE users SET lastpromotion = '" . date('M j, Y') . "' WHERE gamertag = '" . $meritinfo[4] . "'");
                            if($meritinfo[5]=="Praetorian")
                            {
                                mysql_query("UPDATE users SET rank = 'Centurion' WHERE gamertag = '" . $meritinfo[4] . "'");
                            }
                            else if($meritinfo[5]=="Centurion")
                            {
                                mysql_query("UPDATE users SET rank = 'Triarius' WHERE gamertag = '" . $meritinfo[4] . "'");
                            }
                            else if($meritinfo[5]=="Triarius")
                            {
                                mysql_query("UPDATE users SET rank = 'Decanus' WHERE gamertag = '" . $meritinfo[4] . "'");
                            }
                            else if($meritinfo[5]=="Decanus")
                            {
                                mysql_query("UPDATE users SET rank = 'Prime Legionary' WHERE gamertag = '" . $meritinfo[4] . "'");
                            }
                            else if($meritinfo[5]=="Prime Legionary")
                            {
                                mysql_query("UPDATE users SET rank = 'Legionary' WHERE gamertag = '" . $meritinfo[4] . "'");
                            }
                            else if($meritinfo[5]=="Legionary")
                            {
                                mysql_query("UPDATE users SET rank = 'Banned' WHERE gamertag = '" . $meritinfo[4] . "'");
                            }
                        }
                    }
                }
            }
        }
        mysql_query("UPDATE users SET logins='0', demerit='0' WHERE gamertag='" . $meritinfo[4] . "'");
    }
}
?>

在这段代码中,还有一些与用户排名有关的东西,或者他们当周被记过多少,或者他们是否被暂停或禁止等。它们应该不重要,但我包括了它们无论如何,这样您就可以获得整个代码。

如果您需要我详细说明整个代码的具体设置,请告诉我。

提前感谢您花时间阅读所有这些内容并(希望)帮助我!任何帮助都将不胜感激,即使它是一些与问题完全无关的效率方法——任何帮助都会很棒!:D

4

2 回答 2

1

I think your having an issue because it loads twice.

First load

Selects table Updates daily Starts processing

Then second load happens.

Selects table Skips daily Updates weekly Starts processing

Then the first load again.

Updates weekly (again, because it doesn't check it) Starts processing

I'd recommend doing 'LOCK TABLES timer WRITE' then an 'UNLOCK TABLES' at the end. Also, you would need to clean up your database accesses with link identifiers, I.e.

$timer = mysql_connect(); mysql_query(..., $timer);

Also, push the code to a cron.php or something similar, regular checks like this are not a good idea on main pages. Another option would be to generate random number and only check 1% of time. But best bet is cron, even if you just set it up as a you load the page from your computer once a day.

于 2012-04-08T16:39:39.713 回答
0

我们遇到了这个问题,因为我们使用的 jquery 小部件具有这样的模板元素:

<div><img src="#{icon}" /></div>

其中 #{icon} 通过小部件函数替换为“path/to/icon.png”。但是,在页面加载时,“#”会导致浏览器再次加载脚本,并且会话变量会变得很糟糕。修复方法是将模板编辑为:

<div>#{icon}</div>

其中 #{icon} 将替换为 '' 。

这可能不是您的答案,但是当我们在寻找答案时,您的问题出现了,看到这样的答案会很方便。

于 2013-01-18T20:04:03.970 回答