Heim > Artikel > Backend-Entwicklung > Detaillierte Erläuterung der Anwendungsbeispiele für Dateisperren und Prozesssperren in PHP
In diesem Artikel werden hauptsächlich Anwendungsbeispiele für PHP-Dateisperren und Prozesssperren vorgestellt. Der Herausgeber findet sie recht gut, daher werde ich sie jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor, um einen Blick darauf zu werfen.
Angesichts der vorherigen Einführung von Swoole verwenden wir den Server/Client- und Multiprozessmechanismus von Swoole, um die Sperre zu erklären.
Dies gilt nur für PHP. Da sich SQL-Sperren in ihren Wirkungsweisen und Anwendungsszenarien unterscheiden, werden sie separat erläutert
1 >
2. Beteiligte Dateien I Prozesswarteschlange und künstliche Blockierung von /O;
3. Bewachen Sie den Dateiinhalt in der Geschäftslogik;
Das Folgende ist die Datei C/S-Kommunikationsmechanismus sperren Der spezifische Kommunikationsprozess wurde für die Verwendung von):
//监听数据发送事件 $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, "ServerEnd"); $p_file = "locktest.txt"; var_dump(file_get_contents($p_file)); });Ergebnis:
$s_recv = "ww"; $p_file = "locktest.txt"; $o_file = fopen($p_file,'w+'); // flock()加锁方式: flock($o_file,LOCK_EX); // // swoole加锁方式: // $lock = new swoole_lock(SWOOLE_FILELOCK, $p_file); // $lock->lock(); fwrite($o_file, 'ss' . $s_recv); sleep(30); // 两种解锁方式 // flock($o_file, LOCK_UN); // $lock->unlock();
$s_recv = "xx"; $p_file = "locktest.txt"; $o_file = fopen($p_file,'w+'); // flock()加锁方式: flock($o_file,LOCK_EX); // // swoole加锁方式: // $lock = new swoole_lock(SWOOLE_FILELOCK, $p_file); // $lock->lock(); fwrite($o_file, 'ss' . $s_recv); // 两种解锁方式 // flock($o_file, LOCK_UN); // $lock->unlock();
1. Unabhängig davon, ob es sich um flock() oder swoole_lock() handelt, gibt es einen Mechanismus zum automatischen Entsperren, wenn Der Prozess endet, sodass er auch ohne manuelles Entsperren in der Demo normal ausgeführt werden kann. Hier ist das Kapitel: Ein Client führt die Pausenfunktion „sleep()“ aus, um die Auswirkung der Dateisperre zu beobachten.
2. Die Standard-Release-Methode von flock() ist flock($file, LOCK_UN);, aber ich persönlich mag fclose(), es verursacht nie zukünftige Probleme
[l0.16@4 m29.5% c30s04] $ php swoole_client2.php2
Im Gegensatz zur Dateisperre wird die Prozesssperre nicht zum Verhindern von E/A-Vorgängen bei Dateien verwendet, um unerwartete Folgen durch die Parallelität mehrerer Prozesse zu verhindern. Daher ist es notwendig, mehrere in die Warteschlange zu stellen Prozesse, wenn sie gleichzeitig sind, d. h. andere gleichzeitige Prozesse blockieren, bevor die Schlüssellogikausführung eines Prozesses endet
Es gibt mehrere Implementierungsideen:
1. Verwenden Sie die Dateisperre flock(), um eine temporäre Sperrdatei zu erstellen, und verwenden Sie LOCK_NB, um einen blockierenden oder nicht blockierenden Stream zu simulieren, und verwenden Sie dann Beurteilungsbedingungen, um die Logikausführung innerhalb des Prozesses zu steuern. Nicht blockierendes Modell Demo:
2. Verwenden Sie den von swoole bereitgestellten gemeinsamen Speicher. Die Cache-Methode oder Kommunikationsmethode überträgt eine globale Variable in verschiedene Prozesse, nachdem der Prozess den Status erhalten hat der Variablen werden Beurteilungsbedingungen verwendet, um die Logikausführung zu steuern. Es gibt viele Möglichkeiten, Variablen zu übertragen. Dies ist nur eine Idee, die als Beispiel dient Modelldemo:
Was hier beachtet werden muss, ist:
$p_file = "locktest.txt"; $o_file = fopen($p_file, 'w+'); // 如果临时文件被锁定,这里的flock()将返回false if (!flock($o_file, LOCK_EX + LOCK_NB)) { var_dump('Process Locked'); } else { // 非阻塞模型必须在flock()中增加LOCK_NB参数 // 当然,这里取消LOCK_NB参数就是阻塞模型了 flock($o_file, LOCK_EX + LOCK_NB); var_dump('Process Locking'); // 模拟长时间的执行操作 sleep(10); }
1 memcached kann nicht kürzer sein als die tatsächliche Laufzeit des Programms, daher wird empfohlen, etwas länger zu sein und nach Abschluss der Logikausführung wiederzuverwenden
2 Im nicht blockierenden Modell, wenn der Status Wird als falsch beurteilt, sollte der Prozess beendet oder blockiert werden, um die weitere Ausführung der Geschäftslogik zu verhindern.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Anwendungsbeispiele für Dateisperren und Prozesssperren in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!