Heim  >  Artikel  >  Backend-Entwicklung  >  Eine kurze Einführung in PHP-Dateisperren und Prozesssperren

Eine kurze Einführung in PHP-Dateisperren und Prozesssperren

巴扎黑
巴扎黑Original
2017-09-03 11:56:372121Durchsuche

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 >

  • flock()

  • fclose()

  • swoole_lock()

Mögliche Anwendungsszenarien von Dateisperren sind:

1. Beschränkung gleichzeitiger Prozesse oder mehrerer Server, die auf dieselbe Datei zugreifen und diese ändern müssen;

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

Client2 (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));
});

Ergebnis:


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


Es ist zu beachten, dass:
$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
2


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

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.

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!

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