PHP fopen(x flag)保证只运行一次?

时间:2013-03-09 03:25:03

标签: php web-applications locking mutex fopen

PHP允许我们在执行fopen时使用x标志:

  

创建并仅供写作;将文件指针放在   文件的开头。

     

如果文件已存在,则调用fopen()   将返回FALSE 并生成级别错误   E_WARNING。

     

如果文件不存在,请尝试创建它。这是   相当于为底层指定O_EXCL | O_CREAT标志   open(2)系统调用。

这是否意味着无论我们有多少并发fopen请求(来自不同用户),保证文件只会被创建一次并且永远不会被覆盖?

if ($handle = fopen("part006", "x+b")) {
    do_some_processing();
    echo "You managed to process.";
    /*

    can we guarantee that only 1 user (http request)
    will ever process the function and see the
    message "you managed to process" ?

    */
} else {
    echo "You failed to process.";
}

1 个答案:

答案 0 :(得分:1)

答案:只要其他进程也使用O_EXCL,就可以保证文件只创建一次并且永远不会被覆盖。如果不这样做,则可以覆盖该文件。因此,使用O_EXCL打开(创建)文件意味着,该文件在某种程度上写保护

说明:fopen使用基础open系统调用。从手册页:man 2 open

  

O_EXCL

     

如果设置了O_CREAT和O_EXCL,则如果文件存在,open()将失败。检查文件是否存在以及文件的创建(如果不存在)对于执行open()的其他线程应该是原子的,在O_EXCL和O_CREAT设置的同一目录中命名相同的文件名。如果设置了O_EXCL和O_CREAT,并且路径名称为符号链接,则open()将失败并将errno设置为[EEXIST],而不管符号链接的内容如何。如果设置了O_EXCL且未设置O_CREAT,则结果未定义。