Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为什么这个函数返回false?_Php - Fatal编程技术网

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(lock.txt):无法打开流:文件存在于/xxx行中 二十二,

问题是,我确信该文件不存在——我甚至在运行代码之前返回并删除了它。代码创建了文件,但仍然返回false

我检查以确保没有其他代码正在创建该文件。我甚至等了30秒等待,看看文件是否重新出现——它不是自己出现的,它只是在我执行此代码后才出现。

fopen()
mode
X

创建并仅开放用于写作;将文件指针放在 文件的开头。如果文件已经存在,则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
with
x
模式,如果文件已存在,则返回
false
。您确定要对其进行更改吗?不知怎的,我怀疑…使用
@
编码等同于将手指塞进耳朵,然后说“拉拉听不见你”。删除@,用新信息更新OP。删除错误抑制字符
@
,然后再次运行。它会给你一个错误信息。在执行时,请确保脚本正在您认为它所在的目录中执行(脚本可以位于
/data/script/
中,但可以在
/run/other/directory
中运行)。该文件是在您删除它和运行脚本之间创建的。检查是否没有任何其他代码可以写入同一个文件。我还输入了整个文件路径本身,以确保它没有检查不同目录中的文件--同一问题。检查后,没有代码创建它。我甚至等了30秒,看看文件是否再次出现。没有雪茄。这可能是偶然与文件权限有关吗?可能是,但如果错误表明文件存在,而不是它无法访问它。我需要x,因为我将其用作准文件锁定功能,那么您需要在调用
lock()之前删除它
再次。我有一个删除功能,在锁定完成后将调用该功能删除文件。但是,我首先要确保函数的这一部分工作正常。此lock()不在循环中,它只运行一次,因此不删除文件不是问题所在。