first general information.
my php runs approx 1000-1500 while loops depending on database returns.
normal execution time approx 0.3 sec. that's great :)
now need load php output on page using ajax , therefore start adding output $html variable in stead of doing echo on it, can encoded json format , send on ajax.
i use $html .= some_output this. (this task must done many times while loop runs).
however after adding $html .= in stead of echo script taking +9 sec's finish!!
that's not optimal end user waiting ajax call return results.
i did microtime on code sure problem origins - , no doubt .= operator.
any suggestions on how minimize this?
edit: here comes code blocks.
first 1 loads flawlessly.
<?php $time_start = microtime(true); session_start(); include "../functions/sqlsrv_connect.php"; $skid_id = $_get['skid_id']; $vendor_id = $_get['vendor_id']; ?> <!doctype html> <html> <head> <meta http-equiv="x-ua-compatible" content="ie=edge"> <link rel="stylesheet" type="text/css" href="../stylesheets/fonts.css"> <link rel="stylesheet" type="text/css" href="../stylesheets/linkcontainer.css"> <script src="/js/jquery-1.11.3.min.js"></script> </head> <body> <div id="parent" style="display: none;"> <?php $sql_get_vdm_sections = " select ml2.level2_descr, ml2.level2_id main_vdm_level2 ml2 join vdm_index vdm_i on vdm_i.level2_id = ml2.level2_id vdm_i.skid_id = $skid_id , vdm_i.vendor_id = $vendor_id group ml2.level2_descr, ml2.level2_id order ml2.level2_id "; $get_vdm_sections = sqlsrv_query($sqlsrv, $sql_get_vdm_sections); while($vdm_section = sqlsrv_fetch_array($get_vdm_sections,sqlsrv_fetch_assoc)){ $level2_id = $vdm_section['level2_id']; $level2_descr = $vdm_section['level2_descr']; ?> <div id="s<?php echo $level2_id;?>" class="section"> <div class="sectionhead"> <?php echo $level2_descr;?> </div> <div class="container_holder"> <div id="o<?php echo $level2_id;?>" class="obsolete_section"> <div class="obsolete_lineholder"> <div class="obsolete_header"> <div class="clmn_header"> <p class="small bold">obsolete documentation</p> </div> </div> </div> <div class="obsolete_lineholder"> <div class="obsolete_linkholder"> <a href="#" class="div" target="_blank"> <div class="obsolete_text"> </div> </a> </div> </div> <div class="obsolete_lineholder"> <div class="obsolete_linkholder"> <a href="#" class="div" target="_blank"> <div class="obsolete_text"> </div> </a> </div> </div> <div class="obsolete_lineholder"> <div class="obsolete_linkholder"> <a href="#" class="div" target="_blank"> <div class="obsolete_text"> </div> </a> </div> </div> </div> <div class="active_cnt"> <div class="button_holder"> <div class="active_btn"> <p class="small">active documentation</p> </div> <div class="obsolete_btn"> <p class="small">view obsolete documentation</p> </div> </div> <div class="lineholder"> <div class="linkholder"> <div class="clmn_header"> <p class="small bold">chapters</p> </div> </div> </div> <div class="linkholder_cnt"> <?php $file_verification = true; $sql_get_section_content = " select file_verification, level3_head, level3_descr, level4_descr, doc_no, doc_place, doc_denominator, doc_type vdm_index skid_id = $skid_id , vendor_id = $vendor_id , level2_id = $level2_id , level4_descr null "; $get_section_content = sqlsrv_query($sqlsrv, $sql_get_section_content); $row_number = 1; while ($section_content = sqlsrv_fetch_array($get_section_content,sqlsrv_fetch_assoc)){ $level3_file_verification = $section_content['file_verification']; $level3_head = $section_content['level3_head']; $level3_descr = $section_content['level3_descr']; $level3_doc_no = $section_content['doc_no']; $level3_doc_place = $section_content['doc_place']; $level3_doc_denominator = $section_content['doc_denominator']; $level3_doc_type = $section_content['doc_type']; $level3_width = 100; $row_id = 's'.$level2_id.'_r'.$row_number; $sql_get_level4 = " select file_verification, level4_descr, doc_no, doc_place, doc_denominator, doc_type vdm_index skid_id = $skid_id , vendor_id = $vendor_id , level2_id = $level2_id , level3_descr = '$level3_descr' , level4_descr not null "; $get_level4 = sqlsrv_query($sqlsrv, $sql_get_level4); $level4_array = array(); while ($level4 = sqlsrv_fetch_array($get_level4,sqlsrv_fetch_assoc)){ array_push($level4_array, $level4); } if (!empty($level4_array)){ $level3_width -= 10; $level4_active = true; } else { $level4_active = false; } if ($file_verification != true){ $level3_width -= 10; $level3_flag = true; } else { $level3_flag = false; } ?> <div class="lineholder"> <a href="../proj_hist.pdf" class="div" target="_blank"> <div class="project"> <?php if ($level3_doc_denominator != null){ ?> <svg x="0px" y="0px" width="45px" height="100%" viewbox="0 0 45 25" preserveaspectratio="none"> <rect fill="#66fecb" width="27.1" height="25"></rect> <polygon fill="#66fecb" points="45,12.5 27,0.000 27,25.000 "></polygon> </svg> <?php } ?> </div> <div class="project_name"> <div class="project_text"> <?php echo $level3_doc_denominator;?> </div> </div> </a> <div class="linkholder" > <div id="<?php echo $row_id;?>" class="top_row" > <div class="projectstatus" style="background: #ffffff; width: 100%;"> </div> <?php if(!(empty($level3_head))&&empty($level3_descr)){ ?> <div class="link_text level3_head" style="float: left; width: 100%; white-space: nowrap;"> <?php echo $level3_head;?> </div> <?php } else { ?> <a href="../functions/load_doc.php?doc_no=<?php echo $level3_doc_no.'&doc_place='.$level3_doc_place.'&doc_type='.$level3_doc_type.'&doc_denominator='.$level3_doc_denominator;?>" class="div" target="_blank"> <div class="link_text" style="float: left; width: <?php echo $level3_width;?>%; white-space: nowrap; overflow: hidden;"> <?php echo $level3_descr;?> </div> </a> <?php if($level3_flag == true){ ?> <div class="flag_this"> </div> <?php } if ($level4_active == true){ ?> <div id="<?php echo $row_id;?>_expand" class="expand"> <div class="expand_icon <?php echo $row_id;?>_expand_icon"> </div> </div> <?php } } ?> </div> <div class="clear"> </div> <?php if ($level4_active == true) { ?> <div class="<?php echo $row_id;?>_level4"> <?php foreach ($level4_array $level4){ $level4_doc_no = $level4['doc_no']; $level4_doc_place = $level4['doc_place']; $level4_doc_type = $level4['doc_type']; ?> <div id="<?php echo $row_id;?>_sl1" class="sub_row <?php echo $row_id;?>_expand_sub"> <div class="projectstatus" style="background: #ffffff; width: 50%;"> </div> <a href="../functions/load_doc.php?doc_no=<?php echo $level4_doc_no.'&doc_place='.$level4_doc_place.'&doc_type='.$level4_doc_type;?>" class="div" target="_blank"> <div class="sub_link_text"> <?php echo $level4['level4_descr'];?> </div> </a> </div> <div class="clear"> </div> <?php } ?> </div> <?php } ?> </div> </div> <?php $row_number++; } ?> </div> </div> </div> </div> <?php } ?> </div> <div id="additional_box"> <div id="additional_info"> hold additional information document! </div> <div id="close_additional" onclick="close_additional()"> </div> </div> <script> var mousex; var mousey; $(document).mousemove( function(e) { mousex = e.pagex; mousey = e.pagey; }); function additional() { mousey -= 5; mousex += 20; $('#additional_box').css({'top':mousey,'left':mousex}).fadein('slow'); }; function close_additional() { $('#additional_box').hide(); }; function reset_expansion_icon(){ var index; var = document.getelementsbyclassname('expand_icon'); (index =0; index < i.length; ++index) { i[index].style.backgroundimage = "url('../img/expand.png')"; } } function reset_this_expansion_icon(me){ var index; var e = $(me).children('.expand_icon') (index =0; index < e.length; ++index) { e[index].style.backgroundimage = "url('../img/expand.png')"; } } $('.flag_this').click(function(){ additional(); }); $('.obsolete_btn').click(function() { $('.section').hide(); var section = $(this).closest('.section'); $(section).show(); //var btn_parent = $(this).parent(); var container = $(this).closest('.container_holder'); var obsolete = $(container).children('.obsolete_section'); $(obsolete).fadein(500); $('.sub_row').hide(); reset_expansion_icon(); }); $('.active_btn').click(function() { $('.section').fadein(500); $('.obsolete_section').hide(); $('.sub_row').hide(); reset_expansion_icon(); }); $('.expand').click(function() { var parent = $(this).parent('.top_row'); var level4_class = $(parent).attr('id') + '_level4'; var sub_row_class = $(parent).attr('id') + '_expand_sub'; var index; var e = document.getelementsbyclassname(sub_row_class); var d = document.getelementsbyclassname(level4_class); (index = 0; index < e.length; ++index) { if(e[index].style.display == 'block'){ $(d[0]).slideup('slow'); e[index].style.display = 'none'; } else{ d[0].style.display = 'block'; $(e[index]).fadein('slow'); } } var expand_icon_class = $(parent).attr('id') + '_expand_icon'; var = document.getelementsbyclassname(expand_icon_class); if (e[0].style.display == 'block') i[0].style.backgroundimage = "url('../img/condense.png')"; else var me = $(this); reset_this_expansion_icon(me); }); $(window).load(function(){ $('#parent').fadein(300); }); </script> </body> </html> <?php echo 'total execution time in seconds: ' . (microtime(true) - $time_start); ?> and the .= version (html, head , body removed load on page)
<?php $time_start = microtime(true); session_start(); include "sqlsrv_connect.php"; $skid_id = $_post['skid_id']; $vendor_id = $_post['vendor_id']; $html = " <div id='parent'> "; $sql_get_vdm_sections = " select ml2.level2_descr, ml2.level2_id main_vdm_level2 ml2 join vdm_index vdm_i on vdm_i.level2_id = ml2.level2_id vdm_i.skid_id = $skid_id , vdm_i.vendor_id = $vendor_id group ml2.level2_descr, ml2.level2_id order ml2.level2_id "; $get_vdm_sections = sqlsrv_query($sqlsrv, $sql_get_vdm_sections); while($vdm_section = sqlsrv_fetch_array($get_vdm_sections,sqlsrv_fetch_assoc)){ $level2_id = $vdm_section['level2_id']; $level2_descr = $vdm_section['level2_descr']; $html .= " <div id='s$level2' class='section'> <div class='sectionhead'> $level2_descr </div> <div class='container_holder'> <div id='o$level2_id' class='obsolete_section'> <div class='obsolete_lineholder'> <div class='obsolete_header'> <div class='clmn_header'> <p class='small bold'>obsolete documentation</p> </div> </div> </div> <div class='obsolete_lineholder'> <div class='obsolete_linkholder'> <a href='#' class='div' target='_blank'> <div class='obsolete_text'> </div> </a> </div> </div> <div class='obsolete_lineholder'> <div class='obsolete_linkholder'> <a href='#' class='div' target='_blank'> <div class='obsolete_text'> </div> </a> </div> </div> <div class='obsolete_lineholder'> <div class='obsolete_linkholder'> <a href='#' class='div' target='_blank'> <div class='obsolete_text'> </div> </a> </div> </div> </div> <div class='active_cnt'> <div class='button_holder'> <div class='active_btn'> <p class='small'>active documentation</p> </div> <div class='obsolete_btn'> <p class='small'>view obsolete documentation</p> </div> </div> <div class='lineholder'> <div class='linkholder'> <div class='clmn_header'> <p class='small bold'>chapters</p> </div> </div> </div> <div class='linkholder_cnt'> "; $file_verification = true; $sql_get_section_content = " select file_verification, level3_head, level3_descr, level4_descr, doc_no, doc_place, doc_denominator, doc_type vdm_index skid_id = $skid_id , vendor_id = $vendor_id , level2_id = $level2_id , level4_descr null "; $get_section_content = sqlsrv_query($sqlsrv, $sql_get_section_content); $row_number = 1; while ($section_content = sqlsrv_fetch_array($get_section_content,sqlsrv_fetch_assoc)){ $level3_file_verification = $section_content['file_verification']; $level3_head = $section_content['level3_head']; $level3_descr = $section_content['level3_descr']; $level3_doc_no = $section_content['doc_no']; $level3_doc_place = $section_content['doc_place']; $level3_doc_denominator = $section_content['doc_denominator']; $level3_doc_type = $section_content['doc_type']; $level3_width = 100; $row_id = 's'.$level2_id.'_r'.$row_number; $sql_get_level4 = " select file_verification, level4_descr, doc_no, doc_place, doc_denominator, doc_type vdm_index skid_id = $skid_id , vendor_id = $vendor_id , level2_id = $level2_id , level3_descr = '$level3_descr' , level4_descr not null "; $get_level4 = sqlsrv_query($sqlsrv, $sql_get_level4); $level4_array = array(); while ($level4 = sqlsrv_fetch_array($get_level4,sqlsrv_fetch_assoc)){ array_push($level4_array, $level4); } if (!empty($level4_array)){ $level3_width -= 10; $level4_active = true; } else { $level4_active = false; } if ($file_verification != true){ $level3_width -= 10; $level3_flag = true; } else { $level3_flag = false; } $html .= " <div class='lineholder'> <a href='../proj_hist.pdf' class='div' target='_blank'> <div class='project'> "; if ($level3_doc_denominator != null){ $html .= " <svg x='0px' y='0px' width='45px' height='100%' viewbox='0 0 45 25' preserveaspectratio='none'> <rect fill='#66fecb' width='27.1' height='25'></rect> <polygon fill='#66fecb' points='45,12.5 27,0.000 27,25.000 '></polygon> </svg> "; } $html .= " </div> <div class='project_name'> <div class='project_text'> $level3_doc_denominator </div> </div> </a> <div class='linkholder' > <div id='$row_id' class='top_row' > <div class='projectstatus' style='background: #ffffff; width: 100%;'> </div> "; if(!(empty($level3_head))&&empty($level3_descr)){ $html .= " <div class='link_text level3_head' style='float: left; width: 100%; white-space: nowrap;'> $level3_head </div> "; } else { $html .= " <a href='../functions/load_doc.php?doc_no=$level3_doc_no&doc_place=$level3_doc_place&doc_type=$level3_doc_type&doc_denominator=$level3_doc_denominator' class='div' target='_blank'> <div class='link_text' style='float: left; width: $level3_width%; white-space: nowrap; overflow: hidden;'> $level3_descr </div> </a> "; if($level3_flag == true){ $html .= " <div class='flag_this'> </div> "; } if ($level4_active == true){ $html .= " <div id='$row_id_expand' class='expand'> <div class='expand_icon $row_id_expand_icon'> </div> </div> "; } } $html .= " </div> <div class='clear'> </div> "; if ($level4_active == true) { $html .= " <div class='$row_id_level4'> "; foreach ($level4_array $level4){ $level4_doc_no = $level4['doc_no']; $level4_doc_place = $level4['doc_place']; $level4_doc_type = $level4['doc_type']; $level4_descr = $level4['level4_desr']; $html .= " <div id='$row_id_sl1' class='sub_row $row_id_expand_sub'> <div class='projectstatus' style='background: #ffffff; width: 50%;'> </div> <a href='../functions/load_doc.php?doc_no=$level4_doc_no&doc_place=$level4_doc_place&doc_type=$level4_doc_type' class='div' target='_blank'> <div class='sub_link_text'> $level4_descr </div> </a> </div> <div class='clear'> </div> "; } $html .= " </div> "; } $html .= " </div> </div> "; $row_number++; } $html .= " </div> </div> </div> </div> "; $time_end = microtime(true); $total_time = $time_end - $time_start; $html .= 'total execution time in seconds: ' . $total_time; } $html .= " </div> <div id='additional_box'> <div id='additional_info'> hold additional information document! </div> <div id='close_additional' onclick='close_additional()'> </div> </div> "; $script = " var mousex; var mousey; $(document).mousemove( function(e) { mousex = e.pagex; mousey = e.pagey; }); function additional() { mousey -= 5; mousex += 20; $('#additional_box').css({'top':mousey,'left':mousex}).fadein('slow'); }; function close_additional() { $('#additional_box').hide(); }; function reset_expansion_icon(){ var index; var = document.getelementsbyclassname('expand_icon'); (index =0; index < i.length; ++index) { i[index].style.backgroundimage = 'url('../img/expand.png')'; } } function reset_this_expansion_icon(me){ var index; var e = $(me).children('.expand_icon') (index =0; index < e.length; ++index) { e[index].style.backgroundimage = 'url('../img/expand.png')'; } } $('.flag_this').click(function(){ additional(); }); $('.obsolete_btn').click(function() { $('.section').hide(); var section = $(this).closest('.section'); $(section).show(); //var btn_parent = $(this).parent(); var container = $(this).closest('.container_holder'); var obsolete = $(container).children('.obsolete_section'); $(obsolete).fadein(500); $('.sub_row').hide(); reset_expansion_icon(); }); $('.active_btn').click(function() { $('.section').fadein(500); $('.obsolete_section').hide(); $('.sub_row').hide(); reset_expansion_icon(); }); $('.expand').click(function() { var parent = $(this).parent('.top_row'); var level4_class = $(parent).attr('id') + '_level4'; var sub_row_class = $(parent).attr('id') + '_expand_sub'; var index; var e = document.getelementsbyclassname(sub_row_class); var d = document.getelementsbyclassname(level4_class); (index = 0; index < e.length; ++index) { if(e[index].style.display == 'block'){ $(d[0]).slideup('slow'); e[index].style.display = 'none'; } else{ d[0].style.display = 'block'; $(e[index]).fadein('slow'); } } var expand_icon_class = $(parent).attr('id') + '_expand_icon'; var = document.getelementsbyclassname(expand_icon_class); if (e[0].style.display == 'block') i[0].style.backgroundimage = 'url('../img/condense.png')'; else var me = $(this); reset_this_expansion_icon(me); }); $(window).load(function(){ $('#parent').fadein(300); }); "; $json = array(); $json['html'] = $html; $json['script'] = $script; header('content-type: application/json'); echo json_encode( $json ); ?>
first basic benchmarking
actually... looking bit more it, concat operator should faster (often more convenient) array method...
<?php ini_set('memory_limit', '256m'); $start = microtime(true); $html = array(); ($i=0; $i < 900000; $i++) { $html[] = "line number $i\n"; } $html_out = implode('', $html); $time_spent = microtime(true) - $start; printf("array method: %ss\n", number_format($time_spent, 5)); printf("array method md5: %s\n", md5($html_out)); unset($start);unset($html);unset($html_out); $start = microtime(true); $html = ''; ($i=0; $i < 900000; $i++) { $html .= "line number $i\n"; } $time_spent = microtime(true) - $start; printf("concat method: %ss\n", number_format($time_spent, 5)); printf("concat method md5: %s\n", md5($html)); unset($start);unset($html);unset($html_out); $start = microtime(true); ob_start(); ($i=0; $i < 900000; $i++) { echo "line number $i\n"; } $html = ob_get_clean(); $time_spent = microtime(true) - $start; printf("output buffering method: %ss\n", number_format($time_spent, 5)); printf("output buffering method md5: %s\n", md5($html)); output:
array method: 0.43333s array method md5: d3700cc66c04760d857e8bc9a986399c concat method: 0.21945s concat method md5: d3700cc66c04760d857e8bc9a986399c output buffering method: 0.22360s output buffering method md5: d3700cc66c04760d857e8bc9a986399c ...then trying answer question
possible cause #1
i think reasonable explanation problem lack of physical memory - when plain echo (without output buffering), don't keep in memory - if strings concatenating relatively long, may reach limit of physical memory when store them in memory (no matter method use so)... swapping occur...?
possible cause #2
on line 237 in old code have
<div id="<?php echo $row_id;?>_expand" class="expand"> in new code (on line 250) becomes
echo "[...]<div id='$row_id_expand' class='expand'>[...]" which means looking variable called $row_id_expand - i'm guessing doesn't exist, , therefore cause write operation 1 or more error-logs each iteration of loop (and have several of same mistake elsewhere) potentially mean tens or hundreds of thousands of lines in error log per request === lot of time spent writing data.
to avoid kind of problem encapsulate variables in {}, ie. make it:
echo "[...]<div id='{$row_id}_expand' class='expand'>[...]"
Comments
Post a Comment