Php 这个文件操作真的是“吗?”;原子的;及;“安全”吗;?如果没有,我如何才能做到这一点?

Php 这个文件操作真的是“吗?”;原子的;及;“安全”吗;?如果没有,我如何才能做到这一点?,php,file,io,touch,atomic,Php,File,Io,Touch,Atomic,我有一个函数,它应该根据输入文件路径返回一个唯一的文件名。例如,如果用户发送C:\meow\bark.txt,并且C:\meow\bark.txt已经存在,则返回C:\meow\bark\u 1.txt,或者如果\u 1已经存在,则返回\u 2,以此类推 该功能的关键部分目前如下所示: if (!file_exists($candidate_file_path)) { if (touch($candidate_file_path)) return $candidate_f

我有一个函数,它应该根据输入文件路径返回一个唯一的文件名。例如,如果用户发送
C:\meow\bark.txt
,并且
C:\meow\bark.txt
已经存在,则返回
C:\meow\bark\u 1.txt
,或者如果
\u 1
已经存在,则返回
\u 2
,以此类推

该功能的关键部分目前如下所示:

if (!file_exists($candidate_file_path))
{
    if (touch($candidate_file_path))
        return $candidate_file_path;
}
也就是说,如果“候选”文件不存在,并且可以创建(“触摸”),那么将其作为唯一的文件路径返回似乎是安全的

然而,我对此不太确定。我担心的是,同时运行的其他一些脚本也试图在同一个目录中同时分配一个同名文件。如果脚本A当前在第一个If中,并且即将“触摸”其候选对象,而脚本B刚刚已经这样做了,那么脚本A仍将有其
touch()
return
true
,因为它只是为文件设置文件系统元数据,这就是它返回为“true”/successful的内容。因此,在这种情况下,无论多么不可能,我最终都会认为这两个脚本具有相同的“唯一”文件路径

这显然是造成灾难的原因,和我不久前的数据库“事务”噩梦惊人地相似

虽然我模糊地意识到“独占文件锁”的概念,但我必须诚实地说:无论我读了多少关于它的书,并在过去尝试将其用于其他事情,我永远也不知道如何使用。如果你能想出一些方法使这个操作“原子化”,或者简单地用一些我甚至不知道存在的其他函数替换
touch
调用,那会对我很有帮助吗


我应该注意的是,PHP函数
是可写的
在过去给我带来了严重的问题,根据我自己的内部评论,这让我停止使用它。如果可以避免这种情况,那也不错。

这种操作不是原子操作,也不安全


但是有一种方法可以让您创建一个文件,该文件保证不存在,方法是使用手册中记录的
'x'
(或
'x+'
,用于添加阅读)模式。

请告诉我这种方法(在我的代码上下文中)。只需将特定的文件路径作为第一个参数,将
'x'
作为模式,它将创建一个新文件,并仅当该文件不存在时才将该缓冲区返回给您,如果该文件不存在,则fopen将返回false。