PHP-отчет очень медленно и вылетает в Firefox - PullRequest
0 голосов
/ 10 января 2012

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

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 лучше?

1 Ответ

0 голосов
/ 10 января 2012

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...