Heim > Artikel > Backend-Entwicklung > Grundlegender Schutz vor maximaler Ausführungszeit
Jeder, der sich mit dem Import oder Export von Daten beschäftigt hat, ist wahrscheinlich auf das Problem gestoßen, dass ein Skript eine kurze Ausführungszeit hat. Die schnellste Lösung besteht oft darin, die PHP-Konfiguration anzupassen oder das Limit am Anfang des Skripts vollständig zu deaktivieren. Allerdings birgt eine deutliche Verlängerung der Ausführungszeit oder deren vollständige Deaktivierung Sicherheitsrisiken. Ein unaufhaltsames Hintergrundskript kann zu einem übermäßigen Ressourcenverbrauch führen.
Bei der Verarbeitung von Aufgaben über Iterationen hinweg ist es möglich, einzelne Durchläufe rechtzeitig zu überwachen und zu versuchen, die Ausführung ordnungsgemäß zu beenden, bevor das Zeitlimit abläuft.
// initialize basic variables for further work $maxExecutionTime = (int)ini_get('max_execution_time'); $estimateCycleTime = 0; $startTime = microtime(true); // For demonstration purposes, we use an "infinite" loop with a simulated task lasting 10 seconds while (true) { sleep(10); // Calculate the current runtime $currentRunTime = microtime(true) - $startTime; // Termination can be done either with a fixed constant // or by measuring the time of one pass and trying to use // the longest possible segment of the runtime // limit (has its problem). if ($estimateCycleTime === 0) { $estimateCycleTime = $currentRunTime; } // Check if the iteration stop time is approaching. // Subtract the time of one pass, which likely won't fit // within the window. if (($maxExecutionTime - $estimateCycleTime) < $currentRunTime) { echo 'Time is end'; break; } }
Eine vorzeitige Beendigung auf Basis der Berechnung eines Durchgangs eignet sich für Fälle, in denen eine große Anzahl von Durchgängen in möglichst wenigen neuen Ausführungen abgearbeitet werden muss und jeder Vorgang in einem Durchgang ähnlich zeitaufwändig ist. Unterscheiden sich einzelne Durchgänge in ihrem Zeitbedarf, muss ein Koeffizient zur Durchlaufzeit addiert werden. Eine andere Möglichkeit besteht darin, eine vordefinierte Zeit zu verwenden:
$beforeEndTime = 1; if (($maxExecutionTime - $beforeEndTime) < $currentRunTime) { echo 'Time is end'; break; }
Wenn das Skript nach der Iteration fortgesetzt wird, z. B. das Schließen von Verbindungen zu API-Endpunkten, das Schließen von Dateien oder das Ausführen anderer Vorgänge, ist es wichtig, daran zu denken, diese Zeit hinzuzufügen.
Das obige ist der detaillierte Inhalt vonGrundlegender Schutz vor maximaler Ausführungszeit. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!