Heim  >  Artikel  >  Backend-Entwicklung  >  Wie kann man Parallelitätskonflikte bei der Ausführung von Crond-Skripten lösen?

Wie kann man Parallelitätskonflikte bei der Ausführung von Crond-Skripten lösen?

零下一度
零下一度Original
2017-06-23 14:31:501359Durchsuche

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

Lösung

Kontrollieren Sie zunächst die Parallelität im Code

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 = &#39;/tmp/mytest.lock&#39;;  
   
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.

Zweitens datenbankgesteuerte Parallelität

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

Die dritte Methode besteht darin, festzustellen, ob der Prozess vorhanden ist

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.

Die vierte Methode ist die Verwendung des Linux-Befehls flock

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!

Stellungnahme:
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