我需要锁定文件,读取数据,写入文件然后关闭它。我遇到的问题是我正在尝试为fopen找到正确的模式。
使用“a +” - 始终附加数据,“w +”在打开时截断所有数据,使用“x +” - 无法锁定文件。
这是我的代码:
$fh_task = fopen($task_file, 'w+');
flock($fh_task, LOCK_EX) or die('Cant lock '.$task_file);
$opt_line = '';
while(!feof($fh_task)){
$opt_line .= fread($fh_task, 4096);
}
$options = unserialize($opt_line);
$options['procceed']++;
rewind($fh_task);
fwrite($fh_task, serialize($options));
flock($fh_task, LOCK_UN);
fclose($fh_task);
答案 0 :(得分:7)
如果您使用的是较新版本的PHP,则需要'r+'
(或c+
。 r+
不会截断(c+
也不会),但仍允许您编写。
这是我上次使用这些功能时的摘录:
/*
if file exists, open in read+ plus mode so we can try to lock it
-- opening in w+ would truncate the file *before* we could get a lock!
*/
if(version_compare(PHP_VERSION, '5.2.6') >= 0) {
$mode = 'c+';
} else {
//'c+' would be the ideal $mode to use, but that's only
//available in PHP >=5.2.6
$mode = file_exists($file) ? 'r+' : 'w+';
//there's a small chance of a race condition here
// -- two processes could end up opening the file with 'w+'
}
//open file
if($handle = @fopen($file, $mode)) {
//get write lock
flock($handle,LOCK_EX);
//write data
fwrite($handle, $myData);
//truncate all data in file following the data we just wrote
ftruncate($handle,ftell($handle));
//release write lock -- fclose does this automatically
//but only in PHP <= 5.3.2
flock($handle,LOCK_UN);
//close file
fclose($handle);
}
答案 1 :(得分:2)
我相信你想要c+
。这类似于r+
,除了它将创建一个不存在的文件。如果您不想这样做,请改用r+
。打开文件后,根据需要使用flock()
。您也可以c+
打开阅读和写作。除此之外,我认为你可以使用相同的代码。
另一个答案是正确的,但是当c自动执行此操作时,他们会使用额外的步骤来确定使用r或w。
答案 2 :(得分:0)
在打开“任务”文件之前创建信号量文件 类似的东西:
if (($f_sem = @fopen($task_file.'.sem', 'x')))
{
//your code (with flock)
fclose($f_sem);
unlink($task_file.'.sem');
}