2

我在下面有以下 php 脚本,它使用 WAMP 从 20 个类别中读取了大约 2300 个带有图像等的产品;问题是创建 213 页的 pdf 需要 3 分钟以上;基于代码有没有提高性能的方法。我已经实现了这些更改:

在 php.ini 中

寻找:

post_max_size = 8M
upload_max_filesize = 2M
max_execution_time = 30
max_input_time = 60
memory_limit = 8M

改成:

post_max_size = 750M
upload_max_filesize = 750M
max_execution_time = 5000
max_input_time = 5000
memory_limit = 1000M

并将其添加到 C:\wamp\bin\mysql\mysql5.0.45\my.ini:

max_allowed_packet = 200M

这已经停止了我得到的 outOfMemory 异常,并且当我在我的 VPS 云服务器上使用相同的设置运行它时,它最多可以超过 10 分钟!有什么帮助吗?(我知道这是一个很大的脚本文件)(还有一个业务规则是每页 12 个产品,4 行乘 3)

<?php

// Database connection information
 require ('fpdf/fpdf.php');
 class catalogue {
var $pdf;
var $x;
var $y;
var $catName;
var $pageAdded;
var $headerAdded;
var $myFont = "futuram";
var $bgColor;
var $fontColor;
var $headerImage;
var $aTozArray;
var $pageAlreadyAdded;

// Constructor to generate a PDF of the catalogue
function catalogue() {
    global $pdf, $y;
    define ( 'EURO', chr ( 128 ) );
    $pdf = new FPDF ();

    $y = 0;
    $connect = mysql_connect ( 'localhost', 'xxxxxx', 'xxxxx' );
    if (! $connect)
        die ( 'Unable to connect to database' );
    $select = mysql_select_db ( 'XXXXXXXXXXXX' );
    if (! $select)
        die ( 'Unable to select database' );
    $pdf->SetFillColor ( 255, 255, 255 );
    $pdf->SetMargins ( 0, 0, 0 );
    $this->addPage ();

    $pdf->AddFont ( 'futuram', '', 'futuram.php' );
    $pdf->AddFont ( 'futurastdbold', '', 'futurastdbold.php' );
    $pdf->AddFont ( 'futurastdboldoblique', '', 'futurastdboldoblique.php' );
    $pdf->AddFont ( 'futurastdbook', '', 'futurastdbook.php' );
    $pdf->AddFont ( 'futurastdbookoblique', '', 'futurastdbookoblique.php' );
    $pdf->AddFont ( 'futurastdcondensed', '', 'futurastdcondensed.php' );
    $pdf->AddFont ( 'futurastdcondensedbold', '', 'futurastdcondensedbold.php' );
    $pdf->AddFont ( 'futurastdcondensedboldobl', '', 'futurastdcondensedboldobl.php' );
    $pdf->AddFont ( 'futurastdcondensedextrabd', '', 'futurastdcondensedextrabd.php' );
    $pdf->AddFont ( 'futurastdcondensedlight.php', '', 'futurastdcondensedlight.php' );
    $pdf->AddFont ( 'futurastdcondensedlightobl', '', 'futurastdcondensedlightobl.php' );
    $pdf->AddFont ( 'futurastdcondensedoblique', '', 'futurastdcondensedoblique.php' );     
    $pdf->AddFont ( 'futurastdcondensedboldobl', '', 'futurastdcondensedboldobl.php' );
    $pdf->AddFont ( 'futurastdcondextraboldobl', '', 'futurastdcondextraboldobl.php' );
    $pdf->AddFont ( 'futurastdheavy', '', 'futurastdheavy.php' );
    $pdf->AddFont ( 'futurastdheavyoblique', '', 'futurastdheavyoblique.php' );
    $pdf->AddFont ( 'futurastdlight', '', 'futurastdlight.php' );
    $pdf->AddFont ( 'futurastdlightoblique', '', 'futurastdlightoblique.php' );
    $pdf->AddFont ( 'futurastdmedium', '', 'futurastdmedium.php' );
    $pdf->AddFont ( 'futurastdmediumoblique', '', 'futurastdmediumoblique.php' );

    /*
    $pdf->AddFont ( 'Georgia', '', 'georgia.php' );
    $pdf->AddFont ( 'Georgia', 'I', 'georgiai.php' );
    $pdf->AddFont ( 'Georgia', 'B', 'georgiab.php' );
    */
    $pdf->SetAutoPageBreak ( true, 0 );


    // add the front pages
     $filename = 'http://localhost/images/Welcome_page_pic_fin-01.jpg';
     $pdf->Image ( $filename, 0, 0, 210, 297 );
     $this->addPage ();

    $this->getParent ();

    $pdf->Output ();
    // actually outputs the PDF. Can be automatically output to a file on
    // the server.
}


// Get parent categories
function getParent() {
    global $pdf, $x, $y, $page, $catName, $bgColor, $fontColor, $headerImage, $pageAlreadyAdded;

    $query = "SELECT * FROM categories";
    // This query returns all categories, but not sub categories

    $result = mysql_query ( $query );
    $numrows = mysql_num_rows ( $result );

    // For each category...
    for($i = 0; $i < $numrows; $i ++) {
        $pdf->SetFont ( 'futuram', '', 40 );
        if ($page == 2) {
            $x = 15;
            $y = 20;

            $pdf->setX ( $x );
            $pdf->setY ( $y );
            // setY defines the y coordinate

            $page ++;
            // adds a page
        } else {


                //$this->addPage ();


        }

        $array = mysql_fetch_array ( $result );
        // puts the actual category names into an $array

        $id = $array ['category_id'];
        $catName = $array ['category_name'];
        $image = $array ['category_icon'];

        $sql = "SELECT category_colour1, category_colour2, category_icon FROM categories WHERE category_id=$id";



        $coloursResult = mysql_query ( $sql );
        $coloursArray = mysql_fetch_array ( $coloursResult );

        $fontColor = $coloursArray ['category_colour1'];
        $bgColor = $coloursArray ['category_colour2'];

        $leaderImage = $coloursArray ['category_icon'];



        $pdf->setX ( 18.5 );
        // setX defines the x coordinate
        $pdf->SetFillColor ( 255, 255, 255 );
        $pdf->setTextColor ( 0, 71, 53 );


        // $pdf->Cell ( 15, 20, $catName );
         if (@GetImageSize ( $image )) {
         //$filename = $leaderImage;
        // add in for test
         $filename = $image;
         } else {
         $filename = 'http://localhost/images/blank.jpg';
         }

         $pdf->Image ( $filename, 0, 0, 210, 297 );

        // creates a cell in the page. Notes:
        // http://www.fpdf.org/en/doc/cell.htm
        // If automatic page breaking is enabled and the cell goes beyond
        // the limit, a page break is done BEFORE outputting.

         $this->addPage ();

        $filename = 'http://localhost/images/blank.jpg';


        $this->getChildren ( $id, $catName);


        // calls the getChildren() function to gather the sub categories of
        // the given category being used
    }
}

// Get children
function getChildren($parent, $catName) {
    global $pdf, $y;

    $query = "SELECT * FROM shop_categories where parent_id = $parent ORDER BY category_id"; 


    $result = mysql_query ( $query );
    $numrows = mysql_num_rows ( $result );
    // $array = mysql_fetch_array($result);

    // fix the case with $numrows = 0

    $catList = array ();

    while ( $array = mysql_fetch_array ( $result ) ) {

        array_push ( $catList, array (
                $array ['name'],
                $array ['category_id']

        ) );
    }


    $this->getProducts ( $catList,$catName );
}

// Get products in categories
function getProducts($catList,$catName) {
    global $pdf;
    $prodList = array ();
    $numSubCategories = count ( $catList );
    for($i = 0; $i < $numSubCategories; $i ++) {
        $catid = $catList [$i] [1];
        $query = "SELECT product_id,ProductName, WeightQuantity, PriceUnit, Euro, Pound, Code, Image FROM products where category_id = $catid order by product_id asc";
        $result = mysql_query ( $query );
        $numResults = mysql_num_rows($result);

        if($numResults > 0) {
        array_push ( $prodList, $result );
        }

    }   


    // If category is a parent send it back to getChildren
    if (count ( $prodList ) != 0) {
        $this->processPage ( $catList, $prodList,$catName );
    }
}
function processPage($catList, $prodList, $catName) {
    global $pdf, $catName, $page, $pageAdded, $myFont, $fontColor, $pageAlreadyAdded;
    $pdf->SetFillColor ( 255, 255, 255 );
    $itemsPerRow = 3;
    $rowsPerPage = 4;
    $currentRow = 0;
    $numItems = 0;
    $totalRows = 0;
    $numberRowsUsed = 0;
    for($i = 0; $i < count ( $prodList ); $i ++) {
        $items = mysql_num_rows ( $prodList [$i] );
        $totalRows += ceil ( $items / $itemsPerRow );
    }

    // changed this from $prodList[i] to $prodList
    for($i = 0; $i < count ( $prodList ); $i ++) {
        $subCatHeadName = $catList [$i] [0];


        if ($i > 0) {
            $numberOfitems = mysql_num_rows ( $prodList [$i - 1] );
            $numberRowsUsed += ( int ) ceil ( $numberOfitems / $itemsPerRow );
        }

        $pdf->SetFont ( 'futuram', '', 28 );
        $fonts = explode ( ",", $fontColor );

        $pdf->SetTextColor ( 122, 114, 102 ); // grey

        $p = 0;
        $q = 0;
        $pdf->SetX ( 0 );
        $pdf->SetY ( 10 );
        $pdf->SetLeftMargin ( 0 );
        $pdf->SetRightMargin ( 0 );
        $pdf->cMargin = 100;


        $p1 = 0;
        $q1 = 0;
        $pdf->SetX ( 0 );

        $numItems = mysql_num_rows ( $prodList [$i] ); // 5
        $numRows = ceil ( $numItems / $itemsPerRow ); // 2
        $remItems = $numItems % $itemsPerRow; // 2

        if ($numItems > 0) {
            for($j = 0; $j < $numRows; $j ++) {
                $this->processRow ( $itemsPerRow, $prodList [$i], $j, $currentRow,$subCatHeadName,$catName );
                $currentRow ++;
                if ($currentRow % $rowsPerPage == 0) {
                    $this->addPage ();
                    $pageAlreadyAdded = true;
                }
            }
        }
    }
}
function processRow($numItems, $result, $rowNum, $currentRow,$subCatHeadName,$catName) {
    global $pdf;
    $pdf->SetX ( 0 );
    $pdf->SetY ( 20 );
    $this->header ();
    $this->footer ();
    if ($numItems > 0) {
        for($i = 0; $i < $numItems; $i ++) {
            $this->processItem ( $result, $rowNum, $i, $currentRow,$subCatHeadName,$catName );
        }
    }
}
function processItem($result, $rowNum, $itemNum, $currentRow,$subCatHeadName, $catName) {
    global $pdf, $x, $y;
    $p1 = 0;
    $q1 = 0;
    $pdf->SetX ( 0 );
    $pdf->SetY ( $q1 + 10 );
    $pdf->SetFont ( 'futurastdmedium', '', 40 );
    $pdf->Cell ( 200, 16, $catName, 0, 5, 'C', true );

    $pdf->SetX ( 0 );
    $pdf->SetY ( $q1 + 25 );    
    $pdf->SetFont ( 'futurastdmedium', '', 10 );    
    $pdf->Cell ( 200, 8, $subCatHeadName, 0, 10, 'C', true );

    $a = 18.5;
    $b = 0;
    if ($currentRow % 4 == 0) {
        $rowNum = 0;
    } else if ($currentRow % 4 == 1) {
        $rowNum = 1;
    } else if ($currentRow % 4 == 2) {
        $rowNum = 2;
    } else if ($currentRow % 4 == 3) {
        $rowNum = 3;
    }
    $pdf->SetX ( $a );
    $pdf->SetY ( $b );
    $marginX = 0;
    $marginY = 30;
    $pdf->SetFont ( 'futuram', '', 6 );
    $array = mysql_fetch_array ( $result );
    $id = $array ['product_id'];
    $name = $array ['ProductName'];
    $price = $array ['PriceUnit'];
    $UKprice = $array ['Pound'];
    $Europrice = $array ['Euro'];
    $code = $array ['Code'];
    $weight = $array ['WeightQuantity'];
    $deltaX = 62.5;
    $deltaY = 64;

    $a = $marginX + ($itemNum * $deltaX);
    $b = $marginY + ($rowNum * $deltaY);

    $image = $array ['Image'];
    $imageName = ltrim ($image,':');
    if( $imageName == "" || $imageName == null) {
        $imageName = 'blank.jpg';
    }
    $filename = 'http://localhost/images/'.$imageName;

    // check if the image exists on the server; replaces it with a
    // placeholder otherwise

    if (@GetImageSize ( 'http://localhost/images/'.$imageName )) {
     $filename = 'http://localhost/images/'.$imageName;

     } else {
     $filename = 'http://localhost/images/blank.jpg';
     }


    if ($name != null) {
        $pdf->Image ( $filename, $a + 20, ($b), 55, 25 );
    }


    $pdf->setY ( $b + 30 );
    $pdf->setX ( $a + 5 ); // price is placed where coordinate x=150
    $pdf->setTextColor ( 122, 114, 102 );
    $pdf->SetFont ( 'futurastdheavy', '', 8.5 );
    $line1 = "";
    $line2 = "";
    if ($name != null) {
        if (strlen ( trim ( $name ) ) > 30) {
            $name = substr ( $name, 0, 30 );
            $pdf->setX ( $a + 35 );
            $pdf->Cell ( 10, 10, trim ( $name ), 0, 0, 'C' );
        } else {
            $pdf->setX ( $a + 35 );
            $pdf->Cell ( 10, 10, trim ( $name ), 0, 0, 'C' );
        }
    }
    $pdf->setY ( $b + 33 );
    $pdf->setX ( $a + 35 ); // price is placed where coordinate x=150
    //$pdf->setTextColor ( 0, 0, 0, 0 );
    $pdf->SetFont ( 'futurastdlightoblique', '', 7 );
    if ($name != null) {
        $pdf->Cell ( 10, 10, 'Weight/Quantity '.$weight." ".$price, 0, 0, 'C' );
    }
    $pdf->setY ( $b + 36 );
    $pdf->setX ( $a + 35 ); // price is placed where coordinate x=150
    //$pdf->setTextColor ( 0, 0, 0, 0 );
    $pdf->SetFont ( 'futurastdlightoblique', '', 7 );
    if ($name != null) {
        $pdf->Cell ( 10, 10, 'Price Unit <Euro> <Pound>', 0, 0, 'C' );
    }

    $pdf->setY ( $b + 39 );
    $pdf->setX ( $a + 35 ); // price is placed where coordinate x=150
//  $pdf->setTextColor ( 0, 0, 0, 0 );
    $pdf->SetFont ( 'futurastdbook', '', 7 );

    $UKprice = utf8_decode("£" . number_format($UKprice, 2));

    $Europrice = utf8_decode("EUR" . number_format($Europrice, 2));


    if ($name != null) {
        // $this->cell(10,10,iconv("UTF-8", "ISO-8859-1", "£"). $money,0);
         $pdf->Cell ( 10, 10, "PRICE: ".$Europrice ."  ".$UKprice, 0, 0, 'C' );
    }
    $pdf->setY ( $b + 42 );
    $pdf->setX ( $a + 35 ); // price is placed where coordinate x=150
    //$pdf->setTextColor ( 0, 0, 0, 0 );
    $pdf->SetFont ( 'futurastdbold', '', 8.5 );
    if ($code != null) {
        $pdf->Cell ( 10, 10, "CODE: ".trim($code), 0, 0, 'C' ); // the product code
                                                             // goes
                                                             // here, in
    }

    //$pdf->setTextColor ( 0, 0, 0, 0 );
    $pdf->SetFont ( 'futurastdbold', '', 8.5 );
    // $y += 10; //move the y location down 10 (pixels...?)
    $pdf->setXY ( $a, $b + 32.5 ); // place the 'cursor' at these coordinates
    $pdf->SetLeftMargin ( 0 );
    $pdf->SetRightMargin ( 0 );

    $pdf->setY ( 0 );
    $pdf->setX ( 0 ); // price is placed where coordinate x=150
}

// Function to add a page to the PDF
function addPage() {
    global $pdf, $page, $y, $pageAdded;
    $pdf->AddPage ();
    // NOTE: this could have been $pdf->AddPage(P, A4) where P=portrait and
    // A4 is page size.
    // See http://www.fpdf.org/en/doc/addpage.htm

    $pdf->Rect ( 0, 0, 250, 350, 'F' ); // The 'F' here means 'filled'. could
                                        // also be
                                        // 'D' for drawn border-only or DF for
                                        // drawn and
                                        // filled
    $y = 5;
    $pdf->setY ( $y );
    $page ++;
    $pageAdded = true;
}
function header() {
    global $pdf, $catName, $pageAdded, $headerAdded, $myFont, $fontColor, $bgColor, $headerImage;
    if ($pageAdded == true) {

        $pdf->SetLeftMargin ( 68.5 );
        $pdf->SetRightMargin ( 0 );
        $pdf->SetFont ( 'futuram', '', 10 );
        $pdf->SetX ( 0 );
        $pdf->SetY ( 0 );
        $pdf->SetFillColor ( 255, 0, 0 ); // grey
        $pdf->Cell ( 77, 3, '', 0, 5, 'C', true );

        $pdf->SetLeftMargin ( 0 );
        $pdf->SetRightMargin ( 0 );
        $title = $catName;
        $image = $headerImage;
        $pdf->SetFont ( 'futuram', '', 40 );
        $pdf->SetX ( 0 );
        $pdf->SetY ( 3 );

        $fonts = explode ( ",", $fontColor );
        $bg = explode ( ",", $bgColor );
        $pdf->SetFillColor ( 255, 255, 255 ); // pure white
        $pdf->SetLineWidth ( 1 );
        $pdf->cMargin = 15;
        $pdf->Ln ( 10 );
        $headerAdded = true;
    }
    $pageAdded = false;
    $pdf->SetFont ( 'futuram', '', 14 );
    $pdf->SetFillColor ( 255, 255, 255 ); // white
}

function footer() {
    global $pdf, $headerAdded, $myFont, $fontColor, $bgColor;
    if ($headerAdded == true) {

        $pdf->SetLeftMargin ( 0 );
        $pdf->SetRightMargin ( 0 );
        $pdf->SetFont ( 'futurastdlight', '', 9 );
        $pdf->SetX ( 0 );
        $pdf->SetY ( - 18 );

        $fonts = explode ( ",", $fontColor );
        $bg = explode ( ",", $bgColor );
        $pdf->SetFillColor ( 255, 255, 255 ); // grey
        $pdf->SetTextColor ( 122,114,102 ); // whitesmoke
    //  $pdf->Cell ( 0, 3, 'PRICES SUBJECT TO FLUCTUATION', 0, 1, 'C', true );
        $pdf->SetX ( 18.5 );

        $pdf->SetLeftMargin ( 0 );
        $pdf->SetRightMargin ( 0 );
        $pdf->SetX ( 4 );
        $pdf->SetY ( -0.05 );
        $pdf->SetFillColor ( 255, 0, 0 ); // grey
        $pdf->Cell ( 28, -4,  $pdf->PageNo (), 0, 0, 'C', true );
        $pdf->SetFillColor ( 255, 255, 255 ); // grey


        $pdf->SetLeftMargin ( 68.5 );
        $pdf->SetRightMargin ( 0 );
        $pdf->SetX ( 50 );
        $pdf->SetY ( - 3 );
        $pdf->SetFillColor ( 255, 0, 0 ); // grey
        $pdf->Cell ( 77, 3, '', 0, 5, 'C', true );
        $pdf->SetFillColor ( 255, 255, 255 ); // grey

        $pdf->SetLeftMargin ( 184 );
        $pdf->SetRightMargin ( 0 );
        $pdf->SetX ( 4 );
        $pdf->SetY ( -0.05 );
        $pdf->SetFillColor ( 255, 0, 0 ); // grey
        $pdf->Cell ( 28, -4,  $pdf->PageNo (), 0, 0, 'C', true );
        $pdf->SetFillColor ( 255, 255, 255 ); // grey
    }

    $headerAdded = false;
    $pdf->SetFont ( $myFont, '', 14 );
    $pdf->SetFillColor ( 255, 255, 255 );
}

}

$catalogue = 新目录 (); ?>

4

0 回答 0