【问题标题】:What's the most efficient way to read from and then overwrite file contents in php?在php中读取然后覆盖文件内容的最有效方法是什么?
【发布时间】:2015-10-09 23:50:25
【问题描述】:

我想将文件读入字符串,修改内容并将处理后的字符串写回文件。 此外,对服务器的另一个请求可能开始得太早,并尝试在第一个文件通过之前写入相同的文件 - 这绝不会发生(到目前为止我正在使用羊群) - 如果脚本会阻塞直到锁被释放。

这是一种不完整的方法

$h = fopen($fp, 'a+');
flock($h, LOCK_EX);
$oTxt = '';
while (!feof($file)) {
    $oTxt .= fread($h, 8192);
}
rewind($h);
ftruncate($h, 0)
fwrite($h, );    // process contents and write it back
flock($h, LOCK_UN);
fclose($h);

注意:这个问题与What's the best way to read from and then overwrite file contents in php? 非常相似(在我的情况下,它是一个 json 文件,我想解码、插入或编辑某个节点,然后再次对其进行编码)但它不是重复的。

【问题讨论】:

  • 您正在处理 json 的事实似乎不足以将您的问题与您引用的问题区分开来。还有哪些其他区别?
  • 问题基本相同。另一个问题的问题是没有一个答案是好的,因为它们并没有真正解决锁定问题。
  • 另请注意,不同之处在于我不希望解决方案是“最干净”但最有效的。

标签: php fwrite fread flock


【解决方案1】:

您可以将while 循环替换为对stream_get_contents 的一次调用。并且你应该使用模式r+来读写文件; a+ 将在您启动时将流定位在文件末尾,因此不会有任何内容可供读取。

$h = fopen($fp, 'r+');
flock($h, LOCK_EX);
$oTxt = stream_get_contents($h);
// Process contents
rewind($h);
ftruncate($h, 0);
fwrite($h, $oTxt); 
flock($h, LOCK_UN);
fclose($h);

【讨论】:

  • thx,我没有使用 a+(复制粘贴错误)但是 w+,这也是错误的 ^^ 我会试一试 :)
  • 但是如果flock返回false怎么办?
  • 您可以添加错误检查。您还应该检查 fopen() 是否返回 false。如果您有权以写入模式打开文件,我想不出flock 会失败的原因。
  • 我已经在我的实际代码中检查了所有这些(只是把它留在这里以提高可读性)但是有没有一种内置的方法可以使羊群阻塞?还是我必须自己写,包括超时? (你必须爱 php ... -.-)
  • 默认是阻塞的,你必须使用LOCK_NB使它成为非阻塞的。
猜你喜欢
  • 2011-10-30
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
  • 2013-05-29
  • 1970-01-01
  • 2019-11-28
相关资源
最近更新 更多