2016-05-29 12 views
1

Wie kann ich URL-Anfragen in PHP über mehrere Benutzer Warteschlange. Angenommen, es gibt ein Formular, aber ich brauche nur alle 10 Sekunden eine Einsendung.Wie Anfragen in PHP Warteschlange

Wenn Benutzer1 das Formular um 12:00:01 sendet und dann ein anderer Benutzer das Formular um 12:00:03 einreicht, wird er in die Warteschlange eingereiht und seine Anfrage wird um 12:00:11 eingereicht. Wenn der dritte Benutzer um 12:00:09 Uhr eingibt, wird er an zweiter Stelle in der Warteschlange stehen und um 12:00:21 Uhr bearbeitet.

konnte ich keine passende Lösung für so etwas wie dieses enter image description here

+0

Verwenden Sie eine Datenbank zum Speichern von Benutzern, die sich gerade in der Warteschlange befinden. – lolbas

+0

Das ist eine nicht triviale Aufgabe ... Ohne weitere Details würde ich sagen, der saubere und robuste Ansatz besteht darin, jede Anfrage sofort zu akzeptieren und nur die Aufgabe in ein serverseitiges Warteschlangensystem einzuordnen. Dann können Sie clientseitig ausgelöste Ajax-Long-Poll-Anforderungen (oder Web-Sockets) verwenden, um auf das Ergebnis des Ergebnisses in der Warteschlange zu warten. – arkascha

+0

lassen Sie mich wissen, wenn meine Antwort geholfen hat – Webeng

Antwort

2

Sie für Warteschlangen verschiedene Möglichkeiten finden, unter denen die beiden folgenden: pheanstalk

1) unter Verwendung einer Warteschlange Bibliothek wie (erfordert beanstalkd). Es ist eine Warteschlange, die das TCP-Protokoll verwendet (standardmäßig auf Port 11300, obwohl dies leicht geändert werden kann). Es ist sehr gut getestet, robust und vor allem Open-Source: https://github.com/pda/pheanstalk

2) Speichern Sie Ihre Benutzer Eingabe in einer Datenbank und hat Ihren Code die Anforderung alle 10 Sekunden ausgeführt werden. Diese Option ist wahrscheinlich viel einfacher auszuführen. Sie müssten jedoch auch einen Dämon erstellen, bei dem es sich im Grunde um ein eigenständiges Skript handelt, das im Hintergrund ausgeführt wird und die Informationen in der Warteschlange verarbeitet. Zum Beispiel kann sagen, dass die Formularseite die Benutzer Umleitungen an validation.php, wenn das Formular abgeschickt wird und der folgende PHP-PDO-Code wird ausgeführt:

//.... 
$sql = "INSERT INTO queue (user_id, process) VALUES (?, ?)"; 
$stmt = $conn->prepare($sql); 
$stmt->execute([$id, $process]); 
//... 

Sie dann $id und $process am Ende der gespeicherten habe queue Tabelle (ALSO lässt annehmen, dass die Warteschlange einen PRIMARY KEY namens queue_id hat, der als AUTO_INCREMENT eingerichtet ist). Von dort aus würde das Sand-Alone-Skript (Daemon) im Hintergrund ausgeführt werden, das diese Daten abrufen und verarbeiten würde. Zum Beispiel:

worker.php:

<?php 
//other code like connecting to the database 
while (1) 
{ 
    $sql = "SELECT * FROM queue LIMIT 1; "; 
    $stmt = $conn->query($sql); 
    $result = $stmt->fetch(PDO::FETCH_ASSOC); 

    //code that processes the values obtained from result 

    $sql = "DELETE FROM queue WHERE queue_id = {$result['queue_id']}"; 
    $stmt = $conn->query($sql); 


} 

Empfehlung:

Es wäre noch besser, wenn Sie Transaktionen in dem obigen Code verwendet, um sicherzustellen, dass die Auswahl, Verarbeitung, und Löschen alle zusammen passieren. Wenn zum Beispiel der Strom beim nächsten Löschvorgang auf Ihrem Server (oder ähnlichem) ausgeht, würde Ihre Datei "workers.php" beim Neustart des Servers diese Datei erneut verarbeiten, da sie nicht gelöscht wurde, jedoch bei Transaktionen wäre kein Problem.