2015-07-20 39 views
1

我想将文件读入字符串,修改内容并将处理后的字符串写回文件。 此外,对服务器的另一个请求可能会启动得太早,并尝试在第一次通过之前写入相同的文件 - 这绝不会发生(目前为止,即使使用flock) - 如果脚本将被阻塞,锁被释放。什么是最有效的方式来读取,然后覆盖在PHP文件内容?

这是某种残缺办法

$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文件,我想解码,插入或编辑某个节点,然后再次对其进行编码)但它不是重复的。

+0

事实上,你正在处理json似乎不足以区分你的问题和你引用的问题。其他的一些区别是什么? – gymbrall

+1

问题基本相同。其他问题的问题是没有一个答案是好的,因为他们没有真正解决锁定问题。 – Barmar

+0

请注意,不同之处在于,我不希望解决方案成为“最干净”但效率最高的解决方案。 – IARI

回答

2

您可以用stream_get_contents的单一呼叫替换while循环。您应该使用模式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); 
+0

thx,我没有使用+(copypaste错误),但w +,这是错误的^^ 我会给这个镜头:) – IARI

+0

但如果flock返回false? – IARI

+0

您可以添加错误检查。你还应该检查'fopen()'是否返回false。如果你有权在写模式下打开文件,我想不出为什么'flock'会失败。 – Barmar

相关问题