Heim  >  Artikel  >  Backend-Entwicklung  >  Beispielanalyse der PHP-Dateisperre und Prozesssperre

Beispielanalyse der PHP-Dateisperre und Prozesssperre

小云云
小云云Original
2018-01-30 10:41:281647Durchsuche

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.php

Prozesssperre


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:

1. Verwenden Sie die Dateisperre flock(), um eine temporäre Dateisperre zu erstellen Sperrdatei, verwenden Sie LOCK_NB, um einen blockierenden oder nicht blockierenden Fluss zu simulieren, und verwenden Sie dann Beurteilungsbedingungen, um die Logikausführung innerhalb des Prozesses zu steuern

Demo des nicht blockierenden Modells:

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;


Verwandte Empfehlungen:

// 初始化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


Vergleichen Sie die Unterschiede zwischen Dateisperren und Prozesssperren in PHP


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!

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