Ich versuche, ein Missionssystem zu erstellen, in dem Benutzer eine Mission annehmen können oder nicht. Wenn sie nach X Minuten nicht angenommen wurde, wird sie inaktiviert. Ist dies ein guter Weg, um 10.000 Missionen pro Tag zu bewältigen?

<?php
    $mission_id = htmlspecialchars($_POST["mission_id"]));
    $user = $_SESSION["user"];

    // Verify that user is same as mission agent

    $verify = $conn->prepare("SELECT agent FROM missions WHERE id = ? AND active = 0 ORDER BY id limit 1");
    $verify->bindParam(1, $user);
    $verify->execute();
    $verify = $verify->fetch(PDO::FETCH_ASSOC);

    if($verify["agent"] == $user)   {
        unset($verify);
        // Do time code.
        ignore_user_abort(true);
        set_time_limit(300);
        $time = 0;
        while(time < 300)   {
            sleep(15);
            time += 15;
            // check if mission was accepted

            $verify = $conn->prepare("SELECT accepted FROM missions WHERE id = ? ORDER BY id LIMIT 1");
            $verify->bindParam(1, $mission_id);
            $verify->execute();
            $verify = $verify->fetch(PDO::FETCH_ASSOC);
            if($verify["accepted"] == 0)    { // not accepted
                unset($verify);
                // Inactivate mission
                $inactivate = $conn->prepare("UPDATE missions SET active = 0 WHERE id = ?");
                $inactivate->bindParam(1, $id);
                $inactivate->execute();
                unset($inactivate);
            }
            else {
                break;
            }
        }
    }
    else    {
        header("location: logout.php");
        // Log user out
    }
?>
0
Alpha Kitten 28 Dez. 2015 im 03:35

2 Antworten

Beste Antwort

Ich würde einen Zeitstempel für das Ablaufdatum verwenden und ihn auf 17 Minuten in der Zukunft setzen, wenn Sie die Mission erstellen

Wenn sie nicht danach handeln. Es läuft automatisch ab, wenn dies der Fall ist. Aktualisieren Sie den Ablaufdatensatz auf 9999-12-31

Und nicht aktiv / inaktiv verwenden. Verwenden Sie einfach die aktuelle Zeit, um alle aktiven Missionen zu erhalten.

Es ist kein Ereignis erforderlich. Kein Crontab. Kein zusätzlicher Code

0
DaveTheRave 28 Dez. 2015 im 01:12

Verwenden Sie die mysql Create Event -Funktionalität, die für diese perfekt ist Arten von Situationen. Stellen Sie sich diese als geplante gespeicherte Prozeduren vor (so kompliziert wie Sie möchten), die häufig auf sehr flexible und wiederkehrende Weise ausgelöst werden.

Diese Funktionalität wurde eingeführt, um cron zu beseitigen, insbesondere wenn nur Datenbankoperationen ausgeführt werden sollen.

Eine allgemeine Ansicht davon finden Sie hier in einer Antwort, die ich geschrieben habe.

1
Community 23 Mai 2017 im 10:28