Heim > Artikel > Backend-Entwicklung > Wie kann man Parallelitätskonflikte bei der Ausführung von Crond-Skripten lösen?
Bei geplanten Aufgaben werden Sie gelegentlich wiederholte Ausführungen sehen:
Zum Beispiel die geplanten Aufgaben unseres Unternehmens:
*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testOne >/dev/null 2>&1*/2 * * * * root cd /opt/xxxx/test_S1/html/xxxx/admin; php index.php task testTwo >/dev/null 2>&1
Dies ist eine zweiminütige Ausführung einer Aufgabe Once garantiert nicht, dass jeder gestartete Prozess innerhalb von zwei Minuten vollständig abgeschlossen und geschlossen werden kann. Wenn sich weiterhin Prozesse ansammeln, sind möglicherweise die Systemressourcen erschöpft, was zu Systemausfällen führen kann.
Beispiel:
Erstellen Sie eine neue test.php-Datei mit dem folgenden Code:
<?php sleep(70);?>
Fügen Sie eine geplante Aufgabe hinzu:
*/1 * * * * root cd /home/ganjincheng;php test.php
Warten auf die Ausführung, Akkumulation erfolgt
root 26722 0.0 0.0 9232 1064 ? Ss 12:05 0:00 /bin/sh -c cd /home/ganjincheng;php test.php root 26744 0.0 0.0 112304 8840 ? S 12:05 0:00 php test.php root 29102 0.0 0.0 9232 1060 ? Ss 12:06 0:00 /bin/sh -c cd /home/ganjincheng;php test.php root 29116 0.1 0.0 112304 8840 ? S 12:06 0:00 php test.php root 29906 0.0 0.0 103320 904 pts/3 S+ 12:06 0:00 grep test.php
Diese eine Möglichkeit besteht darin, den Code zu transformieren. Fügen Sie die Beurteilung hinzu, ob eine Prozessausführung vorliegt. Zum Beispiel der folgende Code:
<?php $lockfile = '/tmp/mytest.lock'; if(file_exists($lockfile)){ exit(); } file_put_contents($lockfile, date("Y-m-d H:i:s")); sleep(70); unlink($lockfile); ?>
Bei dieser Methode zur Feststellung, ob eine Datei nicht vorhanden ist, besteht ein Problem. Das heißt, es ist möglich, dass das Programm nicht vollständig ausgeführt wurde, dh die zuvor erstellte Datei mytest.lock wurde nicht gelöscht. Dies führt dazu, dass das Programm in Zukunft nicht mehr ordnungsgemäß ausgeführt werden kann.
Die erste Lösung kann zur Schlüsselwertbeurteilung auf Redis und Memache übertragen werden.
Wenn die geplante Aufgabe darin besteht, auf die Datenbank zuzugreifen, können Sie Tabellensperrvorgänge durchführen. Gelegentlich können wir auch die Einzigartigkeit eindeutiger Indizes und gemeinsamer Indizes nutzen, um wiederholte Einfügungen zu vermeiden
Beispiel:
$fp = popen("ps aux | grep 'test.php' | wc -l", "r"); $proc_num = fgets($fp);if ($proc_num > 3) { //这里要注意为什么进程数要大于3,实际操作一遍你就明白了exit; } sleep(70);
Ein Nachteil dieser Methode besteht darin, dass der ps-Befehl genau geschrieben werden muss. Vermeiden Sie es, Prozesse zu zählen, die das test.php-Skript nicht ausführen. Zum Beispiel:
Wir öffnen die Datei test.php über vim. Dies führt dazu, dass der obige Befehl falsch zählt. Wenn wir also versehentlich die Datei test.php in vim öffnen, kann sie nicht ausgeführt werden.
Lassen Sie uns von Linux bei der Beurteilung helfen. Der Befehl flock stellt die Dateisperrfunktion bereit. Die Befehlsparameter lauten wie folgt:
[root@qkzj_Multi-Purpose_1A_113.107.248.124 ganjincheng]# flock -h flock (util-linux-ng 2.17.2) Usage: flock [-sxun][-w #] fd# flock [-sxon][-w #] file [-c] command... flock [-sxon][-w #] directory [-c] command... -s --shared Get a shared lock -x --exclusive Get an exclusive lock -u --unlock Remove a lock -n --nonblock Fail rather than wait -w --timeout Wait for a limited amount of time -o --close Close file descriptor before running command -c --command Run a single command string through the shell -h --help Display this text -V --version Display version
Konfigurationsbeispiel:
*/1 * * * * root flock -xn /tmp/mytest.lock -c 'php ./test.php'
Das obige ist der detaillierte Inhalt vonWie kann man Parallelitätskonflikte bei der Ausführung von Crond-Skripten lösen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!