2012-01-10 2 views
0

У меня есть отчет, который запускает и возвращает 366 записей, каждый из которых содержит эскиз, который составляет 104 x 80 пикселей. Проблема в том, что отчет работает очень медленно, хотя я увеличил размер памяти.php-отчет очень медленный и сбой в firefox

ini_set('memory_limit', '128M'); 
ini_set('max_execution_time','600'); 

После написания запроса SQL сгенерировать элементы таблицы здесь

generate_table_items($query_all_items); 

Это затем проходит через и проверки для изображения в столбцах

function generate_table_items($query){ 
     $columns = array(); 
     $resultset = array(); 

     $scriptname = array(); 
     $scriptname[0] = "/reports/all_items.php"; 
     $scriptname[1] = "/reports/all_items_by_value.php"; 
     $columncount = 0; 

     $rowcost = 0; 
     $rowsale = 0; 

     while ($row = mssql_fetch_assoc($query)) { 

      if (empty($columns)) { 

       $columns = array_keys($row); 
       echo '<tr><th scope="col" >'.implode('</th><th scope="col" >',get_column_name($columns)).'</th></tr>'; 
       $columncount = sizeof(array_keys($row)); 
      } 
      $resultset[] = $row; 

      echo '<tr><td>'.implode('</td><td>',report_image_check($row)).'</td></tr>'; 

      if(in_array($_SERVER['SCRIPT_NAME'],$scriptname)){ 
       $colspan = (count($columns)-2); 
       echo "<tr><th scope='row'>Documents</th><td colspan='$colspan' >"; 
        $PKID = $row['ID']; 

        if($row['SumOfTotalCost'] || $row['SumOfSalePrice']){ 
         $rowcost += $row['SumOfTotalCost']; 
         $rowsale += $row['SumOfSalePrice']; 
         $get_total = true; 
        } 

        $query_docs = mssql_query("select documents.* from dbo.documents where documents.Antiquities_id = $PKID") or die ('get docs query failed ' . mssql_get_last_message()); 
        while($row_docs = mssql_fetch_assoc($query_docs)){ 
         $document = "../documents/" . $row_docs['document']; 
         echo "<a href='$document' title='opens in a new window' target='_blank' >" . $row_docs['document'] . "</a> | "; 
        } // End while (list docs) 
        mssql_free_result($query_docs);   
       echo "</td></tr>"; 
       myflush(); 
      } // End if all items and all items by value report 

     } // End While 
     echo '<tr>'; 
     for($i=0;$i < $columncount-4;$i++){ 
      echo '<td>&nbsp;</td>'; 
     } 
     echo '<td>Total Cost '. $rowcost.'</td>'; 
     echo '<td>Total Sale '. $rowsale.'</td>'; 
     echo '<td>Total Calculated Difference '. ($rowsale-$rowcost).'</td></tr>'; 

} // End function 

function get_column_name($columns){ 
$newcol = array(); 
$scriptname = array(); 
$scriptname[0] = "/reports/all_items.php"; 
$scriptname[1] = "/reports/all_items_by_value.php"; 
$thecount = 0; 
foreach($columns as $col) { 
    if($thecount == 1 && in_array($_SERVER['SCRIPT_NAME'],$scriptname)) { 
     // Don't list the PK 
    } else { 
     $newcol[] = '<img id="'.$col.'" src="../images/icons/arrow_down.png" alt="click to sort by" onclick="sortby(\''.$col.'\');" />' . $col; 
    } 
$thecount++;  
} 

/*if(in_array($_SERVER['SCRIPT_NAME'],$scriptname)){ 
    $newcol[] = "documents"; 
}*/ 

return $newcol; 
} 

function report_image_check($row){ 
global $base_url, $uploaded_images_folder; 
$newrow = array(); 
$imageext = array(); 

$imageext[0] = ".jpg"; 
$imageext[1] = ".png"; 
$imageext[2] = ".gif"; 
$imageext[3] = ".tiff"; 

$scriptname = array(); 
$scriptname[0] = "/reports/all_items.php"; 
$scriptname[1] = "/reports/all_items_by_value.php"; 
$PKID = 0; 
$thecount = 0; 

foreach($row as $rn) { 

    if(in_array(strtolower(substr($rn,-4)),$imageext)){ 
     $small_img_ext = substr($rn,-4); 
     $small_img = substr($rn,0,strripos($rn,".")); 
     $small_img = $small_img . '_140_105' . $small_img_ext; 
     $newrow[] = '<a href="' . $base_url . $uploaded_images_folder . '/' . $small_img . '" title="click to zoom on image" target="_blank" ><img src="' . $base_url . $uploaded_images_folder . '/' . $rn . '" alt="" width="50px" height="50px" /></a>'; 
    } elseif($thecount == 1 && in_array($_SERVER['SCRIPT_NAME'],$scriptname)) { 
     $PKID = $rn; 
    } elseif($thecount == 2 && in_array($_SERVER['SCRIPT_NAME'],$scriptname)) { 
     $newrow[] = "<a href='../index.php?template=10&amp;PKID=$PKID' target='_blank' >$PKID (click to view)</a>"; 
    } else { 
     $newrow[] = $rn; 
    } 

    $thecount++; 
    myflush(); 
} 

/*if (in_array($_SERVER['SCRIPT_NAME'],$scriptname)) { 
    $newrow[] = "<a href='#&amp;PKID=$PKID' target='_blank' >Documents (click to view)</a>"; 
}*/ 

return $newrow; 

} // End function 

//// Flushing function 
function myflush(){ 

ob_implicit_flush(); 
ignore_user_abort(); 
} 

Может кто-нибудь увидеть проблему с этот код или посмотреть, почему это займет так много времени или почему он сбой firefox? Будет ли печать в формате PDF работать лучше?

ответ

0

Это займет много времени, потому что вложенные SQL-запросы ... выполняется второй SQL-запрос для каждого результата, который был возвращен первым запросом .... Выполнение одного запроса с помощью JOIN должно помочь производительность значительно.

Печать в формате PDF почти наверняка будет медленнее: вы могли бы извлечь много кода, чтобы правильно позиционировать в отчете сам или использовать одну из библиотек, которые могут принимать HTML-код и отображать его в формате PDF (как вы уже генерируете HTML в любом случае на данный момент, это будет дополнительная обработка)

+0

Правый ага (не группа). Я попробую. –

+0

Хорошо, я действительно полностью вынул запрос на документы (так что только зацикливая результаты по одному запросу в запросе), и он по-прежнему падает. : o (И с соединением он будет возвращать несколько строк, так как в базе данных может быть более одного документа для каждого элемента. –

+0

С соединением вы можете выполнить простой тест «если», чтобы соответствовать значению для одного из « первая таблица "(например, ПК), разветвляя код в зависимости от ситуации. Это требует немного более логики PHP, но уменьшает количество запросов к базе данных, которые вы выполняете с 367 до 1 ..., что гарантирует экономию производительности. это сбой в FF - это другое дело. –

Смежные вопросы