Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как перебрать все файлы на своем сайте?
 
 автор: Владимир55   (05.01.2009 в 15:00)   письмо автору
 
 

Храню информацию в текстовых файлах, и их набралось великое множество в разных папках и поддиректориях. До поры до времени удалял их специальным скриптом, в котором указывал путь к каждой папке. Но в конце концов и сам запутался...

Как бы сделать скрипт, который перебрал бы все директории и поддиректории моего сайта и вывел бы все найденные файлы?

  Ответить  
 
 автор: Eugene77   (05.01.2009 в 16:50)   письмо автору
 
   для: Владимир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($fstrlen($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);
 }
?>


Что-то в этом роде?

  Ответить  
 
 автор: Владимир55   (05.01.2009 в 21:04)   письмо автору
 
   для: 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);

Что бы это значило?

  Ответить  
 
 автор: Trianon   (05.01.2009 в 21:36)   письмо автору
 
   для: Владимир55   (05.01.2009 в 21:04)
 

И не будет.
Вот из-за этой чуши: $root=str_replace('/', '\\', $_SERVER['DOCUMENT_ROOT'].'\\'.$_GET['dir']);

  Ответить  
 
 автор: Владимир55   (05.01.2009 в 22:18)   письмо автору
 
   для: Trianon   (05.01.2009 в 21:36)
 

Я пробовал заменить $root адресом, взятым из phpinfo.php. Результат абсолютно тот же.

Потом сверил результаты - отличие только в направлении слешей - прямой/обратный.

У меня такое ощущение (чисто интуитивное), что на моем сервере не исполняется glob...

  Ответить  
 
 автор: Владимир55   (05.01.2009 в 22:24)   письмо автору
 
   для: Владимир55   (05.01.2009 в 22:18)
 

А вообще я никак не могу понять алгоритм работы этой функции. Как ни стараюсь...

К примеру, откуда берется значение переменной $dir ? Ведь нет ни одного оператора присваивания значения величине $dir !

  Ответить  
 
 автор: Trianon   (05.01.2009 в 23:06)   письмо автору
 
   для: Владимир55   (05.01.2009 в 22:18)
 

Слэши в php должны быть прямыми. Этим всё сказано.
$dir - формальный параметр функции. Присмотритесь внимательнее.
Значение туда попадает при вызове.

  Ответить  
 
 автор: Владимир55   (05.01.2009 в 23:18)   письмо автору
 
   для: Trianon   (05.01.2009 в 23:06)
 

Заменил слеши на прямые.
Ошибка та же...

Возможно, что этот скрипт плох.

Но всё же, как решить поставленню задачу?

  Ответить  
 
 автор: Trianon   (05.01.2009 в 23:23)   письмо автору
 
   для: Владимир55   (05.01.2009 в 23:18)
 

нотайсы, надеюсь, включены?
Какой аргумент передается функции glob() ?
Какая версия php? в четверке glob'а нет.

  Ответить  
 
 автор: Владимир55   (05.01.2009 в 23:48)   письмо автору
 
   для: 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 включить какой-нибудь модуль, какое-нибудь расширение?

  Ответить  
 
 автор: Николай2357   (06.01.2009 в 01:32)   письмо автору
 
   для: Владимир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);    

  Ответить  
 
 автор: Владимир55   (06.01.2009 в 02:44)   письмо автору
 
   для: Николай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)))

  Ответить  
 
 автор: Trianon   (06.01.2009 в 10:19)   письмо автору
 
   для: Владимир55   (05.01.2009 в 23:48)
 

>>нотайсы, надеюсь, включены?
>Что это такое? Как включается?
error_reporting(E_ALL|E_NOTICE);


>>Какой аргумент передается функции glob() ?
>Ну, вот тот, что в приведенном в самом начале коде. Большего я не знаю...
Там цеое выражение. Я спросил, чему оно равно.
Узнается оператором echo.

  Ответить  
 
 автор: Eugene77   (06.01.2009 в 03:57)   письмо автору
 
   для: Владимир55   (05.01.2009 в 21:04)
 

У меня эта функция работает и на хостинге и под домашним сервером.
У вас проблема с правами на файлы и папки.

У меня тоже такая проблема была.
Попробуйте указывать относительные пути.
Чем ближе к корню, тем больше шансов нарваться на папку с минимальными правами.
Так уж хостинги устроены...

  Ответить  
 
 автор: Владимир55   (06.01.2009 в 12:50)   письмо автору
 
   для: Eugene77   (06.01.2009 в 03:57)
 

Получается так, что оператор glob() у меня работает только тогда, когда рнр включен как FastCGI. Техподдержка говорит, что иначе и быть не может.

А у меня все сайты созданы исходя из подключения рнр как модуля Apache. Переходить на подключение рнр как FastCGI стремно - вдруг еще ошибки посыпятся... Так что приходится от glob() и сипользующего glob() скрипта отказаться.

А скрипт Николай2357 работает нормально при условии прав доступа к самой папке сайта на уровне 777. Обычно у этой папки 751, но, похоже, придется ставить три семерки.

Не навлечет это проблем?

  Ответить  
 
 автор: Eugene77   (07.01.2009 в 06:19)   письмо автору
 
   для: Владимир55   (06.01.2009 в 12:50)
 

У меня на хостинге действительно рнр включен как FastCGI.
Но о существовании проблемы при другом способе подключения я слышу впервые.

Хотя FastCGI создаёт некоторые трудности, в частности при работе с заголовками. В целом, он мне понравился. Страницы генерируются существенно быстрей. Особенно действенно ускорение для наиболее востребованных страниц.

Что касается папок, то 0777 не обязателно. Для работы скрипта может хватить и меньших прав. Сейчас навскидку никак не соображу каких именно.

В принципе, для эксплуатации хостингов эта система прав достаточно продумана и разработана в деталях. Я читал о ней кусочками, хорошо бы где-то найти её последовательное описание.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования