Fopen,fread和flock

| 我需要锁定文件,读取数据,写入文件,然后将其关闭。我遇到的问题是我正在尝试为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\');
}
    

要回复问题请先登录注册