我有以下代码:
function lock() {
if($lock = @fopen('lock.txt', 'x')) {
fwrite($lock, getmypid());
fclose($lock);
return true;
}
else {
return false;
}
}
$response = lock();
当我运行代码时,会创建文件lock.txt并将PID放入文件中。但是,该函数返回false。世界上到底发生了什么?
我需要X
表示fopen,因为我正在使用此函数进行文件锁定和控制
我关掉了@
,这是我得到的错误:
fopen(lock.txt):无法打开流:文件存在于/ xxx中 22。
问题是,我确定该文件不存在 - 我甚至在运行代码之前回去删除它。代码创建文件但仍返回false。
我检查过以确保没有其他代码正在创建该文件。我甚至等了30秒等待,看看文件是否再次出现 - 它本身不会显示,只有在我执行此代码后才出现。
答案 0 :(得分:3)
PHP Manual表示模式为x
:
创建并仅供写作;将文件指针放在文件的开头。如果文件已存在,则fopen()调用将失败,返回FALSE并生成级别为E_WARNING的错误。如果该文件不存在,请尝试创建它。这相当于为底层的open(2)系统调用指定O_EXCL | O_CREAT标志。
该函数返回false,因为@fopen('lock.txt', 'x')
返回false(文件已存在),导致$lock = @fopen('lock.txt', 'x')
计算为false,触发分支到return false;
。
答案 1 :(得分:0)
fopen()
模式X
http://php.net/manual/en/function.fopen.php
创建并仅供写作;将文件指针放在 文件的开头。如果文件已存在,则调用fopen() 将返回FALSE并生成级别错误 E_WARNING。
如果文件已存在,则fopen()调用将失败,返回FALSE并生成级别为E_WARNING的错误。
如果您不使用@
错误抑制,您将看到警告。
您可能想要模式W
。
仅供写作;将文件指针放在。的开头 文件并将文件截断为零长度。如果该文件不存在, 试图创造它。