2012-02-09 59 views
4

此問題已被多次詢問,但我找到的答案都沒有幫助我。即使文件存在於我的linux上,php file_exists也會返回false

我試圖讓PHP的file_exists()工作。當它工作時唯一的場景是當php文件與文件位於相同的目錄中,並且僅使用文件名(即不包括路徑)時使用file_exist()。但這不是隨之而來的行爲,請參閱下文。

索姆信息:

  • 的safe_mode =關閉
  • 沒有符號鏈接的目錄28
  • 在文件名中沒有空格
  • 在/ var中的所有目錄/ www/html等/中芯/上傳/ 28 /具有apache:apache 777作爲權限。
  • 使用PHP 5.3

PHP:

echo getcwd() 
clearstatcache(); 
$file = 'file:///var/www/html/smic/upload/28/ul.txt'; 
//Also tried like this 
//$file = '/var/www/html/smic/upload/28/ul.txt'; 

if(file_exists($file)){ 
    echo $file." exists"; 
} 

GETCWD()打印在/ var/www/html等/中芯/模塊/核心/票務

的PHP腳本的權限並且要檢查的文件是apache:apache 777.

有關目錄結構的一些細節:

[[email protected] 28]# pwd 
/var/www/html/smic/upload/28 

[[email protected] 28]# ls -l ul.txt 
-rw-r--r--. 1 apache apache 2 Feb 9 10:50 ul.txt 

[[email protected] 28]# chmod 777 ul.txt 

[[email protected] 28]# ls -l ul.txt 
-rwxrwxrwx. 1 apache apache 2 Feb 9 10:50 ul.txt 

的行爲並沒有改變文件的權限後更改。目錄/ 28有drwxr-xr-x。對於Apache用戶和Apache組

用於測試,我也感動了實際的PHP腳本/ 28,給了它阿帕奇:阿帕奇777 - 瑞。將$文件改爲「ul.txt」(即$ file ='ul.txt';)。這工作,找到ul.txt文件。

GETCWD()打印,然後在/ var/www/html等/中芯/上傳/ 28

至於另一項測試我試圖找到排除在「准考證」目錄的路徑,另一個文件,該文件是無法識別。

我砰的一聲......

任何意見是讚賞。

+0

你使用哪個版本的php?你沒有使用'file://'方案試試嗎? – VolkerK 2012-02-09 14:00:32

+0

PHP 5.3,已添加到我的文章。我幾乎只嘗試沒有文件:// – Nicsoft 2012-02-09 14:50:56

回答

2

嘖嘖,這是一個很漂亮的凝灰岩。我總是確保當我從網上覆制任何東西,首先將其粘貼到普通文本編輯器中,以便移除所有奇怪/隱藏的字符,然後再次複製它並粘貼到我的開發工具中。

正如我在評論中提到的那樣,我做了pwd並將我的虛擬服務器的文本複製到了我的osx中。但是我沒有想到/知道的是,如果我從我的linux服務器上做了這些,可能會出現奇怪/隱藏的字符,因此我沒有確保通過texteditor複製所有內容。

我記得當前我在網上覆制時遇到了問題,並認爲這可能是一個類似的問題。我用十六進制編輯器打開了我的腳本。我發現了什麼......'/ var'看起來很簡潔:'/ var'。刪除奇怪的字符解決了問題。

謝謝大家以上的意見。希望那些可以幫助別人,也許它甚至不知道它幫助我(因爲我根據你的意見做了很多事情)。

0

從php.net手冊中,「失敗後,發出E_WARNING。」確保錯誤報告設置爲會顯示警告並嘗試的級別。

而且,「這個功能,由於安全模式的限制返回FALSE爲不可訪問的文件,但這些文件還可以包含,如果它們位於safe_mode_include_dir。」你不是在php安全模式下運行嗎? phpinfo()應該告訴你。

+0

根據我的文章,我沒有使用safe_mode。 – Nicsoft 2012-02-09 14:19:58

7

單獨文件的權限不足以爲PHP來評估file_exists。運行php的進程還需要權限來遍歷該文件的所有父目錄才能訪問它。

檢查逐一和驗證PHP可以讀取和輸入(R-X)

ls -ald /var 
ls -ald /var/www 
ls -ald /var/www/html 
ls -ald /var/www/html/smic 
ls -ald /var/www/html/smic/upload 
ls -ald /var/www/html/smic/upload/28 
+0

我確保權限是apache:apache 777,用於包括所有子目錄upp,幷包括/ 28 – Nicsoft 2012-02-09 14:57:00

0

哪裏是你的PHP文件在什麼位置?如果「HTML」文件夾中,然後使用像$file = "smic/upload/28/ul.txt";

+0

我包含這一行:getcwd()打印/ var/www/html/smic/modules/core/ticket – Nicsoft 2012-02-09 14:13:58

+0

在這種情況下,試試'$ file =「../../../ upload/28/ul.txt」;' – James 2012-02-09 17:28:28

+0

它實際上已經解決了,請參閱我自己的答案。該文件已損壞,我必須使用十六進制編輯器來修復它以去除奇怪的字符。不管怎麼說,還是要謝謝你! – Nicsoft 2012-02-09 18:01:47

2

在這裏救命稻草的相對路徑...

嘗試蘇 - 阿帕奇(或任何用戶你的服務器運行作爲..的Apache2,www數據等)。然後遍歷目錄。

是否存在任何.htaccess文件,或者對您的apache配置有任何其他限制?

+0

apache用戶不可用...確認沒有.htaccess文件。 – Nicsoft 2012-02-09 14:32:16

+0

此外,我確保許可是apache:apache 777,用於包括/ 28在內的所有子目錄。 – Nicsoft 2012-02-09 14:56:06

1

對文件夾的訪問權限是什麼? 路徑$file = 'file:///var/www/html/smic/upload/28/ul.txt';不正確。 嘗試php腳本複製到文件夾上傳和file='28/ul.txt';。 該文件夾必須可讀。

+0

我使用這些信息更新了我的帖子。/var/www/html/smic/upload/28 /中的所有目錄都具有apache:apache 777作爲權限。我剛纔改變了。行爲沒有差異。 – Nicsoft 2012-02-09 14:51:57

+0

這時我不在Linux系統上用PHP。我會在晚上檢查一下。所以我不確定,如果這是正確的。如果php腳本在html文件夾中,請嘗試「./smic/upload/28/ul.txt」或「smic/upload/28/ul.txt」。 – yen1k 2012-02-09 15:18:32

+0

謝謝,使用十六進制編輯器,我發現奇怪的字符損壞了我的文件。 – Nicsoft 2012-02-09 15:53:11

1

嘗試使用$ file ='/upload/28/ul.txt'打開文件;

+0

不工作(我寫了它,但我必須犯了一個錯誤,因爲它不起作用,我可能測試了不正確的腳本,刪除了該評論)。 – Nicsoft 2012-02-09 14:43:15

+0

使用__DIR__常數來獲取當前目錄,使用相對路徑後資源 – Userbn 2012-02-09 15:31:16

+0

謝謝,使用十六進制編輯器,我發現了奇怪的字符,它損壞了我的文件。 – Nicsoft 2012-02-09 15:52:42

0

也許,在文件的名稱中有一個空白符號。這一點很重要。

+0

你找到答案了嗎? – frops 2016-01-22 12:32:42

相關問題