Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 锁是怎么工作的?_Php_Flock - Fatal编程技术网

Php 锁是怎么工作的?

Php 锁是怎么工作的?,php,flock,Php,Flock,我正在学习PHP中的flock mecanism,我很难理解LOCK_SH模式的功能。我在一个网站上读到,它会锁定文件,以便其他脚本无法在其中写入,但它们可以从中读取。但是,以下代码似乎没有按预期工作:在file1.php中,我有: $fp = fopen('my_file.txt','r'); flock($fp, LOCK_SH); sleep(20); flock($fp, LOCK_UN); 在file2.php中,我有 $fp = fopen('my_file.txt','a');

我正在学习PHP中的flock mecanism,我很难理解LOCK_SH模式的功能。我在一个网站上读到,它会锁定文件,以便其他脚本无法在其中写入,但它们可以从中读取。但是,以下代码似乎没有按预期工作:在file1.php中,我有:

$fp = fopen('my_file.txt','r');

flock($fp, LOCK_SH);
sleep(20);
flock($fp, LOCK_UN);
在file2.php中,我有

$fp = fopen('my_file.txt','a');
fwrite($fp,'test');
我运行第一个脚本,将文件锁定20秒。锁定到位后,我运行file2.php,它立即完成它的执行,之后,当我打开'my_file.txt'时,字符串'test'被附加到它后面(尽管'file1.php'仍在运行)。我尝试更改'file2.php',这样它就可以从锁定的文件中读取,并从中读取,而不会出现任何问题。所以 显然地“锁紧”接缝根本不起作用。但是,如果我使用LOCK_EX yes,它会锁定文件,没有脚本可以写入或读取文件。我正在使用Easy PHP,并在windows 7下运行它。

flock()
实现建议锁定,而不是强制锁定。为了使
file2.php
file1.php
的锁阻止,它需要在写入之前尝试获取文件上的write
(lock_EX)

锁是指共享锁。任何数量的进程都可能有一个共享的 同时锁定。它通常被称为读卡器锁

LOCK_EX表示独占锁。只有一个进程可以拥有一个 一次对给定文件的独占锁定

如果文件已在另一个进程中用LOCK_SH锁定,请 有了锁,她就会成功。带锁的羊群将阻塞,直到所有 读卡器锁已被释放


我们使用锁来读取文件。 如果此时有东西写入此文件此类型阻塞等待完成操作写入,然后解锁,我们可以读取。
如果此文件中没有写入的内容被锁定,请不要设置

 <?php ## Модель процесса-читателя
    $file = "file.txt";
    // Вначале создаем пустой файл, ЕСЛИ ЕГО ЕЩЕ НЕТ.
    // Если же файл существует, это его не разрушит.
    fclose(fopen($file, "a+b"));
    // Блокируем файл
    $f = fopen($file, "r+b") or die("Не могу открыть файл!");
    flock($f, LOCK_SH); // ждем, пока не завершится писатель
    // В этой точке мы можем быть уверены, что в файл
    // никто не пишет
    // Все сделано. Снимаем блокировку.
    fclose($)

我现在明白了。我已经测试了你解释的机制,它工作没有问题。你是最好的。哇,你是如何找到10年前的评论的:D?谢谢你,谢尔_LOCK@Adam有这样的笑话,我敢打赌你是一个很好的爸爸,说实话,谷歌翻译是最好的