整个PHP代码运行两次

时间:2012-04-08 15:34:40

标签: php

我的网站是一个社区;我们有论坛和用户配置文件,每个人都有所谓的“优点”,有点像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

2 个答案:

答案 0 :(得分:1)

我认为你有问题,因为它加载了两次。

首次加载

选择表格 每日更新 开始处理

然后发生第二次加载。

选择表格 每天跳过 每周更新 开始处理

然后再次加载。

每周更新(再次,因为它没有检查) 开始处理

我建议做“LOCK TABLES”计时器WRITE&#39;那么一个&#39; UNLOCK TABLES&#39;在末尾。此外,您需要使用链接标识符清除数据库访问,即

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

此外,将代码推送到cron.php或类似的东西,这样的常规检查在主页上不是一个好主意。另一种选择是生成随机数,只检查1%的时间。但最好的选择是cron,即使您只是将其设置为每天从计算机加载一次页面。

答案 1 :(得分:0)

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

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

使用'path / to / icon.png'通过widget功能替换#{icon}。但是,在页面加载时,“#”导致脚本被浏览器再次加载,并且会话变量被加密。修复方法是将模板编辑为:

<div>#{icon}</div>

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

这可能不是你的答案,但是当我们找到一个时,你的问题就出现了,看到这样的人会很方便。