2

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

创建和开放仅用于写作;将文件指针放在文件的开头。

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

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

这是否意味着无论我们(来自不同用户)有多少并发 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.";
}
4

1 回答 1

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,则结果未定义。

于 2013-03-09T03:58:20.913 回答