2012-04-02 8 views
1

Ich habe eine PHP-Funktion, die ich öffentlich im Web verfügbar machen will - aber es verwendet eine Menge von Server-Ressourcen jedes Mal, wenn es aufgerufen wird.PHP - erzwingen Benutzer warten vor der Verwendung von Server-Ressourcen

Was ich möchte, ist, dass ein Benutzer, der diese Funktion aufruft, gezwungen ist, einige Zeit zu warten, bevor die Funktion aufgerufen wird (oder zumindest bevor sie es ein zweites Mal aufrufen kann).

Ich würde sehr bevorzugen, dass dieses "Warten" auf der Server-Seite erzwungen wird, so dass es von zweifelhaften Clients nicht überschrieben werden kann. Ich möchte darauf bestehen, dass sich Benutzer in ein Online-Konto einloggen.

Gibt es eine effiziente Möglichkeit, den Benutzer warten zu lassen, ohne Serverressourcen zu verwenden? Würde 'sleep()' ein geeigneter Weg sein, dies zu tun? Gibt es irgendwelche vorgeschlagenen Probleme mit der Verwendung von sleep()? Gibt es dafür eine bessere Lösung?

Entschuldigung meine Ignoranz, und danke!

+0

Warum denkst du Schlaf würde helfen? I –

+0

Ich kann glauben, dass es nicht: die Motivation für die Frage ist, herauszufinden, was funktionieren würde. – Ronald

+0

was möchten Sie wirklich tun? Bewertungslimit? –

Antwort

1

sleep wäre in Ordnung, wenn Sie PHP als Befehlszeilenprogramm zum Beispiel verwenden würden. Für eine Website hält Ihre sleep die Verbindung jedoch offen. Ihr Webserver wird nur eine endliche Anzahl von gleichzeitigen Verbindungen haben, also könnte dies für Ihre Website verwendet werden.

Ein besser - aber komplizierter - Weg wäre die Verwendung einer Job-Warteschlange. Fügen Sie die Aufgabe einer Warteschlange hinzu, die von einem geplanten Skript verarbeitet wird, und aktualisieren Sie die Webseite mit AJAX oder einer Meta-Aktualisierung.

+0

Wenn ich AJAX verwende, ist das vermutlich clientseitig und könnte vom Client überbrückt werden? ist das nicht korrekt? – Ronald

+0

Der AJAX würde die Aufgabe nicht ausführen - es würde einfach den Fortschritt des Jobs überprüfen, der * die * Aufgabe ausführt –

+0

Oh, ich verstehe! Vielen Dank! Also ... ähm ... die Frage wird ... Wie richte ich eine Job-Warteschlange ein? ;) – Ronald

0

Dies wird am besten auf Serverebene behandelt. Kein Grund, PHP für Wiederholungsanfragen aufzurufen.

Wie viele Websites verwende ich Nginx und Sie können rate-limiting verwenden, um Wiederholungsanforderungen über eine bestimmte Anzahl zu blockieren. Also, drei Anfragen pro IP, pro Stunde.

+0

@RonaldStewart, das ** ist ** die Industriestandardlösung. Wenn Sie Apache verwenden, können Sie auch die Ratenbegrenzung aktivieren. – Xeoncross

+0

Entschuldigung - zuerst nur der erste Absatz angezeigt. – Ronald

1

sleep() ist in fast allen möglichen Situationen eine schlechte Idee. In Ihrem Fall ist es schlecht, weil es die Verbindung zum Client offen hält und die meisten Webserver eine Grenze für offene Verbindungen haben.

+0

Ja, darum habe ich mir Sorgen gemacht. Danke, dass du das für mich bestätigt hast. – Ronald

1

sleep() wird Ihnen überhaupt nicht helfen. Der Benutzer könnte die Seite einfach zweimal gleichzeitig laden, und der Befehl würde zweimal nacheinander ausgeführt.

Sie könnten stattdessen einen Zeitstempel in Ihrer Datenbank speichern, wenn Ihre Funktion zuletzt aufgerufen wurde. Dann sollten Sie vor dem Aufruf die Datenbank überprüfen, um festzustellen, ob eine angemessene Zeitspanne verstrichen ist. Wenn dies der Fall ist, rufen Sie die Funktion auf und aktualisieren Sie den Zeitstempel in der Datenbank.

1

Wenn Sie eine Benutzeranmeldung erzwingen möchten, dann ist das Problem viel einfacher geworden.

Haben Sie einen Datensatz in der Datenbank, in der Benutzer und das letzte Mal aufgeführt sind, als sie Ihren Ressourcen verbrauchenden Dienst verwendet haben, und messen Sie den Zeitunterschied zwischen damals und heute. Wenn der Zeitunterschied zu niedrig ist, verweigern Sie den Zugriff und zeigen Sie eine Fehlermeldung an.

+0

das macht mir sehr viel Sinn, danke. – Ronald