Beschreibung des PHP-Timers

不言
Freigeben: 2023-04-02 17:58:02
Original
6674 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich Anweisungen zu PHP-Timern vorgestellt, die einen bestimmten Referenzwert haben. Jetzt können Freunde in Not darauf zurückgreifen.

Es gibt zwei gängige Timer: einen für die periodische geplante Ausführung. Beispielsweise wird der Bericht jeden Tag um drei Uhr morgens erstellt. Der andere Bericht wird nach einer bestimmten Zeit (einmalig) erstellt. Beispielsweise werden tägliche Anmeldeprämien fünf Minuten nach der Anmeldung des Mitglieds am System ausgegeben. Die beiden Situationen entsprechen den Befehlen cron und at in der Shell, die den Funktionen JavaScript und setInterval in setTimeout ähneln (streng genommen wird setInterval regelmäßig ausgeführt, und die Ausführung erfolgt um Der angegebene Zeitpunkt muss selbst behandelt werden.

PHP-Programmierer, die Webentwicklung betreiben, sollten mit den beiden Timer-Funktionen in JavaScript vertraut sein. Zurück zur PHP-Ebene sind sie etwas verblüfft: PHP hat sleep, aber es gibt keine (eingebaute) Funktion. Timer-Funktion verfügbar. sleepDie Funktion kann dies kaum tun, aber sie führt dazu, dass der Prozess blockiert wird und während dieser Zeit keine anderen Dinge tun kann (oder nicht mehr reagiert). Warum stellt PHP die Timer-Funktion nicht zur Verfügung?

Ursache

Ich persönlich glaube, dass der wesentliche Grund, warum PHP keine Timer in der Webentwicklung verwenden kann, das Fehlen einer kontrollierbaren residenten Speicherlaufumgebung ist . Zwei wichtige Punkte: erstens residenter Speicher und zweitens steuerbar. Im CGI-Modus wird der Prozess direkt nach der Ausführung des Skripts beendet und es kann nicht erwartet werden, dass er die Aufgabe zu einem bestimmten Zeitpunkt ausführt. Im PHP-FPM-Modus befindet sich der Prozess (meistens) im Speicher, ist jedoch nicht kontrollierbar.

Unkontrollierbar bedeutet, dass der Prozess, der PHP ausführt, nicht vom PHP-Code beeinflusst wird und der Eintrittspunkt und die Beendigungszeit des Prozesses durch zusätzliche Programme gesteuert werden. Im FPM-Modus unterbrechen beispielsweise die Funktionen exit und die im PHP-Skript nur die Ausführung des Skripts und haben keine besonderen Auswirkungen auf den Ausführungsprozess des Skripts (mit Ausnahme von Speicherlecks). Das von PHP-Entwicklern geschriebene Skript ist der Ausführungskörper des Prozesses. Nach der Ausführung wird es aus dem Ausführungskontext des Prozesses entladen. In diesem Fall wird der Zeitpunkt der Ausführung des PHP-Skripts immer noch von außen bestimmt. Wenn keine externe Anforderung vorliegt, liegt der PHP-Code still auf der Festplatte, ohne etwas zu tun, und es handelt sich um eine geplante Aufgabe.

Da PHP hauptsächlich auf die Webentwicklung ausgerichtet ist, ist der Ausführungsmodus von PHP stabil und zuverlässig und die Entwicklungseffizienz ist schnell. Durch das Weglassen des Ressourcenfreigabeschritts können beispielsweise viel Arbeitsaufwand und Fallstricke bei der Entwicklung vermieden werden. Denken Sie an einige Bibliothekscodes von Drittanbietern, die Zeitzonen, Zeichenkodierungen usw. ändern und diese nicht wiederherstellen. In einer Umgebung mit residentem Speicher wird dies mit ziemlicher Sicherheit zu Problemen bei nachfolgenden Anforderungen führen. Im FPM-Modus wird dieser Fallstrick jedoch unbeabsichtigt geglättet, was viel Zeit beim Debuggen spart und erheblich dazu beiträgt, dass Programmierer ihren Haaransatz behalten können.

Nachdem wir nun das Problem verstanden haben, wie nutzt man einen Timer, um geplante Aufgaben in PHP auszuführen?

Gefährliche Praxis

In einer Webumgebung haben PHP-Skripte standardmäßig eine Zeitüberschreitung. Entfernen Sie die Timeout-Einstellung und Sie können das Programm im Hintergrund weiterlaufen lassen (wenn der Prozess nicht beendet wird). Beispielsweise läuft der folgende Code im Hintergrund weiter, nachdem er auf die Anfrage geantwortet hat, und gibt alle fünf Sekunden die Zeit in die Datei aus:

# test.php
set_time_limit(0); # 取消超时设置,让脚本可一直运行

echo 'This is a background run forever script. Now you can leave me alone.';

fastcgi_finish_request();   # 结束当前请求

do{
   file_put_contents("/tmp/out.dat", "test script, now:" . date("Y-m-d H:i:s") . "\n", FILE_APPEND);
   sleep(5);
}while(true);
Nach dem Login kopieren

Überwachen Sie nach dem Anfordern der http://localhost:8080/test.php-Datei die /tmp/out.dat-Datei und Sie werden feststellen, dass Inhalte ständig ausgegeben werden, unabhängig davon, ob der Client die Verbindung trennt, den Browser schließt oder den Computer neu startet (der Server kann nicht neu gestartet werden). Dies zeigt, dass das Programm ausgeführt wurde und die gewünschte Timer-Funktion erreicht wurde. Wenn Sie sleep in usleep oder time_nanosleep ändern, können Sie auch Mikrosekunden- und Nanosekunden-Timer implementieren. Wäre das nicht schön?

In der Praxis sollten Sie versuchen, die Implementierung von Timern auf diese Weise zu vermeiden, da dies nicht nur ineffizient, sondern auch etwas gefährlich ist. Einer der Gründe dafür ist, dass jede Anfrage einen Prozess belegt und 100.000 Anfragen 100.000 Prozesse erfordern, was im Grunde dazu führt, dass das System abstürzt oder nachfolgende Anfragen nicht mehr reagieren. Wenn die Sitzung geöffnet ist, Sie aber vergessen, , es wird auch das gleiche Problem verursachen, wenn nachfolgende Anfragen eines Benutzers hängen bleiben (die Sitzung befindet sich in einem gesperrten Zustand, wenn sie aktiv ist, und wenn die Sitzung nicht geschlossen wird, können nachfolgende Prozesse die Sitzung nicht öffnen). session_write_close

Die Webentwicklung sollte so schnell wie möglich auf Benutzeranfragen reagieren. Das Erzwingen eines Timers in der Webentwicklung auf diese Weise führt dazu, dass die gesamte Webanwendung instabil, unzuverlässig oder unvorhersehbar wird. Menzius sagte: Wisse und handle umsichtig, ein Gentleman steht nicht vor einer gefährlichen Mauer. Unzuverlässige Praktiken sollten so weit wie möglich vermieden werden, und ganz nebenbei sollten auch Schuldzuweisungen und Schuldzuweisungen vermieden werden.

Sehen wir uns an, wie man Timer in PHP richtig verwendet.

Richtige Haltung

Die Methoden zur Implementierung von Timern in PHP lassen sich einfach wie folgt zusammenfassen:

  1. Verwenden Sie dazu Planungstools wie cron und Jenkins Zyklen zeitgesteuerter Aufgaben (entweder um ein Skript auszuführen oder eine bestimmte URL anzufordern);

  2. Einmalige Ausführungsaufgaben werden an Programme von Drittanbietern zur Ausführung über Nachrichtenwarteschlangen, Datenbanken usw. übermittelt .;

  3. Simulieren Sie geplante Aufgaben wie WordPress, aber denken Sie daran, dass diese Methode auf Client-Anfragen basiert und Probleme mit der Prozessparallelität selbst lösen muss

  4. Verwenden Sie den residenten Speichermodus, um PHP-Programme auszuführen, d. h. den CLI-Modus.

Mit Ausnahme der dritten Methode werden alle anderen Methoden empfohlen. Bitte berücksichtigen Sie den spezifischen Plan basierend auf den tatsächlichen Bedürfnissen. Als PHP-Programmierer ist die erste Wahl natürlich die Verwendung von PHP, also dem CLI-Modus.

CLI-Modus

Um ehrlich zu sein, ermöglicht der CLI-Modus PHP, seinen Speicherplatz erheblich zu erweitern. Im CLI-Modus ist der Einstiegspunkt des Programms das Skript, und der Code kann im Speicher liegen, und der Prozess wird vollständig vom PHP-Code gesteuert. In dieser Form gibt es viele Möglichkeiten, den Timer zu implementieren. In diesem Artikel werden mehrere Methoden aufgeführt, um andere zu inspirieren:

  1. Verwenden Sie Frameworks wie swoole und workerman mit integrierten (hochpräzisen) Timern;

  2. Verwenden Sie die Multiprozess- (Pool-)/Multi-Thread-(Pool-)Technologie (pcntl, pthreads Erweiterungen sind nur im CLI-Modus verfügbar);

  3. Behandeln Sie Signale wie Tick oder Alarm;

  4. Verwenden Sie ereignisgesteuerte Bibliotheken wie libevent und libev; Fügen Sie eine Schleife hinzu oder implementieren Sie die Ereignisschleife selbst.

  5. Wenn Sie sich damit anlegen möchten, verwenden Sie selbst den 2-5-Plan. Wenn Sie sich nicht damit anlegen möchten, sind Frameworks wie sleep und

    möglich die erste Wahl, da sie stabil und zuverlässig sind.
Zusammenfassung

swooleUnterscheiden Sie die Beziehung zwischen HTTP-Anforderungen und Aufgaben und es ist einfach, geplante Aufgaben zu implementieren. Ob PHP zur Implementierung verwendet werden soll, ist eine andere Frage. Natürlich kann PHP als bevorzugte Sprache für die Webentwicklung geplante Aufgaben problemlos implementieren. workerman

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Klassenmodifikatoren und Zugriffsmodifikatoren von PHP

PHP verwendet einfach die Shmop-Funktion, um den gemeinsamen Speicher zu reduzieren Serverlast

Das obige ist der detaillierte Inhalt vonBeschreibung des PHP-Timers. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!