Ограничение памяти поиска файлов PHP - PullRequest
0 голосов
/ 09 мая 2011

Я использую этот код для поиска определенного кода в файлах php на серверах. Возможно, это обычно занимает некоторое время и выдает фатальные ошибки (превышен лимит памяти). Есть ли способ сделать этот код более «элегантным»?

<?php

ini_set('display_errors', 1); 
ini_set('memory_limit', '128M');
error_reporting(E_ALL);

define("SLASH", stristr($_SERVER['SERVER_SOFTWARE'], "win") ? "\\" : "/");

if (isset($_POST['path']))
    $path    = ($_POST['path']) ? $_POST['path'] : dirname(__FILE__) ;
else
    $path = dirname(__FILE__) ;
if (isset($_POST['q']))
    $q        = $_POST['q'];


function php_grep($q, $path){
    $temp_array = array();
    $ret = '';
    $fp = opendir($path);
    while($f = readdir($fp)){
        if( preg_match("#^\.+$#", $f) ) continue; // ignore symbolic links
        $file_full_path = $path.SLASH.$f;
        if(is_dir($file_full_path)) {
            $ret .= php_grep($q, $file_full_path);
        } else if( stristr(file_get_contents($file_full_path), $q) ) {
            $ret .= "$file_full_path\n";
        }
    }
    foreach($temp_array as $t)
        $ret .= php_grep1($q, $t);
    return $ret;
}

if (isset($_POST['q'])){
    $results = php_grep($q, $path);
}


?>
<form method=post>
    <input name=path size=100 value="<?php echo $path ?>" /> Path
    <input name=q size=100 value="<?php if (isset ($q)) echo $q; else echo 'mysql_connect';?>"  /> Query
    <input type=submit>
</form>

<?php if (isset($results)) echo $results."<br/>"; ?>

SSH отключен, поэтому я не могу его использовать. вздох grep был бы более простым решением.

Спасибо, ребята.

1 Ответ

0 голосов
/ 09 мая 2011

Вместо 'file_get_contents' попробуйте использовать

$fp = fopen( $file_full_path, 'r' );
$content = fread( $fp, filesize( $file_full_path ) );
fclose( $fp );

if( stristr( $content, $q ) )
{
    $ret .= $file_full_path . "\n"
}

unset( $content );

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

Возможно, это конкатенация переменной $ ret, но для этого вам нужно выполнить загрузку корзины. Вместо этого вы можете попробовать использовать массив, а затем вставить его в строку в конце поиска.

Не зная специфики файлов, которые вы ищете, я не могу дать никаких других рекомендаций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...