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.";
}
答案 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,则结果未定义。