Сканер файлов сервера на PHP


Сегодня я хотел-бы рассмотреть тему, как написать сканер файлов сервера на PHP. Это будет несложная функция использующая рекурсию. Выводить файлы я планирую в списке "<UL>". Параметром в функцию будет передаваться стартовая позиция, откуда нужно начинать сканирование. 

Итак начнем. Накидаю шаблон для сканирования первого уровня:

<?
$start = $_SERVER['DOCUMENT_ROOT']; // Откуда начинаем сканировать

echo '<h1>Сканирование: "'.$start.'":</h1>';
ScanTree($start);


function ScanTree($start)
{
$dir = scandir($start);
if (count($dir) > 2) 
    {
    echo '<ul>';
    for ($i = 0; $i < count($dir); $i++) 
        {
        if ($dir[$i] != '.' and $dir[$i] != '..') 
            {
            echo '<li>' . $dir[$i] . '</li>';
            }
        }
    echo '</ul>';
    }
}
?>

Что тут сделано? Рассмотрим поподробнее.

Для начала я определяю откуда начинать сканировать. Чтоб не ошибиться и не подумать что программа не работает, я взял за начало - $_SERVER['DOCUMENT_ROOT']. Эта глобальная переменная содержит путь до корня сервера.

Далее я описал функцию (которая в дальнейшем будет использовать принцип рекурсии) принимает путь к директории, с которой начинать сканировать.

Функция scandir() сканирует директорию на наличие всех файлов и возвращает массив со списком файлов. Стоит отметить что помимо файлов, в массиве есть 2 элемента "." и "..". Они нам не нужны, поэтому я убираю их условием if().

Теперь давайте зациклим функцию:

<?
$start = $_SERVER['DOCUMENT_ROOT']; // Откуда начинаем сканировать

echo '<h1>Сканирование: "'.$start.'":</h1>';
ScanTree($start);

function ScanTree($start)
{
$dir = scandir($start);
if (count($dir) > 2) 
    {
    echo '<ul>';
    for ($i = 0; $i < count($dir); $i++) 
        {
        if ($dir[$i] != '.' and $dir[$i] != '..') 
            {
            echo '<li>' . $dir[$i] . '</li>';
            ScanTree($start."/".$dir[$i]);
            }
        }
    echo '</ul>';
    }
}
?>

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

Сейчас доработаем функцию, чтоб она была более читабельна. Поставим изображение папочки и файла.

<style>
img {position:relative; top: 4px; margin-right:5px;}
</style>
<?
$start = $_SERVER['DOCUMENT_ROOT']; // Откуда начинаем сканировать

echo '<h1>Сканирование: "'.$start.'":</h1>';
ScanTree($start);

function ScanTree($start)
{
$dir = scandir($start);
if (count($dir) > 2) 
    {
    echo '<ul>';
    for ($i = 0; $i < count($dir); $i++) 
        {
        if ($dir[$i] != '.' and $dir[$i] != '..') 
            {
            if (is_dir($start."/".$dir[$i]))
                {
                $img = "<img src='http://lavrik-v.ru/upload/userfiles/files/44590858.png'>";
                }   
                else
                {
                $img = "<img src='http://lavrik-v.ru/upload/userfiles/files/notepad2.png'>";
                } 
                
            echo '<li>' . $img . $dir[$i] . '</li>';
            ScanTree($start."/".$dir[$i]);
            }
        }
    echo '</ul>';
    }
}
?>

Вот и получили вполне сносный сканер файлов на сервере написанный на PHP.

Теперь попробуем его ещё доработать, и сделать из него поисковик строки в текстовых файлах на сервере. Для этого я написал ещё одну функцию, которая ищет строку в текстовом файле:

function search_in_file($file, $search) {  
$string=file_get_contents($file); 
if(eregi($search,$string)) 
    { 
    return true;
    }
return false;
}

Тут все просто. Теперь её подключаем к нашему сканеру, подписываем немного CSS стили и получаем в результате вот что:

<style>
img {position:relative; top: 4px; margin-right:5px;}
.search_yes {color:green; font-weight:bold;}
</style>
<?
$start = $_SERVER['DOCUMENT_ROOT']; // Откуда начинаем сканировать

echo '<h1>Сканирование: "'.$start.'":</h1>';
ScanTree($start, "resizeImage");

function ScanTree($start, $search='')
{
$dir = scandir($start);
if (count($dir) > 2) 
    {
    echo '<ul>';
    for ($i = 0; $i < count($dir); $i++) 
        {
        if ($dir[$i] != '.' and $dir[$i] != '..') 
            {
                
            // проверяю файл это или папка.    
            if (is_dir($start."/".$dir[$i]))
                {
                $img = "<img src='http://lavrik-v.ru/upload/userfiles/files/44590858.png'>";
                }   
                else
                {
                $img = "<img src='http://lavrik-v.ru/upload/userfiles/files/notepad2.png'>";
                }
              
            // Ищу строку в файле   
            if ($search AND !is_dir($start."/".$dir[$i]))
                {
                $result_search = '';
                if(search_in_file($start."/".$dir[$i], $search))
                    {
                    $result_search = ' class="search_yes" ';
                    }
                }
            
            echo '<li '.$result_search.'>' . $img . $dir[$i] . '</li>';
            ScanTree($start."/".$dir[$i], $search);
            }
        }
    echo '</ul>';
    }
}

function search_in_file($file, $search) {  
$string=file_get_contents($file); 
if(eregi($search,$string)) 
    { 
    return true;
    }
return false;
}
?>

Данным сканером - поисковиком можно пользоваться на любом сервере с PHP. Единственное что вы можете поиграться с первым параметром функции ScanTree(), задав например его $_SERVER['DOCUMENT_ROOT']."/../". Тогда вы увидите директории на уровень выше.

Возможно есть варианты выполнить эту задачу проще, но я бы сделал это так.

 


Тэги:

Комментарии: 0

Прокомментировать »

 
 
 

Прокомментировать

 
 
Сообщение *
 
Проверочный код *
 
 
 
Яндекс.Метрика