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)); });
$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.php
Im Gegensatz zur Dateisperre wird die Prozesssperre nicht zum Verhindern von E/A für Dateien verwendet, um unerwartete Folgen durch die Parallelität mehrerer Prozesse zu verhindern. Daher ist es notwendig, mehrere Prozesse in die Warteschlange zu stellen 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 :
2. Verwenden Sie den von swoole bereitgestellten gemeinsamen Speicher, die Caching-Methode oder die Kommunikationsmethode überträgt eine globale Variable in verschiedene Prozesse, nachdem der Prozess den Status erhalten hat Für die Variablen werden Beurteilungsbedingungen verwendet, um die Logikausführung zu steuern. Es gibt viele Möglichkeiten, Variablen zu übertragen, wie folgt:Blockierung Modelldemo:
Was hier beachtet werden muss:
$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); }
3. In praktischen Anwendungen ist es erforderlich, eine Wiederholungszeit festzulegen sehr praktisch Reduzieren Sie eine große Menge an E/A-Parallelität für Memcached und reduzieren Sie den Serverdruck;
Das obige ist der detaillierte Inhalt vonEine kurze Einführung in PHP-Dateisperren und Prozesssperren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!