为什么这个函数返回false?

时间:2015-01-08 21:04:16

标签: php

我有以下代码:

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秒等待,看看文件是否再次出现 - 它本身不会显示,只有在我执行此代码后才出现。

2 个答案:

答案 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

  

仅供写作;将文件指针放在。的开头   文件并将文件截断为零长度。如果该文件不存在,   试图创造它。

相关问题