私のウェブサイトはコミュニティです。フォーラムとユーザープロファイルがあり、誰もがここStackOverflowの「評判」のような「メリット」と呼ばれるものを持っています。作成したタイマーで実行されるコードがあります。このタイマーから2つのスクリプトが実行されます。1つのスクリプトは1日に1回実行され(これは問題なく機能します)、もう1つのスクリプトは1週間に1回実行されます。
タイマー自体は正常に機能しますが、毎週のコードを実行するときは、いくつかの非常に奇妙なことが起こります。1)毎週のコードは最初は完全に実行されますが、何らかの理由で、コード全体が2番目に実行されます。時間、およびいくつかのロギングエラーが発生します。2)このプログラムを2回実行すると、最後に全員がログインした時間が忘れられます(2週間連続して非アクティブになっている場合、システムはユーザーのメリットステータスを1つ減らすことになっています)。したがって、どのようにでも全員のメリットが減ります。彼らはアクティブでした。
私は宿題をしました、そしてそれは私のブラウザのエラーだと思いました(Firefoxはあなたが持っているプラグインに応じてすべてのページを2回ロードします)、しかしこれはそうではありません。すべてのユーザーにはメリットログがあり、メリットステータスに影響を与えるすべてのトランザクションが記録されます。誰もがシステムによって2つのトランザクションを持ち、2番目のトランザクションは最初のトランザクションのちょうど1秒後になります。全員が同じ2つのタイムスタンプを持っています。これが意味するのは、コードが実行され、すべての人に来たものを提供し、ちょうど1秒後に最初からやり直すということです。ただし今回は、無条件にデメリット(メリットからの減算)を全員に与えます。
私のウィークリータイマーが最初に行うことは、それを行うのに適切な日であるかどうかを確認することであり、2番目に行うこと(適切な日である場合)は、タイマーを次の週に更新することであるため、これは発生しません。 1日に2回実行されることはありません。
ここにあります:
<?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