1

我正在尝试打开一个文件进行解析(二进制文件),但是无论 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

其中“用户名”与运行 Web 服务器进程和 PHP(lighttpd 和 php-fpm)的用户名匹配。父目录还具有用户/组/所有的读/读/读权限。

我已经尝试过其他文件,并且我注意到我在 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

操作系统:

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
4

1 回答 1

5

您不能有意义地var_export使用fopened 资源,但是您可以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成功,只需检查 it is not false

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

换句话说,您NULL从某种意义上获得var_export的事实fopen实际上是成功的。

于 2013-03-31T16:35:58.577 回答