PHP fopen()总是返回NULL

时间:2013-03-31 16:29:29

标签: php fopen freebsd lighttpd

我正在尝试打开一个文件进行解析(二进制文件),但无论fopen()总是返回NULL。

我已经排除了几乎所有我只有一个测试脚本的地步:

<?php
$idx = fopen('/usr/home/username/web/appname/dev/www/debug/18194001.idx','r');
trigger_error(var_export($idx,true));
exit();

trigger_error(var_export())的输出;是:

[31-Mar-2013 16:30:34 UTC] PHP Notice:  NULL in /usr/home/username/web/appname/dev/www/debug/ajax.idx.php on line 3

无论我为第二个fopen()选项指定了什么标志,我都得到相同的结果。

现在,显而易见的问题是文件是否存在,我是否有权阅读它?两者的答案都是肯定的。我已经使用了相对路径和绝对路径,都读取了正确的文件。 file_get_contents()也读取文件没有问题。

is_readable()和file_exists()都返回true

该文件的ls -lah输出为:

-rwxrwxrwx   1 username  username  2.0K Mar 30 15:02 18194001.idx

其中'username'与web服务器进程的用户名和PHP(lighttpd和php-fpm)正在运行的用户名相匹配。父目录还具有user / group / all的读/读/读权限。

我已经尝试了其他文件,我注意到我在fopen抛出的任何东西都返回NULL值。

帮助?

PHP信息:

PHP 5.4.6 (cli) (built: Oct 10 2012 10:43:19)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with XCache v2.0.1, Copyright (c) 2005-2012, by mOo

Lighttpd信息:

lighttpd/1.4.31 (ssl) - a light and fast webserver
Build-Date: Sep  7 2012 15:38:20

OS:

FreeBSD hostname.hostname.hostname 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Thu Feb 17 02:41:51 UTC 2011     root@mason.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC  amd64

1 个答案:

答案 0 :(得分:5)

您无法var_export fopen资源,但您可以var_dump

$ php -r 'var_export(fopen("/tmp/a","w+"));'
NULL
$ php -r 'var_dump(fopen("/tmp/a","w+"));'
resource(5) of type (stream)

...因为var_export()旨在“恢复”PHP脚本中的变量,并且资源需要更多设置,然后才能实例化一个简单变量。如果您想知道fopen是否成功,请检查它不是false

$ php -r 'var_export(fopen("/this/does/not/exist","w+"));'
... some errors...
false

换句话说,您从NULL获得var_export这一事实意味着fopen实际上已成功。