2011-05-09 72 views
0

我使用此代碼來搜索服務器上的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_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本來是一個更簡單的解決方案。

謝謝你們。

+0

下一次做:粘貼你的代碼,選擇你的代碼,按'{}' – 2011-05-09 04:29:04

回答

0

而不是使用

$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); 

我不認爲你應該運行內存任何理由「的file_get_contents」的嘗試,它必須是一個泄漏什麼的。如果失敗,請使用'memory_get_peak_usage'函數來追蹤哪些部分導致內存增加。

它可能是$ ret變量的串聯,但您必須爲此做桶裝載。您可以嘗試使用數組,然後在搜索結束時將其嵌入到字符串中。

不知道你正在搜索的文件的具體情況,我真的不能提出任何其他建議。