在一个网站上有一个文件。一个 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个调用引起了这个问题。如果有两个进程,其中一个正在写入文件,而另一个正在读取它,会发生什么?
对于这个问题,推荐的方法是什么?多个进程同时读取/写入同一个文件时,该如何管理文件修改?
file_get_contents()
可能会在前一个调用的数据有效刷新到文件之前被调用。您可能需要使用fflush()
和flock()
确保文件只被一个脚本处理一次。 - Havenardfile_get_contents()
返回的是字符串而不是FALSE
。 - Havenardfile_get_contents
有时可能会失败,建议使用empty()
进行检查。我还建议您尝试使用 curl。 - user3079266empty()
并不意味着失败,文件可能确实为空。请检查它是否为is_string()
或!== FALSE
。 - Havenard