|
|
|
| Храню информацию в текстовых файлах, и их набралось великое множество в разных папках и поддиректориях. До поры до времени удалял их специальным скриптом, в котором указывал путь к каждой папке. Но в конце концов и сам запутался...
Как бы сделать скрипт, который перебрал бы все директории и поддиректории моего сайта и вывел бы все найденные файлы? | |
|
|
|
|
|
|
|
для: Владимир55
(05.01.2009 в 15:00)
| |
<?php
// Файл рекурсивного чтения файлов из директории $dir от корня сайта
// Возвращает список файлов CRC32 и длину каждого из них
// каждого файла
$root=str_replace('/', '\\', $_SERVER['DOCUMENT_ROOT'].'\\'.$_GET['dir']);
find_new($root);
function find_new($dir){
global $root;
$files=glob($dir.'/*.*' );
foreach($files as $f){
$file=substr($f, strlen($root));
if(false==($content = file_get_contents($f))) echo "$file ".'-1'." ".'-1'."\n";
else echo "$file ".CRC32($content)." ".strlen($content)."\n";
}
$new_dir=glob($dir.'/*',GLOB_ONLYDIR ) ;
foreach( $new_dir as $check) find_new($check);
}
?>
|
Что-то в этом роде? | |
|
|
|
|
|
|
|
для: Eugene77
(05.01.2009 в 16:50)
| | Чувствую, что это то самое, что надо. Но оно не работает...
Дает сразу два диагностических сообщения. Вот такие:
Warning: Invalid argument supplied for foreach() in foreach($files as $f){
Warning: Invalid argument supplied for foreach() in foreach( $new_dir as $check) find_new($check);
Что бы это значило? | |
|
|
|
|
|
|
|
для: Владимир55
(05.01.2009 в 21:04)
| | И не будет.
Вот из-за этой чуши: $root=str_replace('/', '\\', $_SERVER['DOCUMENT_ROOT'].'\\'.$_GET['dir']); | |
|
|
|
|
|
|
|
для: Trianon
(05.01.2009 в 21:36)
| | Я пробовал заменить $root адресом, взятым из phpinfo.php. Результат абсолютно тот же.
Потом сверил результаты - отличие только в направлении слешей - прямой/обратный.
У меня такое ощущение (чисто интуитивное), что на моем сервере не исполняется glob... | |
|
|
|
|
|
|
|
для: Владимир55
(05.01.2009 в 22:18)
| | А вообще я никак не могу понять алгоритм работы этой функции. Как ни стараюсь...
К примеру, откуда берется значение переменной $dir ? Ведь нет ни одного оператора присваивания значения величине $dir ! | |
|
|
|
|
|
|
|
для: Владимир55
(05.01.2009 в 22:18)
| | Слэши в php должны быть прямыми. Этим всё сказано.
$dir - формальный параметр функции. Присмотритесь внимательнее.
Значение туда попадает при вызове. | |
|
|
|
|
|
|
|
для: Trianon
(05.01.2009 в 23:06)
| | Заменил слеши на прямые.
Ошибка та же...
Возможно, что этот скрипт плох.
Но всё же, как решить поставленню задачу? | |
|
|
|
|
|
|
|
для: Владимир55
(05.01.2009 в 23:18)
| | нотайсы, надеюсь, включены?
Какой аргумент передается функции glob() ?
Какая версия php? в четверке glob'а нет. | |
|
|
|
|
|
|
|
для: Trianon
(05.01.2009 в 23:23)
| | >нотайсы, надеюсь, включены?
Что это такое? Как включается?
>Какой аргумент передается функции glob() ?
Ну, вот тот, что в приведенном в самом начале коде. Большего я не знаю...
>Какая версия php? в четверке glob'а нет.
Вот эта мануальная функция
foreach (glob("*.*") as $filename) {
echo "$filename size " . filesize($filename) . "\n";
}
| не исполняется у меня, но исполняется на Денвере с версией рнр 4.4.4.
У меня PHP Version 5.2.8.
По мануалу glob (PHP 4 >= 4.3.0, PHP 5)
Техподдержка прислала вот такой более чем странный ответ:
Не работает именно glob, как видно из мануального примера, добавил в самое начало:
foreach (glob("*.txt") as $filename) {
echo "$filename size " . filesize($filename) . "\n";
}
это внешняя shell-функция, а не php-шная, и есть ли вообще возможность её использовать в скриптах на vds, сразу, честно, не подскажу, с таким ещё не приходилось сталкиваться. В шелле под csh функция работает.
Что бы это всё значило?
Может быть, для исполнения glob нужно в рнр5 включить какой-нибудь модуль, какое-нибудь расширение? | |
|
|
|
|
|
|
|
для: Владимир55
(05.01.2009 в 23:48)
| | Ну вот Вам тоже самое, только по русски: )))
<?php
$root = $_SERVER['DOCUMENT_ROOT'];
function find_new($dir)
{
$new_dir = null;
$dir_files = opendir($dir);
while(false !== ($file = readdir($dir_files)))
{
if($file != '.' && $file != '..')
$new_dir[] = $dir."/".$file;
}
if($new_dir)
foreach($new_dir as $check )
{
if(is_file($check))
echo $check."<br>";
elseif(is_dir($check))
find_new($check);
}
}
find_new($root);
|
| |
|
|
|
|
|
|
|
для: Николай2357
(06.01.2009 в 01:32)
| | Мистика...
Наверное, у меня что-то с рнр5 на сервере не в порядке.
В общем, получается так:
На Денвере с рнр4 работает превосходно, а на сервере с рнр5 такая диагностика:
Warning: opendir() [function.opendir]: failed to open dir: Permission denied $dir_files = opendir($dir);
Warning: readdir(): supplied argument is not a valid Directory resource in while(false !== ($file = readdir($dir_files))) | |
|
|
|
|
|
|
|
для: Владимир55
(05.01.2009 в 23:48)
| | >>нотайсы, надеюсь, включены?
>Что это такое? Как включается?
error_reporting(E_ALL|E_NOTICE);
>>Какой аргумент передается функции glob() ?
>Ну, вот тот, что в приведенном в самом начале коде. Большего я не знаю...
Там цеое выражение. Я спросил, чему оно равно.
Узнается оператором echo. | |
|
|
|
|
|
|
|
для: Владимир55
(05.01.2009 в 21:04)
| | У меня эта функция работает и на хостинге и под домашним сервером.
У вас проблема с правами на файлы и папки.
У меня тоже такая проблема была.
Попробуйте указывать относительные пути.
Чем ближе к корню, тем больше шансов нарваться на папку с минимальными правами.
Так уж хостинги устроены... | |
|
|
|
|
|
|
|
для: Eugene77
(06.01.2009 в 03:57)
| | Получается так, что оператор glob() у меня работает только тогда, когда рнр включен как FastCGI. Техподдержка говорит, что иначе и быть не может.
А у меня все сайты созданы исходя из подключения рнр как модуля Apache. Переходить на подключение рнр как FastCGI стремно - вдруг еще ошибки посыпятся... Так что приходится от glob() и сипользующего glob() скрипта отказаться.
А скрипт Николай2357 работает нормально при условии прав доступа к самой папке сайта на уровне 777. Обычно у этой папки 751, но, похоже, придется ставить три семерки.
Не навлечет это проблем? | |
|
|
|
|
|
|
|
для: Владимир55
(06.01.2009 в 12:50)
| | У меня на хостинге действительно рнр включен как FastCGI.
Но о существовании проблемы при другом способе подключения я слышу впервые.
Хотя FastCGI создаёт некоторые трудности, в частности при работе с заголовками. В целом, он мне понравился. Страницы генерируются существенно быстрей. Особенно действенно ускорение для наиболее востребованных страниц.
Что касается папок, то 0777 не обязателно. Для работы скрипта может хватить и меньших прав. Сейчас навскидку никак не соображу каких именно.
В принципе, для эксплуатации хостингов эта система прав достаточно продумана и разработана в деталях. Я читал о ней кусочками, хорошо бы где-то найти её последовательное описание. | |
|
|
|