问题描述
|
我需要锁定文件,读取数据,写入文件,然后将其关闭。我遇到的问题是我正在尝试为fopen找到正确的模式。
使用\'a + \'-总是附加数据,使用\'x + \'时总是添加数据,而使用\'w + \'则截断所有数据-无法锁定文件。
这是我的代码:
$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);
解决方法
您需要
\'r+\'
(如果使用的是更新版本的PHP,则为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);
}
,我相信你要2英镑。除了将创建一个不存在的文件外,它与“ 3”类似。如果您不想这样做,请改用r+
。打开文件后,根据需要使用ѭ9。您也可以打开c+
进行读写。除此之外,我认为您可以使用相同的代码。
另一个答案是正确的,但是当c自动执行此操作时,他们正在使用额外的步骤来确定使用r或w。
,Frank Farmer的代码并不比您的好。在file_exists和fopen之间,其他进程可以对文件进行自己的操作。
在打开\'task \'文件之前,创建信号灯文件。
就像是:
if (($f_sem = @fopen($task_file.\'.sem\',\'x\')))
{
//your code (with flock)
fclose($f_sem);
unlink($task_file.\'.sem\');
}