2010-02-17 54 views
2

我遇到了PHP 5.3.0版本中包含的glob://流封裝問題。我使用下面的PHP版本:PHP 5.3.1 glob://異常

PHP 5.3.1-0.dotdeb.1 with Suhosin-Patch (cli) (built: Dec 5 2009 20:08:29) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998-2009 Zend Technologies

當我嘗試從PHP.net網站執行以下example

<?php 
// Loop over all *.php files in ext/spl/examples/ directory 
// and print the filename and its size 
$it = new DirectoryIterator("glob://*.php"); 
foreach($it as $f) { 
    printf("%s: %.1FK\n", $f->getFilename(), $f->getSize()/1024); 
} 
?> 

Note that I remove the folder from the original example and left only the php extension

我出現以下消息PHP錯誤:

SplFileInfo::getSize(): stat failed for [first php file name].php

在谷歌搜索這個錯誤時,我發現有人有same problem一年前,但看起來像他們修復它。

所以...我的問題是:任何人都使用glob:// wrapper?難道我做錯了什麼?任何人都有同樣的問題?

注:我已經知道我可以做同樣在其他不同的方式,但我要測試的水珠://流包裝:)

+0

在黑暗中拍攝:有沒有更詳細的錯誤?你可以把error_reporting轉到更高的水平嗎?應該有一些更多的信息,而不僅僅是「統計失敗」。也許是Suhosin阻止異常的流式封裝? – 2010-02-17 12:04:27

+0

我忘了發表評論,我禁用Suhosin擴展名......但也許應用了一些代碼補丁。 如果我在控制檯執行它,我會得到以下輸出: PHP致命錯誤:Uncaught異常'RuntimeException'帶有消息'SplFileInfo :: getSize():stat失敗/00.php'/ home/pedro/public_html/glob.php:7 Stack trace: #0 /home/pedro/public_html/glob.php(7):SplFileInfo-> getSize() #1 {main} 拋出/ home/pedro/public_html/glob.php第7行 – 2010-02-17 12:12:40

回答

2

我將這個bug發送給PHP錯誤,他們確認這是一個當前的PHP 5.3.1錯誤。

他們正試圖解決它;請參閱Bug report #51068

謝謝大家的回答:)

2

錯誤消息是相當清楚的。它正在尋找根目錄中的「/00.php」(注意斜槓)。我猜你需要getPathName(http://www.php.net/manual/en/directoryiterator.getpathname.php)而不是getFileName

+0

然後,它應該給我所有的PHP文件在根路徑,而不是當前的文件夾文件,不是嗎? – 2010-02-17 13:07:51

+0

@Pedro,它可能檢查您的服務器*的根路徑*。那裏不會有任何文件。嘗試'新的DirectoryIterator(「glob:/」。dirname(__ FILE __)。「/ *。php」);' – Josh 2010-02-17 13:47:49

0

我發現問題:glob://看起來像只接受完整路徑或相對路徑而不是當前路徑。

例如,以檢索當前路徑,我需要使用:

$it = new DirectoryIterator("glob:///home/pedro/public_html/*"); 
foreach($it as $f) { 
    printf("%s: %.1FK<br />", $f->getFilename(), $f->getSize()/1024); 
} 

但我不能使用水珠:// *查詢得到的所有當前文件夾中的文件和文件夾。

但是我可以使用相對路徑的子文件夾搜索:

$it = new DirectoryIterator("glob://subfolder/*"); 
foreach($it as $f) { 
    printf("%s: %.1FK<br />", $f->getFilename(), $f->getSize()/1024); 
} 

我希望這可以幫助任何人試圖與這個新包裝的東西。

+1

你嘗試了'新的DirectoryIterator(「glob://./*」);'? – Sekhat 2010-02-17 17:18:51

+0

@Sekhat,謝謝。解決了我的問題。使用'new GlobIterator('./*。php')替換'新的GlobIterator('*。php')''適用於php5.5 ... – earthdan 2015-05-20 11:37:22