我有一个PHP页面需要2.8秒才能渲染。该页面包含一个脚本,该脚本通过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 :(得分:0)
我不确定该函数究竟在数据库中检查了什么,但加快速度的一个想法可能是在foreach循环之前获取数据库中的行号。获取数组中的所有行号,在循环内只检查行号是否在数组中,如果是,则使用突出显示,否则为正常情况。这样,您只需查询一次数据库,而不是~5k次。
答案 1 :(得分: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";
}
}