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. sleep
Die 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?
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?
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);
Ü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
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:
Verwenden Sie Frameworks wie swoole
und workerman
mit integrierten (hochpräzisen) Timern;
Verwenden Sie die Multiprozess- (Pool-)/Multi-Thread-(Pool-)Technologie (pcntl
, pthreads
Erweiterungen sind nur im CLI-Modus verfügbar);
Behandeln Sie Signale wie Tick oder Alarm;
Verwenden Sie ereignisgesteuerte Bibliotheken wie libevent
und libev
; Fügen Sie eine Schleife hinzu oder implementieren Sie die Ereignisschleife selbst.
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
swoole
Unterscheiden 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
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!