Php 为什么这个函数返回false?
我有以下代码:Php 为什么这个函数返回false?,php,Php,我有以下代码: function lock() { if($lock = @fopen('lock.txt', 'x')) { fwrite($lock, getmypid()); fclose($lock); return true; } else { return false; } } $response = lock(); 当我运行代码时,将创建lock.txt文件,并将PID放入该文件中。
function lock() {
if($lock = @fopen('lock.txt', 'x')) {
fwrite($lock, getmypid());
fclose($lock);
return true;
}
else {
return false;
}
}
$response = lock();
当我运行代码时,将创建lock.txt文件,并将PID放入该文件中。但是,该函数返回false。到底发生了什么事
- 我需要fopen的
,因为我正在使用此功能进行文件锁定和控制X
- 我关闭了
,这是我得到的错误:@
fopen()
modeX
创建并仅开放用于写作;将文件指针放在
文件的开头。如果文件已经存在,则fopen()调用
将通过返回FALSE并生成级别错误而失败
警告
如果文件已经存在,则fopen()调用将返回FALSE并生成E_级警告错误,从而失败。
如果不使用@
错误抑制,您将看到警告
您可能需要模式W
只供写作使用;将文件指针放在文件的开头
文件,并将文件截断为零长度。如果文件不存在,
尝试创建它
状态为对于模式x
:
创建并仅开放用于写作;将文件指针放在文件的开头。如果文件已经存在,则fopen()调用将失败,返回FALSE并生成级别为E_警告的错误。如果文件不存在,请尝试创建它。这相当于为底层开放(2)系统调用指定O_EXCL | O_create标志
函数返回false是因为
@fopen('lock.txt','x')
返回false(该文件可能已经存在),这导致$lock=@fopen('lock.txt','x')
的计算结果为false,从而触发分支返回false
是否只调用了一次?取下@
,是否收到错误消息?根据,fopen
withx
模式,如果文件已存在,则返回false
。您确定要对其进行更改吗?不知怎的,我怀疑…使用@
编码等同于将手指塞进耳朵,然后说“拉拉听不见你”。删除@,用新信息更新OP。删除错误抑制字符@
,然后再次运行。它会给你一个错误信息。在执行时,请确保脚本正在您认为它所在的目录中执行(脚本可以位于/data/script/
中,但可以在/run/other/directory
中运行)。该文件是在您删除它和运行脚本之间创建的。检查是否没有任何其他代码可以写入同一个文件。我还输入了整个文件路径本身,以确保它没有检查不同目录中的文件--同一问题。检查后,没有代码创建它。我甚至等了30秒,看看文件是否再次出现。没有雪茄。这可能是偶然与文件权限有关吗?可能是,但如果错误表明文件存在,而不是它无法访问它。我需要x,因为我将其用作准文件锁定功能,那么您需要在调用lock()之前删除它
再次。我有一个删除功能,在锁定完成后将调用该功能删除文件。但是,我首先要确保函数的这一部分工作正常。此lock()不在循环中,它只运行一次,因此不删除文件不是问题所在。