2011-08-10 112 views
0

我有一個需要2.8秒渲染的php頁面。該頁面包含一個腳本,該腳本通過file()通過foreach循環逐行(~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次。

+0

這是有道理的,我只是臉上掌舵。謝謝'lookup_line檢查數據庫,如果$ line_num存在它將返回true/false' – ThomasReggi

+0

@ThomasReggi如果檢查是如此簡單,那麼你可以根據文件中的行數簡單地在查詢中有一個範圍。 '「.. WHERE line_nunber> = 0 AND 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"; 
    } 
}