2

由于服务器如何处理请求(-> PHP 脚本的同时请求),我有一个关于如果脚本检查文件名然后保存文件会发生什么的问题。

例如:用户 A 请求“save.php”。不久之后,用户 B 请求“save.php”。用户 A 的脚本位于脚本检查文件是否存在的位置。该文件不存在并且在写入文件之前,用户 B 的脚本处于检查文件是否存在的位置。所以它也说该文件不存在。现在用户 A 的脚本写入文件。如果文件名相同,用户 B 的脚本将覆盖该文件。(文件名是随机的,但这可能会发生)。

我怎样才能避免这样的事情?有没有类似 PHP 命令的 Tablelocking 和 Transactions 之类的东西?用户 B 的脚本是否有可能超过用户 A 的脚本,因为它从服务器获得了更多资源?

最好的祝福

4

2 回答 2

2

请看一下:

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_CREAT 标志。

'x+'

创建并打开阅读和写作;否则,它的行为与“x”相同。

于 2013-04-11T06:42:52.053 回答
2

如果您的 php 安装支持,请使用信号量:http: //be2.php.net/manual/en/ref.sem.php

或者你也可以检查flock() 函数: http ://be2.php.net/manual/en/function.flock.php

于 2013-04-11T07:09:01.317 回答