In PHP -Skripten ist Ignore_User_abort (TRUE) eine sehr praktische Funktion, mit der das Skript die Ausführung fortsetzen kann, auch wenn der Client unterbrochen wird (z. B. der Benutzer schließt den Browser oder das Netzwerk getrennt). Diese Funktion ist besonders wichtig, wenn langlebige Aufgaben erledigt werden (z. B. Berichte, Stapel-Updates, Push-Benachrichtigungen usw.). Wenn es jedoch in Verbindung mit Datenbanktransaktionen verwendet wird, ist die Gewährleistung der Integrität und Konsistenz der Aufgabenausführung eine Herausforderung, die nicht ignoriert werden kann.
Der Zweck von ignore_user_abort (true) besteht darin, der PHP -Engine zu sagen, dass er "ignorieren, ob der Client getrennt ist" und das Skript weiter auszuführen. Standardmäßig beendet PHP die Skriptausführung, wenn er eine Client -Trennung erkennt, es sei denn, die Funktion wird ausdrücklich aufgerufen und True wird übergeben.
<span><span><span class="hljs-title function_ invoke__">ignore_user_abort</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">set_time_limit</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>); </span><span><span class="hljs-comment">// Lassen Sie die Skripte unbegrenzt ausgeführt werden</span></span><span>
</span></span>
set_time_limit (0) wird normalerweise damit verwendet, um zu verhindern, dass Skripte aufgrund von Zeitüberschreitungen brechen.
Datenbanktransaktionen können sicherstellen, dass eine Reihe von SQL-Vorgängen entweder erfolgreich oder alle fehlgeschlagen sind, was die sogenannte Atomizität ist. Ein weiteres wichtiges Merkmal einer Transaktion ist "Haltbarkeit", dh, sobald die Daten verpflichtet sind, werden die Daten dauerhaft gespeichert.
<span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-comment">// Eine Reihe von Datenbankvorgängen</span></span><span>
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>(); </span><span><span class="hljs-comment">// oder $db->rollBack();</span></span><span>
</span></span>
Wenn Sie Datenbanktransaktionen in einer langen Aufgabe verwenden, die möglicherweise unterbrochen werden kann, wird dies zu den folgenden Problemen führen, wenn sie versehentlich behandelt werden:
Die Verbindung wird nicht angeschlossen, ohne sich zu begehen <br> Wenn das Skript plötzlich nach dem Öffnen der Transaktion abbricht (wenn das Skript endet, weil der Benutzer es abnimmt, weil es Ignore_User_abort nicht festgelegt hat), werden die Vorgänge in der Transaktion automatisch von der Datenbank zurückgeführt, was dazu führt, dass der erwartete Vorgang nicht ausgeführt wird.
Logische Unterbrechung verursacht Inkonsistenz in den Geschäftsdaten <br> Die Skriptlogik basiert auf der Transaktion, um nachfolgende Operationen abzuschließen. Wenn es unerwartet unterbrochen wird, bevor die Transaktion begangen wird, kann sich der gesamte Geschäftszustand in einem "semi-vollständigen" Zustand befinden.
Hier sind einige praktische Strategien, um die Integrität der Aufgabenausführung bei der Verwendung ignore_user_abort zu Transaktionen mit der Datenbank zu gewährleisten:
<span><span><span class="hljs-title function_ invoke__">ignore_user_abort</span></span><span>(</span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">set_time_limit</span></span><span>(</span><span><span class="hljs-number">0</span></span><span>);
</span></span>
Diese beiden Codezeilen sollten vor Beginn der Aufgabenlogik ausgeführt werden, um sicherzustellen, dass das Skript aufgrund der Kundenentzündung oder der Zeitüberschreitung nicht unterbrochen wird.
Wickeln Transaktionen in einer Try/Catch -Struktur, um Rollbacks bei Ausnahmen sicherzustellen und sicherzustellen, dass die Daten nicht verschmutzt werden.
<span><span><span class="hljs-keyword">try</span></span><span> {
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">beginTransaction</span></span><span>();
</span><span><span class="hljs-comment">// Führen Sie datenbankbezogene Operationen durch</span></span><span>
</span><span><span class="hljs-title function_ invoke__">doSomething</span></span><span>();
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">commit</span></span><span>();
} </span><span><span class="hljs-keyword">catch</span></span><span> (</span><span><span class="hljs-built_in">Exception</span></span><span> </span><span><span class="hljs-variable">$e</span></span><span>) {
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">rollBack</span></span><span>();
</span><span><span class="hljs-title function_ invoke__">error_log</span></span><span>(</span><span><span class="hljs-string">"Transaktion fehlgeschlagen:"</span></span><span> . </span><span><span class="hljs-variable">$e</span></span><span>-></span><span><span class="hljs-title function_ invoke__">getMessage</span></span><span>());
}
</span></span>
Das Schreiben von Protokollen an Schlüsselknoten kann den Entwicklern helfen, zu verfolgen, ob die Aufgabenausführung abgeschlossen ist. Insbesondere das Schreiben von Protokollen an wichtigen Punkten vor und nach der Einreichung der Transaktion kann dazu beitragen, die Auswirkungen unerwarteter Unterbrechungen auf das Geschäft zu analysieren.
<span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-string">'/tmp/task.log'</span></span><span>, </span><span><span class="hljs-string">"Mission beginnt\n"</span></span><span>, FILE_APPEND);
</span><span><span class="hljs-comment">// ...</span></span><span>
</span><span><span class="hljs-title function_ invoke__">file_put_contents</span></span><span>(</span><span><span class="hljs-string">'/tmp/task.log'</span></span><span>, </span><span><span class="hljs-string">"Transaktionsübermittlung wird abgeschlossen\n"</span></span><span>, FILE_APPEND);
</span></span>
Führen Sie Statusfelder (wie Verarbeitung , Fertigstellung usw.) in lange Aufgaben ein, um eine wiederholte oder teilweise Ausführung von Aufgaben zu vermeiden.
<span><span><span class="hljs-comment">// 标记Mission beginnt处理</span></span><span>
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">"UPDATE tasks SET status = 'processing' WHERE id = <span class="hljs-subst">$taskId</span></span></span><span>");
</span><span><span class="hljs-comment">// Geschäftslogik ausführen...</span></span><span>
</span><span><span class="hljs-comment">// Markieren Sie die Aufgabeabschluss</span></span><span>
</span><span><span class="hljs-variable">$db</span></span><span>-></span><span><span class="hljs-title function_ invoke__">exec</span></span><span>(</span><span><span class="hljs-string">"UPDATE tasks SET status = 'done' WHERE id = <span class="hljs-subst">$taskId</span></span></span><span>");
</span></span>
Stellen Sie in Kombination mit Transaktionen sicher, dass staatliche Änderungen mit der Geschäftslogik übereinstimmen.
Bei "unvollendeten" Aufgaben, die durch unerwartete Interrupts verursacht werden, können Sie Datensätze in der Datenbank überprüfen, die nicht über ein zeitgesteuertes Skript aktualisiert wurden, und automatisch wiederholen oder Alarm.
Obwohl Ignore_User_abort die Möglichkeit bietet, ununterbrochene Aufgaben zu ununterbrochen, kann es die Integrität von Datenbankvorgängen allein nicht garantieren. Bei der Kombination des Transaktionsmechanismus ist es notwendig, die Geschäftskonsistenz und -herstellung auf verschiedene Weise wie Ausnahmeerfassung, Zustandsmanagement und Protokollverfolgung sicherzustellen. Nur ein vernünftiges und fehlertolerantes System kann stabile Geschäftsbetriebe angesichts instabiler Netzwerke oder unerwarteten Unterbrechungen aufrechterhalten.