#php #search
#php #Поиск
Вопрос:
Я использую этот код для поиска определенного кода в файлах 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_pathn";
}
}
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. сделайте в следующий раз: вставьте свой код, выберите свой код, нажмите
{}
Ответ №1:
Вместо ‘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, но для этого вам придется выполнять загрузку корзины. Вы могли бы попробовать использовать вместо этого массив, а затем преобразовать его в строку в конце поиска.
Не зная особенностей файлов, которые вы ищете, я не могу дать никаких других рекомендаций.