I have the following php script below that reads in about 2300 products with images etc from 20 categories using WAMP; the problem is that it take over 3 mins to create a pdf of 213 pages; based on the code is there a way of improving performance. I have already implemented these changes:
In php.ini
Find:
post_max_size = 8M
upload_max_filesize = 2M
max_execution_time = 30
max_input_time = 60
memory_limit = 8M
Change to:
post_max_size = 750M
upload_max_filesize = 750M
max_execution_time = 5000
max_input_time = 5000
memory_limit = 1000M
And add this to C:\wamp\bin\mysql\mysql5.0.45\my.ini:
max_allowed_packet = 200M
this has stopped the outOfMemory exception I was getting & also when I run it on my VPS cloud server with the same settings it can up to over 10 minutes! any help please?(I know it's a big script file)(there is also a business rule of 12 products per page, 4 rows by 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 = new catalogue ();
?>