Исключение PHP 5.3.1 glob://

У меня проблемы с обработчиком потока glob://, включенным в PHP 5.3. .0 версии. Я использую следующую версию PHP:

PHP 5.3.1-0.dotdeb.1 с Suhosin-Patch (cli) (создано: 5 декабря 2009 г., 20:08:29) Copyright (c) 1997-2009 The PHP Group Zend Engine v2.3.0, Copyright (c) 1998 -2009 Зенд Технологии

Когда я пытаюсь выполнить следующий пример с веб-сайта PHP.net:

<?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);
}
?>

Обратите внимание, что я удаляю папку из исходного примера и оставляю только расширение php

Я получаю ошибку PHP со следующим сообщением:

SplFileInfo::getSize(): статистика не удалась для [имя первого файла php].php

При поиске в Google об этой ошибке я обнаружил, что у кого-то была такая же проблема. год назад, но вроде исправили.

Итак... Мой вопрос: кто-нибудь использует оболочку glob://? Я делаю что-то неправильно? Кто-нибудь с такой же проблемой?

Примечание. Я уже знаю, что могу сделать то же самое другими способами, но я хочу протестировать оболочку потока glob:// :)


person Pedro Laguna    schedule 17.02.2010    source источник
comment
Выстрелы в темноте: больше нет многословных ошибок? Можете ли вы перевести error_reporting на более высокий уровень? Там должно быть больше информации, чем просто ошибка статистики. Может быть, это Suhosin блокирует необычные обёртки потоков?   -  person Pekka    schedule 17.02.2010
comment
Я забыл это прокомментировать, я отключил расширение Suhosin... но, возможно, также применяется какой-то патч кода. Если я выполню его в консоли, я получу следующий вывод: Неустранимая ошибка PHP: необработанное исключение «RuntimeException» с сообщением «SplFileInfo::getSize(): stat failed for /00.php» в /home/pedro/public_html/glob. php:7 Трассировка стека: #0 /home/pedro/public_html/glob.php(7): SplFileInfo->getSize() #1 {main} добавлено в /home/pedro/public_html/glob.php в строке 7   -  person Pedro Laguna    schedule 17.02.2010


Ответы (3)


Сообщение об ошибке довольно ясно. Он ищет «/00.php» (обратите внимание на косую черту) в корневом каталоге. Я думаю, вам нужно getPathName здесь (http://www.php.net/manual/en/directoryiterator.getpathname.php) не getFileName

person user187291    schedule 17.02.2010
comment
Тогда он должен дать мне все файлы php в корневом пути, а не файлы текущей папки, не так ли? - person Pedro Laguna; 17.02.2010
comment
@Pedro, вероятно, он проверяет корневой путь вашего сервера. Там не было бы никаких файлов. Попробуйте new DirectoryIterator("glob:/".dirname(__FILE__)."/*.php"); - person Josh; 17.02.2010

Я отправил эту ошибку в PHP Bugs, они подтвердили, что это текущая ошибка PHP 5.3.1.

Они пытаются это исправить; см. отчет об ошибке № 51068.

Всем спасибо за ответы :)

person Pedro Laguna    schedule 18.02.2010

Я обнаруживаю проблему: похоже, что glob:// принимает только полные пути или относительные пути, но не текущий путь.

Например, чтобы получить текущий путь, мне нужно использовать:

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

Но я не могу использовать запрос glob://* для получения всех файлов и папок текущей папки.

Однако я могу сделать поиск подпапок, используя относительные пути:

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

Я надеюсь, что это поможет любому, кто пытается что-то сделать с этой новой оболочкой.

person Pedro Laguna    schedule 17.02.2010
comment
Вы пробовали new DirectoryIterator("glob://./*"); ? - person Sekhat; 17.02.2010
comment
@Секхат, спасибо. это решило мою проблему. Замена new GlobIterator('*.php') на new GlobIterator('./*.php') работает на php5.5... - person earthdan; 20.05.2015