Heim > Artikel > Backend-Entwicklung > Beispielanalyse der PHP-Dateisperre und Prozesssperre
Angesichts der vorherigen Einführung von Swoole verwenden wir den Server-/Client- und Multiprozessmechanismus, um die Sperre zu erläutern. In diesem Artikel werden hauptsächlich Anwendungsbeispiele für die PHP-Dateisperre und die Prozesssperre erläutert von PHP. Da SQL-Sperren in ihrer Wirkungsweise und Anwendungsszenarien unterschiedlich sind, hoffe ich, dass sie jedem helfen können.
1. Dateisperre
flock()
fclose()
swoole_lock()
Mögliche Anwendungsszenarien der Dateisperre sind:
1. Begrenzen Sie gleichzeitig mehrere Prozesse oder mehrere Server, die auf dieselbe Datei zugreifen und diese ändern müssen;
2. An der Datei-E/A beteiligte Prozesse in die Warteschlange stellen und künstlich blockieren;
3. Dateiinhalte in der Geschäftslogik schützen;
Das Folgende ist die Verwendung des Dateisperr-C/S-Kommunikationsmechanismus, der spezifische Kommunikationsprozess wurde weggelassen
Server (der Serverkommunikationsprozess wurde weggelassen):
//监听数据发送事件 $serv->on('receive', function ($serv, $fd, $from_id, $data) { $serv->send($fd, "ServerEnd"); $p_file = "locktest.txt"; var_dump(file_get_contents($p_file)); });
Client1 (Server Kommunikationsprozess weggelassen):
$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();
Client2 (Serverkommunikationsprozess weggelassen):
$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();
Ergebnis:
Client2 ist 30s lang blockiert, die Datei ist nicht einmal geschrieben, bis die Ausführung von Client1 endet; Mechanismus zum automatischen Entsperren, wenn der Prozess endet, sodass er auch ohne manuelles Entsperren in der Demo normal ausgeführt werden kann. Daher wird die Funktion „sleep() pause“ im ersten Client ausgeführt, um die Auswirkung der Dateisperre zu beobachten >
2. Die Standardfreigabemethode von flock() ist flock($file,LOCK_UN);, aber ich persönlich mag fclose(), um zukünftige Probleme zu vermeiden;[l0.16@4 m29.5% c30s04] $ php swoole_client2.phpProzesssperre
Im Gegensatz zu Dateisperren werden Prozesssperren nicht verwendet, um E/A-Vorgänge in Dateien zu verhindern, sondern um unerwartete Folgen durch die Parallelität mehrerer Prozesse zu verhindern. Daher müssen sie verwendet werden, wenn mehrere Prozesse gleichzeitig ausgeführt werden. Warteschlange bedeutet, dass die Logikausführung anderer gleichzeitiger Prozesse blockiert wird, bevor die Schlüssellogikausführung eines Prozesses endet.
Es gibt mehrere Implementierungsideen:
2. Verwenden Sie Swoole, um einen gemeinsamen Speicher, eine Caching-Methode oder eine Kommunikationsmethode bereitzustellen, um eine globale Variable in verschiedenen Prozessen zu übertragen. Nachdem der Prozess den Status der Variablen erhalten hat, verwendet er Beurteilungsbedingungen, um die Logikausführung zu steuern Variablen übertragen. Hier ist nur eine Idee.
Demo zum Blockieren: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); }1. Die Ablaufzeit von Memcached ist kürzer als die tatsächliche Zeit, die das Programm ausführt. Es wird daher empfohlen, etwas länger zu sein und nach Abschluss der Logikausführung wiederzuverwenden >2. Wenn der Status im nicht blockierenden Modell als falsch beurteilt wird, sollte der Prozess beendet oder blockiert werden, um die weitere Ausführung der Geschäftslogik zu verhindern. Es ist notwendig, eine Wiederholungszeit festzulegen, die den großen Umfang der E/A-Parallelität für Memcached erheblich reduzieren kann. Reduzieren Sie den Serverdruck;
// 初始化memcached $memcached = new Memcache; $memcached->connect("localhost", 11211); // 获取用来做状态判定的全局变量 $s_flag = $memcached->get("flag"); if (!$s_flag) { // 这里利用了memcached的过期时间作为演示,实际上业务处理完成后销毁该变量即可 $memcached->set("flag", "locked", 0, 10); main(); } else { // 阻塞模型 while ($s_flag == 'locked') { var_dump('Process locked, retrying...'); // 设置重试时间, 避免过于频繁的操作尝试 sleep(1); // 更新状态变量 $s_flag = $memcached->get("flag"); } // // 非阻塞模型 // if ($s_flag == 'locked') { // var_dump('Process locked, suspended'); // die(); // } main(); } // 模拟业务主函数 function main() { var_dump('Process Running'); // 业务执行结束后回收memcached // $memcached->delete("flag"); }
Detaillierte Erläuterung von Dateisperren, Mutex-Sperren und Lese-/Schreibsperren in PHP
Eine kurze Einführung in PHP-Dateisperren und Prozesssperren
Das obige ist der detaillierte Inhalt vonBeispielanalyse der PHP-Dateisperre und Prozesssperre. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!