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中的错误,不是吗?或者还有其他什么可以带来这种情况?
答案 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。