4

だから、私のアーケードでは、howlingdoggames.com。ゲームがオンになっているページにアクセスするたびにポイントを獲得できるポイントシステムがあります。これの乱用を減らすために、私はある種の遅延を作りたいので、45秒後にのみ授与されます。これが私が試したことです:

if ($_SESSION['lastgame'] != $gameid) {
    sleep(45);
    $points = $points + $game_points;
    $_SESSION['lastgame'] = $gameid;
}

index.phpしかし、これは私のサイトの他の多くのコードと一緒にあるので、これは私のWebサイト全体を45秒間停止するようです。

とにかく私はそのコードのビットを分離できるので、それはステートメントを作るだけですか

$points = $points + $game_points;

45秒待ちますか?

4

6 に答える 6

9

PHP には (ほとんどの場合) マルチスレッドはありません。Unix システムではプロセスを fork することでこれを行うことができますが、マルチスレッドは実際には求めているものではないため、それは関係ありません。次のような単純なロジックが必要です。

$now = time();
session_start();
$last = $_SESSION['lastvisit'];
if (!isset($last) || $now - $last > 45) {
    $points = $_SESSION['points'] ?? 0;
    $_SESSION['points'] = $points + 10;
    $_SESSION['lastvisit'] = $now;
}

基本的に、最後にポイントを与えてからの増分が 45 秒を超える場合にのみ、ポイントを与えます。

于 2009-10-24T09:12:30.877 に答える
7

スクリプトのセッション ブロックです。「PHPにはマルチスレッドはありません」ではありません。sleep() の前の session_write_close() は、スクリプト全体のブロックを解決します。しかし、あなたの問題には合わないかもしれません。

そのため、js と AJAX の settimeout を使用してボーナスを保存する必要がありました。

php.net の sleep() のコメントから: http://www.php.net/manual/en/function.sleep.php#96592

sleep() は、スクリプトだけでなく、現在のセッションの実行を遅らせることに注意してください。次のサンプルを考えてみましょう。2 台のコンピューターがブラウザーから同じスクリプトを呼び出しますが、ブラウザーはスリープ状態になるだけです。

于 2012-08-09T07:27:03.980 に答える
2

いいえ、直接ではありません。最後の訪問のタイムスタンプを記憶し、それから十分な時間が経過した場合にのみポイントを追加するなど、別のアプローチを取る必要があります。

于 2009-10-24T08:58:35.230 に答える
2

PHPにはマルチスレッドがないため、sleep()常にスクリプト全体がブロックされます。

これを解決する方法は、最後のゲームの時間を記録し、それより45秒以上遅れている場合にのみポイントを獲得することです。

<?php
session_start();
if (!isset($_SESSION['last_game_time'])
    || (time() - $_SESSION['last_game_time']) > 45) {

    // code to award points here

    $_SESSION['last_game_time'] = time();
}

ユーザーがCookieを無効にした場合でも、これを悪用する可能性があることに注意してください(したがって、セッションデータはありません)。したがって、それが本当に心配な場合は、機能の使用を許可する前に、Cookieが有効になっていることを確認してください(これについては、おそらくいくつかの質問があります)。

于 2009-10-24T08:59:23.810 に答える
1

スクリプトをブロックする代わりに、セッションの現在の時間を保存し、ポイントを追加せずにページをレンダリングします。その後のページビューで、セッションで保存された時間が45秒より古いことがわかった場合は、ポイントを追加し、必要な場所に保存して、時間をクリアします。

于 2009-10-24T08:58:54.450 に答える
0

できませんが、このコードを JavaScript にして、AJAX を使用してボーナスを保存することはできます。

于 2009-10-24T09:21:20.750 に答える