PHP fopen返回TRUE

时间:2016-11-25 18:02:54

标签: php

PHP的fopen应该是

  

成功时返回文件指针资源,错误时返回FALSE。

$f = fopen ($logfile, "a");

file_put_contents("/tmp/foo", gettype($f)."--".print_r ($f), TRUE);

fopen正在Apache日志中打印failed to open stream: Permission denied,这是我在这种特殊情况下所期望的,但是后面的错误处理逻辑无效,因为if ($f)成功。

/tmp/foo中的跟踪告诉我们

boolean--1

我想我可以使用is_resource来使错误处理工作,但这看起来像PHP中的错误,不是吗?或者还有其他什么可以带来这种情况?

2 个答案:

答案 0 :(得分:1)

我认为对print_r的轻微滥用会造成混乱。请注意,如果您希望使用print_r“inline”,则需要第二个参数。

echo print_r($f, 1).' '.TRUE;

那将打印出来:

1

它打印空格然后为1的原因是$ f为FALSE,在print_r中什么都不打印。但是如果你要求字符串直接打印TRUE,它会将其转换为整数表示,或“1”。

试试这个:

if ($f) {
  echo 'f!';
} else {
  echo 'no f';
}

如果fopen失败,你会发现“没有f”。尝试使用此测试:

if ($f !== false) {

这样你就可以确定它是一种资源。

答案 1 :(得分:0)

你在哪个系统?它按预期工作:

<?php
$f = fopen('/var/log/mail.err', "a");
var_dump($f);
if ($f === false) {
    echo 'Not a valid stream';
}

输出:

<br />
<b>Warning</b>:  fopen(/var/log/mail.err): failed to open stream: Permission denied in <b>/foobar.php</b> on line <b>2</b><br />
bool(false)
Not a valid stream

在Debian上测试过。 PHP7.0。