在php中编辑公共临时文件以防止冲突

时间:2014-02-07 10:50:40

标签: php file-access

我希望有一个不时更新的临时文件。 我想做的是:

<!-- language: lang-php -->
// get the contents
$s = file_get_contents( ... );

// does it need updating?
if( needs_update() )
{
    $s = 'some new content';
    file_put_contents( ... );
}

我可以看到的问题是,无论条件导致'needs_update()'返回true,都可能导致多个进程在(几乎)同时更新同一个文件。

在理想的情况下,我会有一个进程更新文件,并阻止所有其他进程读取文件,直到我完成它。

因此,只要'needs_update()'返回true,我就会阻止其他进程读取文件。

<!-- language: lang-php -->
// wait here if anybody is busy writing to the file.
wait_if_another_process_is_busy_with_the_file();

// get the contents
$s = file_get_contents( ... );

// does it need updating?
if( needs_update() )
{
    // prevent read/write access to the file for a moment
    prevent_read_write_to_file_and_wait();

    // rebuild the new content
    $s = 'some new content';
    file_put_contents( ... );
}

这样,只有一个进程可能会更新文件,文件将全部获取最新值。

关于如何防止这种冲突的任何建议?

谢谢

FFMG

1 个答案:

答案 0 :(得分:0)

您正在寻找鸡群功能。只要访问文件的每个人都使用它,flock就会工作。 php手册中的示例:

$fp = fopen("/tmp/lock.txt", "r+");

if (flock($fp, LOCK_EX)) {  // acquire an exclusive lock
    ftruncate($fp, 0);      // truncate file
    fwrite($fp, "Write something here\n");
    fflush($fp);            // flush output before releasing the lock
    flock($fp, LOCK_UN);    // release the lock
} else {
    echo "Couldn't get the lock!";
}

fclose($fp);

手动:http://php.net/manual/en/function.flock.php