我的网站是一个社区;我们有论坛和用户配置文件,每个人都有所谓的“优点”,有点像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
答案 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}将替换为''而不是。
这可能不是你的答案,但是当我们找到一个时,你的问题就出现了,看到这样的人会很方便。