数据表在 Codeigniter 上的加载速度非常慢
Posted
技术标签:
【中文标题】数据表在 Codeigniter 上的加载速度非常慢【英文标题】:Datatables very slow load on Codeigniter 【发布时间】:2020-07-07 23:44:49 【问题描述】:我必须从指纹机获取数据。我的代码中的所有内容都运行并正常工作,但如果我显示所有员工数据,加载速度会非常慢。 我已经通过 codeigniter 和 ajax 调用创建数据表来查看。我的代码如下所示
// Datatables Variables
$draw = intval($this->input->get("draw"));
$start = intval($this->input->get("start"));
$length = intval($this->input->get("length"));
$year = $this->input->post("year");
$month = $this->input->post("month");
$dept = $this->input->post("dept");
$where = $year.'-'.$month.'-';
$shifts = $this->m_general->get_data('tb_shift')->result();
$rows = $this->m_employee->attendance($where)->result_array();
if($dept=='5')
$pin_emp = $this->m_general->get_data('tb_employee')->result();
else
$pin_emp = $this->m_general->check_data('tb_employee',array('emp_dept'=>$dept))->result();
$loc_machine= $this->m_general->get_data('tb_pkm')->result();
$roaster = $this->m_employee->list_schedule_emp($where)->result_array();
$holiday = $this->m_general->get_data('tb_holiday')->result();
$total_days = tglakhir($year,$month);
$dates = array();
$people = array();
$data = array();
foreach ($rows as $row)
if (empty($row['date']) || empty($row['pin']))
continue; // no date or sn, nothing to print for this row...
// in array assures unique values
if (!in_array($row['date'], $dates))
$dates[] = $row['date'];
// this may seem convoluted, take your time to understand
$people[$row['date']][$row['pin']] = $row;
$array_emp[$row['date']][$row['pin']][] = $row;
foreach ($roaster as $rs)
if (empty($rs['date']) || empty($rs['id_nip']))
continue; // no date or sn, nothing to print for this row...
// this may seem convoluted, take your time to understand
$get_rs[$rs['date']][$rs['id_nip']] = $rs;
$dt_rs[$rs['date']][$rs['id_nip']][] = $rs;
foreach($pin_emp AS $q)
$array_pin[]=$q->emp_pin;
$details[$q->emp_pin] = $q;
foreach($holiday AS $hday)
$get_hday[$hday->date_holiday] = $hday;
foreach($loc_machine AS $list_machine)
$lm[$list_machine->id_machine] = $list_machine;
for($m=1; $m <= $total_days; $m++)
if($m<10)
$m = '0'.$m;
else
$m = $m;
$date[]=$m;
foreach($shifts AS $shift_e)
$array_shift[$shift_e->id_shift] = $shift_e;
$ar_shift[]=$shift_e->id_shift;
foreach ($array_pin AS $id)
$name = $details[$id]->emp_name;
$shift = $details[$id]->emp_shift;
$id_machine = $details[$id]->emp_reg_sn;
if(isset($lm[$id_machine]))
$loc_machine= $lm[$id_machine]->pkm_name;
$date_range = array();
foreach($date AS $date_col)
$day = date('D', strtotime($year.'-'.$month.'-'.$date_col));
$today = date('Y-m-d');
$full_day = $year.'-'.$month.'-'.$date_col;
$s_in = '';
$s_out = '';
$time_in = '';
$time_out = '';
$t_in = '';
$t_out = '';
$finger_tap = '';
$diff_in = '';
$diff_out = '';
$diff = null;
$diff2 = null;
$late = '00:00:00';
$r = $date_col;
$title = '';
$date_holiday= '';
if (ISSET($get_hday[$full_day])==TRUE)
$date_holiday = $get_hday[$full_day]->date_holiday;
$title = $get_hday[$full_day]->note_holiday;
foreach ($dates as $key)
$shift_detail= $array_shift[$shift]->code_shift;
if(isset($get_rs[$full_day][$id]['id_shift_emp']) && $get_rs[$full_day][$id]['id_shift_emp']!='')
$shift = $get_rs[$full_day][$id]['id_shift_emp'];
$shift_detail = $array_shift[$shift]->code_shift;
if (isset($people[$key][$id]['date']) && $people[$key][$id]['date'] == $key)
foreach ($array_emp[$key][$id] AS $dtl)
if(isset($get_rs[$key][$id]['id_shift_emp']) && $get_rs[$key][$id]['id_shift_emp']!='')
$shift = $get_rs[$key][$id]['id_shift_emp'];
$shift = $dtl['emp_shift'];
$date_time = $dtl['date_time'];
if(($shift==5)OR($shift==7)OR($shift==9)OR($shift==11)OR($shift==12)OR($shift==14))
$r = $date_col+1;
if(substr($key,8,2)==$date_col)
$status_code= $dtl['status_code'];
$status_note= $dtl['att_status'];
$first_in = strtotime($year.'-'.$month.'-'.$date_col.' '.$array_shift[$shift]->first_check);
$last_out = strtotime($year.'-'.$month.'-'.$r.' '.$array_shift[$shift]->last_check);
$shift_in = $array_shift[$shift]->in_shift;
$shift_out = $array_shift[$shift]->out_shift;
$s_in = strtotime($year.'-'.$month.'-'.$day.' '.$shift_in);
$s_out = strtotime($year.'-'.$month.'-'.$day.' '.$shift_out);
$finger_tap = strtotime($date_time);
$shift_detail= $array_shift[$shift]->code_shift;
foreach($ar_shift AS $id_shift)
if ($shift==$id_shift)
$currdiff = abs($finger_tap - $first_in);
if (is_null($diff) || $currdiff < $diff)
$diff = $currdiff;
$time_in = date('H:i:s',strtotime($date_time));
$t_in = strtotime($date_time);
if(($t_in-$s_in)>0)
$diff_in = gmdate('H:i:s',$t_in-$s_in);
else
$diff_in = $late;
$currdiff2 = abs($finger_tap - $last_out);
if (is_null($diff2) || $currdiff2 < $diff2)
$diff2 = $currdiff2;
$time_out = date('H:i:s',strtotime($date_time));
$t_out = strtotime($date_time);
if(($t_out-$s_out)>0)
$diff_out = $late;
else
$diff_out= gmdate('H:i:s',$s_out-$t_out);
if(($shift==5)OR($shift==7)OR($shift==9)OR($shift==11)OR($shift==12)OR($shift==14))
if ($day==$r)
$shift_out = $array_shift[$shift]->out_shift;
$s_out = strtotime($year.'-'.$month.'-'.$r.' '.$shift_out);
$finger_tap = strtotime($date_time);
foreach($ar_shift AS $id_shift)
if ($shift==$id_shift)
$currdiff2 = abs($finger_tap - $last_out);
if (is_null($diff2) || $currdiff2 < $diff2)
$diff2 = $currdiff2;
$time_out = date('H:i:s',strtotime($date_time));
$t_out = strtotime($date_time);
if(($t_out-$s_out)>0)
$diff_out = $late;
else
$diff_out= gmdate('H:i:s',$s_out-$t_out);
$status = '<a href="javascript:change_status_att(\''.$id.'\',\''.$name.'\',\''.$full_day.'\')" class="btn btn-xs btn-dino" data-toggle="tooltip" data-placement="top" title="Belum hadir"><i class="material-icons col-green">check_box_outline_blank</i>'.$shift_detail.'</a>';
if($year.'-'.$month.'-'.$date_col < $today)
$status = '<a href="javascript:change_status_att(\''.$id.'\',\''.$name.'\',\''.$full_day.'\')" class="btn btn-xs btn-dino" data-toggle="tooltip" data-placement="top" title="Alpha"><i class="material-icons col-red">fiber_manual_record</i>'.$shift_detail.'</a>';
if(($day == 'Sun') OR ($day == 'Sat'))
$status='<a href="javascript:change_status_att(\''.$id.'\',\''.$name.'\',\''.$full_day.'\')" class="btn btn-md bg-red waves-effect" data-toggle="tooltip" data-placement="top" title="Libur">off</button>';
if($date_holiday == $full_day)
$status = '<a href="javascript:change_status_att(\''.$id.'\',\''.$name.'\',\''.$full_day.'\')" class="btn btn-xs btn-dino" data-toggle="tooltip" data-placement="top" title="'.$title.'"><i class="material-icons col-red">today</i>OFF</a>';
if($time_in!='')
if($time_in==$time_out)
$status = '<a href="javascript:change_status_att(\''.$id.'\',\''.$name.'\',\''.$full_day.'\')" class="btn btn-xs btn-dino" data-toggle="tooltip" data-placement="top" title="Absen"><i class="material-icons col-red">brightness_6</i>'.$shift_detail.'</a>';
if ($status_code!='')
$status = '<a href="javascript:change_status_att(\''.$id.'\',\''.$name.'\',\''.$full_day.'\')" class="btn btn-xs btn-dino" data-toggle="tooltip" data-placement="top" title="'.$status_note.'"><i class="material-icons col-orange">sim_card_alert</i>'.$shift_detail.'</a>';
if($time_in!=$time_out)
$status = '<a href="javascript:change_status_att(\''.$id.'\',\''.$name.'\',\''.$full_day.'\')" class="btn btn-xs btn-dino" data-toggle="tooltip" data-placement="top" title="Complete"><i class="material-icons col-green">check_box</i>'.$shift_detail.'</a>';
if($time_in=='00:00:00')
$status = '<a href="javascript:change_status_att(\''.$id.'\',\''.$name.'\',\''.$full_day.'\')" class="btn btn-xs btn-dino" data-toggle="tooltip" data-placement="top" title="'.$status_note.'"><i class="material-icons col-orange">sim_card_alert</i>'.$shift_detail.'</a>';
$date_range[] = $status;
$first = array(
'<a href="javascript:view_att_emp(\'details\',\''.$id.'\',\''.$year.'\',\''.$month.'\')">'.$id.'</a>',
$name,
$loc_machine
);
$data[] = array_merge($first,$date_range);
$output = array(
"draw" => $draw,
"recordsTotal" => '',
"recordsFiltered" =>'' ,
"data" => $data
);
$this->output->set_content_type('application/json')->set_output(json_encode($output));
此代码运行正常,但加载大约需要 10 秒。 有人可以帮我做些什么来加快这个负载吗?
更新
在我分析我的代码后,加载数据很慢,因为数据表说“数据被截断”。但是当我加载小数据(过滤)时,它很好。
当我从数据库中获取所有数据时,问题仍然存在。
【问题讨论】:
我看对了吗?一个foreach
,在一个foreach
内,它本身在另一个foreach
内?难怪它运行缓慢。
因为我需要为我的结果这样做。这就是为什么我在这里问也许有人可以帮助我或为我的代码提供想法。
这就是想法,您需要更改代码,使其不是循环内循环内循环内循环内循环内循环...或者您是说有人应该重写您的代码以更快的方式为您服务?
完全没有。也许有人给出了简单的循环,因为我需要创建所有循环。 cmiw。
回答你对我的回复的评论:所以我猜这是你的数据库有问题,而不是 CodeIgniter 或 php。您可以通过删除一些标签并添加 SQL 标签来改进您的问题(如果您的数据库是 SQL,或者无论是否经过调整)并将请求的结果直接放在您的问题中。
【参考方案1】:
要让它更快,你首先需要知道什么是慢的。为此,您需要使用调试工具,例如 this one 和 timestamps。
然后,一旦您获得有关进程持续时间的日志,您就可以对其进行分析,以了解您的代码的哪一部分是慢的。
然后,尝试优化它。如果不能,请编辑您的问题以专注于慢速部分或发布新问题。
【讨论】:
请使用 cmets 作为 cmets。您的代表足够高,可以使用 cmets,这并不是 OP 问题的真正答案 在我分析我的代码后,加载数据很慢,因为数据表说“数据被截断”。但是当我加载小数据(过滤)时,它很好。当我从数据库中获取所有数据时,问题仍然存在。 谢谢尤金。其实我发这个的时候我的代表还不够高^^'但我同意你的看法。以上是关于数据表在 Codeigniter 上的加载速度非常慢的主要内容,如果未能解决你的问题,请参考以下文章