ajax - PHP performance drops when adding while output string to variable -


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