Heim  >  Artikel  >  Backend-Entwicklung  >  PHP implementiert Dateisperre und Prozesssperre

PHP implementiert Dateisperre und Prozesssperre

墨辰丷
墨辰丷Original
2018-05-18 15:46:312009Durchsuche

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

1. Dateisperre

  • flock()

  • fclose()

  • swoole_lock()

Die möglichen Anwendungsszenarien der Dateisperre sind:

1. Begrenzen Sie gleichzeitig mehrere Prozesse oder mehrere Server, die auf dieselbe Datei zugreifen und diese ändern müssen;

2. Warteschlangenbildung und künstliche Blockierung von Prozessen, die an Datei-E/A beteiligt sind;

3. Schützen Sie den Dateiinhalt in der Geschäftslogik;

Im Folgenden wird der Dateisperr-C/S-Kommunikationsmechanismus verwendet, der spezifische Kommunikationsprozess wurde weggelassen

Server (der Serverkommunikationsprozess entfällt):

//监听数据发送事件
$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 (der Serverkommunikationsprozess entfällt):

$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 Es wurde 30 Sekunden lang blockiert und die Datei wurde kein einziges Mal geschrieben, bis die Ausführung von Client1 endete

[l0.16@4 m29.5% c30s04] $ php swoole_client2.php

Es sollte beachtet werden, dass:

1. Sowohl flock() als auch swoole_lock() verfügen über einen Mechanismus zum automatischen Entsperren, wenn der Prozess endet, sodass er auch ohne manuelles Entsperren in der Demo normal ausgeführt werden kann, sodass sleep() im ersten Client ausgeführt wird . ) Halten Sie die Funktion an, um die Auswirkung der Dateisperre zu beobachten;

2. Die Standardfreigabemethode von flock() ist flock($file, LOCK_UN);, aber ich persönlich mag fclose() zukünftige Probleme vermeiden;

2. Prozesssperre

Im Gegensatz zur Dateisperre wird die Prozesssperre nicht verwendet, um E/A zu verhindern Dateien werden verwendet, um unerwartete Folgen durch die Parallelität mehrerer Prozesse zu verhindern. Daher ist es erforderlich, mehrere Prozesse in die Warteschlange zu stellen, wenn sie gleichzeitig ausgeführt werden, d. h. die logische Ausführung anderer gleichzeitiger Prozesse zu blockieren .

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 Fluss zu simulieren , und verwenden Sie dann die Beurteilung innerhalb des Prozesses. Ausführung der bedingten Steuerungslogik.

Demo zum nicht blockierenden Modell:

$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);
}

2. Verwenden Sie den gemeinsamen Speicher , Cache-Methode oder Kommunikationsmethode, die von swoole bereitgestellt wird. Nachdem der Prozess den Status der Variablen erhalten hat, verwendet er Beurteilungsbedingungen, um die Logikausführung zu steuern.

Es gibt viele Möglichkeiten, Variablen zu übergeben . Hier ist nur eine Idee, am Beispiel von Memcached; Hier ist Folgendes zu beachten:

1. Die Ablaufzeit von Memcached darf nicht kürzer sein als die tatsächliche Zeit der Programmausführung. Daher wird empfohlen, sie etwas länger zu halten und nach der Logikausführung wiederzuverwenden ist abgeschlossen;

2. Wenn im nicht blockierenden Modell festgestellt wird, dass der Status falsch ist, sollte der Prozess beendet oder blockiert werden, um die weitere Ausführung der Geschäftslogik zu vermeiden; 🎜>

3. In tatsächlichen Anwendungen ist es notwendig, eine Wiederholungszeit festzulegen, wodurch die Anzahl der zwischengespeicherten Anforderungen erheblich reduziert werden kann. Eine große Menge an E/A-Parallelität, wodurch der Serverdruck verringert wird 🎜>

Verwandte Empfehlungen:

PHP-Implementierung basierend auf
Dateisperre

Lösen Sie mehrere Prozesse, um eine Datei gleichzeitig zu lesen und zu schreiben



PHP

Dateisperre

Hohe Parallelität lösen

PHP verwendet Dateisperre Detaillierte Erläuterung der Schritte zur Lösung hoher Parallelität

Das obige ist der detaillierte Inhalt vonPHP implementiert Dateisperre und Prozesssperre. 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