由于服务器处理请求的方式(->并发请求的PHP脚本),我有一个问题,可能会发生什么,如果一个脚本检查文件名,然后保存文件。
例如:用户A请求"save.php"。很短的时间后,用户B请求"save.php"。用户A的脚本位于脚本检查文件是否存在的位置。该文件不存在,并且在写入文件之前,用户B的脚本处于检查文件是否存在的位置。所以它也说这个文件不存在。现在用户A的脚本编写该文件。如果用户B的脚本具有相同的文件名,则会覆盖该文件。(文件名是随机的,但这是可能发生的)。
我怎样才能避免这样的事情?php命令有表锁和事务之类的东西吗?是否有可能用户B的脚本超过用户A的脚本,因为它从服务器获得更多的资源?
请看:
http://www.php.net/manual/en/function.fopen.php在创建文件时需要使用排他锁,如下所示:
$handle = fopen("/home/somewhere/yourfile.txt", "x");
当您这样做时,对文件的二次访问尝试(用户B, C)将返回false并生成警告,因为该文件是由用户a创建并独占锁定的。
一旦文件创建,file_exists将为true,但是其他用户不能打开它,因为它将以独占锁定状态创建。
当用户A完成他/她的工作时,后面的调用可以访问文件
模式x和x+的手动输入如下:
"x"创建并打开仅用于写入;将文件指针放在文件的开头。如果文件已经存在,fopen()调用将返回FALSE并生成E_WARNING级别的错误,从而失败。如果该文件不存在,请尝试创建它。这相当于为底层的open(2)系统调用指定O_EXCL| o_create标志。
"x +"
创建并开放读写;否则它和x的行为是一样的。
如果php安装支持,请使用信号量:http://be2.php.net/manual/en/ref.sem.php
或者你也可以检查flock()函数:http://be2.php.net/manual/en/function.flock.php