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\');
}
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...