gpt4 book ai didi

php - 关于PHP并行文件读/写

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:08:25 24 4
gpt4 key购买 nike

在网站上有一个文件。一个 PHP 脚本会像这样修改它:

$contents   = file_get_contents("MyFile");

// ** Modify $contents **

// Now rewrite:
$file = fopen("MyFile","w+");
fwrite($file, $contents);
fclose($file);

修改非常简单。它获取文件的内容并添加几行。然后它会覆盖该文件。

我知道 PHP 具有将内容附加到文件而不是重新覆盖它的功能。但是,我想继续使用这种方法,因为将来我可能会更改修改算法(因此追加可能还不够)。

无论如何,我正在对此进行测试,提出了大约 100 个请求。每次我调用脚本时,我都会在文件中添加一个新行:


第一次调用:

First!

第二次通话:

First!

Second!

第三次调用:

First!

Second!

Third!

很酷。但是然后:

第四次调用:

Fourth!

第五次通话:

Fourth!

Fifth!


如您所见,第一行、第二行和第三行就这样消失了。

我确定问题不是内容字符串修改算法(我已经单独测试过)。读取或写入文件时出现问题。

我认为问题很可能是在读取文件内容时出现的:如果 $contents 出于某种奇怪的原因为空,那么上面显示的行为是有道理的。

我不是 PHP 专家,但也许是我几乎同时执行了 100 个调用这一事实导致了这个问题。如果有两个进程,一个正在写入文件而另一个正在读取文件怎么办?

对于这个问题,推荐的方法是什么?当多个进程可以写入/读取同一个文件时,我应该如何管理文件修改?

最佳答案

您需要做的是使用 flock() (文件锁定)

我认为正在发生的事情是您的脚本正在抓取文件,而前一个脚本仍在写入文件。由于该文件仍在写入,因此在 PHP 抓取它时它不存在,因此 php 得到一个空字符串,一旦完成后续处理,它就会覆盖之前的文件。

解决方案是在文件被锁定时让脚本 usleep() 等待几毫秒,然后重试。请务必限制您的脚本可以尝试的次数。

注意:

如果另一个 PHP 脚本或应用程序访问该文件,它不一定会使用/检查文件锁。这是因为文件锁通常被视为可选的额外功能,因为在大多数情况下不需要它们。

关于php - 关于PHP并行文件读/写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25416792/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com