3

私のウェブサイトはコミュニティです。フォーラムとユーザープロファイルがあり、誰もがここ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

4

2 に答える 2

1

2回ロードするので問題があると思います。

最初のロード

テーブルを選択します毎日更新します処理を開​​始します

次に、2番目のロードが発生します。

テーブルを選択します毎日更新をスキップします毎週更新処理を開始します

その後、最初のロードを再度行います。

毎週更新します(これもチェックしないため)処理を開始します

最後に「LOCKTABLEStimerWRITE」を実行してから「UNLOCKTABLES」を実行することをお勧めします。また、リンク識別子を使用してデータベースアクセスをクリーンアップする必要があります。

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

また、コードをcron.phpまたは同様のものにプッシュします。このような定期的なチェックは、メインページではお勧めできません。もう1つのオプションは、乱数を生成し、1%の時間だけをチェックすることです。ただし、1日に1回コンピュータからページをロードするように設定した場合でも、cronが最善の策です。

于 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 に答える