2013-03-31 224 views
0

我試圖打開一個解析文件(一個二進制文件),但是不管fopen()總是返回NULL。PHP 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 

OS:

FreeBSD hostname.hostname.hostname 8.2-RELEASE FreeBSD 8.2-RELEASE #0: Thu Feb 17 02:41:51 UTC 2011  [email protected]:/usr/obj/usr/src/sys/GENERIC amd64 
+0

你有安全模式嗎? –

回答

4

你不能有意義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 

換句話說,你從一個var_export得到NULL的事實意味着fopen實際上是成功的。

+1

...而且做到了。我從fread那裏得到一個錯誤,所以我的第一個直覺就是用trigger_error(var_export())來包裝它 - 它提供了false,所以我把它封裝在它之前 - 這是fopen。沒有意識到資源將顯示爲null,而不是顯示在var_dump()中顯示的資源。我猜你知道得越多。謝謝! – kagaku