2011-08-10 16 views
0

私は、レンダリングに2.8秒かかるPHPページがあります。このページにはforeachループを経由してfile()行目(〜5000行)でtxtファイルを読み取るスクリプトが含まれています。これは完全に動作し、私は<div>の各行をラップすることができます。これはすべてこのようなものに見えます。効果的なデータベースの一括検索

$text_file = 'path/to/my/text/file.txt'; 
$lines = file($text_file); 
$output = ''; 
foreach($lines as $line_num => $line){ 
    $output .= '<div id="'.$line_num.'" class="line">'.htmlspecialchars($line).'</div>'."\n"; 
} 
echo $output; 

問題は、私は行番号がデータベース内にある場合を照会する必要があり、それがある場合はそれに余分なクラスhighlightを与えることです。これは、ページを非常にゆっくりとレンダリングさせるものです。各行(〜5000)は、ループ内のデータベースを照会しています。これはこのようなものです。

foreach($lines as $line_num => $line){ 
    // codeigniter is being used here 
    $line_exists = $this->line_model->lookup_line($line_num); 
    // $line_exists checks the database if the $line_num exists it will return true/false 
    if($line_exists){   
    $lines_output .= '<div id="'.$line_num.'" class="line highlight">'.htmlspecialchars($line).'</div>'."\n"; 
    }else{ 
    $lines_output .= '<div id="'.$line_num.'" class="line">'.htmlspecialchars($line).'</div>'."\n"; 
    } 
} 

私の質問はです:これを行うには、より効率的な/より高速な方法はありますか?

答えて

0

データベースでその機能のチェックを正確にはわかりませんが、スピードアップするための考え方は、foreachループの前にデータベース内の行番号を取得することです。ループ内の配列内のすべての行番号を取得します。行番号が配列内にあるかどうかをチェックし、そうでなければハイライトを使用します。この方法では、〜5k回ではなく1回だけデータベースに照会します。

+0

これは理にかなっています。 $ look_lineは、$ line_numが存在すればデータベースをチェックし、true/falseを返します。 – ThomasReggi

+0

@ThomasReggiチェックが単純ならば、単純にファイル内の行数に基づいてクエリ内の範囲を持つことができます。 '' .. where line_nunber> = 0そしてline_number <".count($ lines)' –

0
<? 
$text_file = 'path/to/my/text/file.txt'; 
$lines = file($text_file); 

$lineNumbers = array_keys($lines); 


$sql = "SELECT id FROM table where lineNumber IN('".implode("','",$lineNumbers)."')"; 
//exicute this line get id in array format, lets say $availableLines varialbe 
//$availableLines 

foreach($lines as $line_num => $line){ 
    // codeigniter is being used here 
//compare if current line number exits in $availableLines variable 
    if(in_array($line_num,$availableLines)){   
    $lines_output .= '<div id="'.$line_num.'" class="line highlight">'.htmlspecialchars($line).'</div>'."\n"; 
    }else{ 
    $lines_output .= '<div id="'.$line_num.'" class="line">'.htmlspecialchars($line).'</div>'."\n"; 
    } 
} 
関連する問題