Heim  >  Artikel  >  Datenbank  >  Eine Erläuterung der Anwendungsbeispiele für PHP-Flock

Eine Erläuterung der Anwendungsbeispiele für PHP-Flock

jacklove
jackloveOriginal
2018-06-09 11:04:432696Durchsuche

Beispiel zur PHP-Flock-Nutzung

bool flock ( resource $handle , int $operation [, int &$wouldblock ] )

flock()ermöglicht die Ausführung einer einfachen Funktion, die auf jedem verwendet werden kann Plattform Lese-/Schreibmodell (einschließlich der meisten Unix-Derivate und Windows)

Vor PHP 5.3.2 wurden Sperren durch fclose() freigegeben (wird automatisch aufgerufen). Nachdem das Skript beendet ist), müssen Sie jetzt

Vorgang

1. LOCK_SH Erhält eine gemeinsame Sperre (Leseprogramm)

2.LOCK_EX Erhält eine exklusive Sperre (Schreibprogramm)

3.LOCK_UNSperre freigeben (ob gemeinsam oder exklusiv)

4.LOCK_NBNicht gesperrt, wenn flock() blockiert

Beispiel 1: A verwendet eine exklusive Sperre, um die Datei zu schreiben, B liest die Datei und blockiert

a.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;w&#39;);
if(flock($fp, LOCK_EX)){            // 取得独占锁
    fwrite($fp, "Hello World\r\n"); // 写入数据
    sleep(10);                      // sleep 10秒,文件被锁定
    fwrite($fp, "Hello PHP\r\n");   // 写入数据
    flock($fp, LOCK_UN);            // 解锁
}
fclose($fp);
?>

b.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;r&#39;);
if(flock($fp, LOCK_SH)){ // 取得贡献锁
    while(!feof($fp)){
        echo fread($fp, 100);
    }
    flock($fp, LOCK_UN);
}
fclose($fp);
?>

Führen Sie eine erste aus. php, und führen Sie dann b.php aus

a, um die exklusive Sperre zu erhalten, b kann nur warten, bis a ausgeführt und die Sperre entsperrt ist, bevor b ausgeführt werden kann, Blockiert

Beispiel 2: A und B verwenden beide gemeinsame Sperren und blockieren nicht

a.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;r&#39;);
if(flock($fp, LOCK_SH)){ // 取得共享锁
    sleep(10);           // sleep 10秒
    while(!feof($fp)){
        echo fread($fp, 100);
    }
    flock($fp, LOCK_UN);
}
fclose($fp);
?>

b.php

6881d79e58a19bf081508955ca08811c

Führen Sie zuerst eine .php aus und dann b.php.

b kann den Dateiinhalt ausgeben, ohne auf den Abschluss der Ausführung von a warten zu müssen, nicht blockierend

Beispiel 3: Sowohl A als auch B verwenden exklusive Sperren zum Schreiben von Dateien und blockieren

a.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
if(flock($fp, LOCK_EX)){            // 取得独占锁
    fwrite($fp, "Hello World\r\n"); // 写入数据
    sleep(10);                      // sleep 10秒,文件被锁定
    fwrite($fp, "Hello PHP\r\n");   // 写入数据
    flock($fp, LOCK_UN);            // 解锁
}
fclose($fp);
?>

b.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
if(flock($fp, LOCK_EX)){                    // 取得独占锁
    fwrite($fp, "How Are You\r\n");         // 写入数据
    fwrite($fp, "Show Me The Money\r\n");   // 写入数据
    flock($fp, LOCK_UN);                    // 解锁
}
fclose($fp);
?>


Führen Sie zuerst a.php aus, dann führen Sie b.php aus

b muss warten, bis a ausgeführt wird, bevor Daten geschrieben werden, Blöcke

Beispiel 4: LOCK_NB blockiert nicht und wartet nicht, wenn es gesperrt ist

a.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
if(flock($fp, LOCK_EX)){            // 取得独占锁
    fwrite($fp, "Hello World\r\n"); // 写入数据
    sleep(10);                      // sleep 10秒,文件被锁定
    fwrite($fp, "Hello PHP\r\n");   // 写入数据
    flock($fp, LOCK_UN);            // 解锁
}
fclose($fp);
?>

b.php

<?php
$file = &#39;test.txt&#39;;
$fp = fopen($file, &#39;a&#39;);
if(flock($fp, LOCK_EX|LOCK_NB)){            // 取得独占锁
    fwrite($fp, "How Are You\r\n");         // 写入数据
    fwrite($fp, "Show Me The Money\r\n");   // 写入数据
    flock($fp, LOCK_UN);                    // 解锁
}else{
    echo &#39;file locked&#39;;
}
fclose($fp);
?>

Führen Sie zuerst a.php aus, Führen Sie dann b.php aus. b kann die exklusive Sperre nicht erhalten. Sie müssen nicht warten, bis die Ausführung abgeschlossen ist. Stattdessen wird direkt die Meldung zurückgegeben, dass die Sperre nicht erhalten werden kann.

Nicht blockierend

Zusammenfassung:

Gemeinsame Sperre verwenden

LOCK_SH

Wenn es liest, müssen Sie nicht warten, aber wenn es Enter schreibt, müssen Sie warten, bis der Lesevorgang abgeschlossen ist. Verwenden Sie die exklusive Sperre

LOCK_EX

, sowohl das Schreiben als auch das Lesen müssen warten.

LOCK_UN

, unabhängig davon, ob gemeinsam genutzte/lesbar belegte Sperren verwendet werden, müssen diese nach der Verwendung entsperrt werden.

LOCK_NB

blockiert im gesperrten Zustand nicht, sondern fordert zum Sperren auf. In diesem Artikel werden die Verwendungsbeispiele von PHP Flock erläutert. Weitere verwandte Inhalte finden Sie auf der chinesischen PHP-Website.

Verwandte Empfehlungen:

Erklärung der Ersetzungsmethode php str_replace für bestimmte Zeiten

Anweisungen zur Verwendung von header, headers_sent, headers_list, header_remove

Lösung zum Ändern des von der PDO-Abfrage MySQL zurückgegebenen Feld-Integer-Typs in String-Typ

Das obige ist der detaillierte Inhalt vonEine Erläuterung der Anwendungsbeispiele für PHP-Flock. 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