3

Possible Duplicate:
Simplest way to profile a PHP script

We are building this online application using MVC approach (but a bit tweeked). The structure of the application goes like this.

class Page{
    private $title;
    private $css;
    private $type;
    private $formData;
    private $obj;

    public function __construct($type){
        //this instance variable is designed to set form data which will appear on the pages
        $this->formData = array();
        $this->setup($type);

    }

    public function setTitle($var){
        $this->title = 'Page : ';
        $this->title .= $var;
    }

    public function getFormData() {
        return $this->formData;
    }


    private function setFormData($tmpObjs) {
        $finData = array();

        foreach($tmpObjs as $value){
            if($value == $this->obj && isset($_GET['new']))
                $newValue = 'true';
            else
            $newValue = 'false';

            $tmpData = array();
            $tmpData = $value->getData($newValue);
            $finData = array_merge($finData, $tmpData);

        }
        return $finData;
    }

    public function getTitle(){
        return $this->title;
    }

    public function displayCSS($_SESSION){
        $GlobalConfig = $_SESSION['Config'];

        $CSS = array();
        $CSS = $GlobalConfig->getCSS();

        $SIZE = count($CSS);

        foreach($CSS as $key => $value){
            echo "<link href=\"".$CSS[$key]."\" type=\"text/css\" rel=\"stylesheet\" />\n";
        }
    }

    public function displayJS($_SESSION){
        $GlobalConfig = $_SESSION['Config'];

        $JS = array();
        $JS = $GlobalConfig->getJS();

        $SIZE = count($JS);

        foreach($JS as $key => $value){
            echo "<script src=\"".$JS[$key]."\" type=\"text/javascript\"></script>\n";
        }
    }

    function setPageType($type)
    {
    $this->type = $type;
    }

    // This is used when you are filtering whatever type for search function

    function getPageType(){
    $type = $this->type;
    echo $type;
    }


    function setup($type){
        $this->type = $type;
        switch($this->type){

            case "AccountExpiry":

            break;

            case "Home":
                $CalendarExpiryItemList = new CalendarExpiryItemList();
                $CalendarExpiryItemList->createList();

                $_SESSION['Active_Form'] = 'homepage-record';
                $this->obj = $CalendarExpiryItemList;

                $objs = array($CalendarExpiryItemList);
                $this->formData = $this->setFormData($objs);

                $this->setTitle('Home');

            break;        
        }
    }

    function generateJS(){
        if(file_exists('../classes/Javascript.class.php'))
            include_once '../classes/Javascript.class.php';

        $JSType = str_replace(" " , "", ucwords(str_replace("-", " ", substr(end(explode("/", $_GET['page'])), 0, -4))));
        $JSType = $_GET['page'];

        if(substr($JSType, -1) == 's')
             $JSType = substr ($JSType, 0, -1);

        echo $JSType;
        $new_obj_name = $JSType . "JS";

        $jsObj = new $new_obj_name($this->type);        
    }


    function getObject(){
        return $this->obj;
    }

    //There is more code, file has been omitted for forum
}

The following is the CalendarExpiryItemList class

class CalendarExpiryItemList
{
    private $List = array();

    public function __construct()
    {
        //Nothing To Do Yet
    }

    public function createList($Type = "Followups")
    {
        switch($Type)
        {
          case "ALL":
             $this->List = array();
             $this->getAllItemsInArray();
             return $this->List;
          break;

          case "Invoice":
            $this->List = array();
            $this->getInvoiceCalendarItems();
            return $this->List;
          break;

          case "Followups":
            $this->List = array();
            $this->getFollowUpExpiryItems();
            return $this->List;
          break;
        }
    }

    public function _compare($m, $n)
    {
        if (strtotime($m->getExpiryDate()) == strtotime($n->getExpiryDate()))
        {
            return 0;
        }

        $value =  (strtotime($m->getExpiryDate()) < strtotime($n->getExpiryDate())) ? -1 : 1;

        echo "This is the comparison value" . $value. "<br/>";

        return $value;
    }

    public function display()
    {
        foreach($this->List as $CalendarItem)
        {
            echo "<tr>";
                if($CalendarItem->getType() != "ContractorInsurance")
                    echo "<td>".DateFormat::toAus($CalendarItem->getExpiryDate())."</td>";
                else
                    echo "<td>".$CalendarItem->getExpiryDate()."</td>";
                echo "<td>".$CalendarItem->getType()."</td>";
                echo "<td>".$CalendarItem->getDescription()."</td>";
                echo "<td>".$CalendarItem->doAction()."</td>";
            echo "</tr>";
        }
    }

    public function getData()
    {
        $data = array();
        $data['Rows'] = "";
        $TempArray1 = array();

        foreach($this->List as $CalendarItem)
        {
            $Temp = "";
            $Temp .= "<tr>";
                if($CalendarItem->getType() != "ContractorInsurance")
                     $Temp .= "<td>".DateFormat::toAus($CalendarItem->getExpiryDate())."</td>";
                else
                    $Temp .= "<td>".$CalendarItem->getExpiryDate()."</td>";
                $Temp .= "<td>".$CalendarItem->getType()."</td>";
                $Temp .= "<td>".$CalendarItem->getDescription()."</td>";
                $Temp .= "<td>".$CalendarItem->doAction()."</td>";
            $Temp .= "</tr>";
            $TempArray1[] = $Temp;
        }

        if(count($TempArray1) == 0)
        {
            $Row = "<tr><td colspan='4'>No Items overdue</td></tr>";
            $TempArray1[] = $Row;
        } 

        $data['Rows'] = $TempArray1;
        return $data;

    }

    //---------------Private Functions----------------
    private function SortArrayDate()
    {
        $TempArray = array();
        $TempArray = $this->List;

        $this->List = array();

        foreach($TempArray as $CalendarItem)
        {
            $this->List[$CalendarItem->getExpiryDate()] = $CalendarItem;
        }

        ksort($this->List);

    }

    private function getAllItemsInArray()
    {
        $this->getInvoiceCalendarItems();
        $this->getFollowUpExpiryItems();
        $this->getProjectExpiryItems();
        $this->getVehicleExpiryItems();
        $this->getUserInsuranceExpiryItems();
        $this->getContractorExpiryItems();

        //$this->SortArrayDate();
    }

    private function getContractorExpiryItems()
    {
        $SQL = "SELECT * FROM  `contractor_Details` WHERE  `owner_id` =".$_SESSION['user_id'];

        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $InsLic = new ContractorInsLis();
            $InsLic->getContractorInsLisById($row->contractor_id);

            if($InsLic->CheckExpiry($InsLic->getwcic_expiry_date()) == 'Expired')
            {
                $ContractorExpiryItem = new ContractorInsuranceExpiryItem($row->contractor_id,$InsLic->getwcic_expiry_date(),"Contractor ".$row->first_name." ".$row->last_name."'s Workers Comp License expired on ".$InsLic->getwcic_expiry_date());
                $this->List[] = $ContractorExpiryItem;
            }

            if($InsLic->CheckExpiry($InsLic->getpli_expiry_date()) == 'Expired')
            {
                $ContractorExpiryItem = new ContractorInsuranceExpiryItem($row->contractor_id,$InsLic->getpli_expiry_date(),"Contractor ".$row->first_name." ".$row->last_name."'s Public Liability Insurance expired on ".$InsLic->getpli_expiry_date());
                $this->List[] = $ContractorExpiryItem;
            }

            if($InsLic->CheckExpiry($InsLic->getcontractor_expiry_date()) == 'Expired')
            {
                $ContractorExpiryItem = new ContractorInsuranceExpiryItem($row->contractor_id,$InsLic->getcontractor_expiry_date(),"Contractor ".$row->first_name." ".$row->last_name."'s Contractor License expired on ".$InsLic->getcontractor_expiry_date());
                $this->List[] = $ContractorExpiryItem;
            }

            if($InsLic->CheckExpiry($InsLic->getwcic_expiry_date()) == 'Expired')
            {
                $ContractorExpiryItem = new ContractorInsuranceExpiryItem($row->contractor_id,$InsLic->getcompany_expiry_date(),"Contractor ".$row->first_name." ".$row->last_name."'s Company License expired on ".$InsLic->getcompany_expiry_date());
                $this->List[] = $ContractorExpiryItem;
            }
        }
    }

    private function getUserInsuranceExpiryItems()
    {
        $SQL = "SELECT * FROM `user_my_insurances_licences` WHERE `user_id`=".$_SESSION['user_id'];
        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $UserInsuranceLicenses = new UserMyLicenseInsurance();
            if($UserInsuranceLicenses->CheckExpiry($row->DL_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->DL_expiry_date,"DL #".$row->DL_number." has expired on ".$row->DL_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->CL_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->CL_expiry_date,"CL #".$row->CL_number." has expired on ".$row->CL_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->BL_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->BL_expiry_date,"BL #".$row->BL_number." has expired on ".$row->DL_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->wcic_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->wcic_expiry_date,"Workers Compe #".$row->wcic_policy_number." has expired on ".$row->wcic_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->pli_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->pli_expiry_date,"Public Liability #".$row->pli_policy_number." has expired on ".$row->pli_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->cwi_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->cwi_expiry_date,"Contract Worker Insurance #".$row->cwi_policy_number." has expired on ".$row->cwi_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->hoi_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->hoi_expiry_date,"Home Owners Insurance #".$row->hoi_policy_number." has expired on ".$row->hoi_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->pii_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->pii_expiry_date,"Professional Indemnity Owners Insurance #".$row->pii_policy_number." has expired on ".$row->pii_expiry_date);
                $this->List[] = $ExpiredItem;
            }

            if($UserInsuranceLicenses->CheckExpiry($row->tic_expiry_date) == 'Expired')
            {
                $ExpiredItem = new UserInsuranceExpiryItem($_SESSION['user_id'],$row->tic_expiry_date,"Tools Insurance #".$row->tic_policy_number." has expired on ".$row->tic_expiry_date);
                $this->List[] = $ExpiredItem;
            }
        }
    }

    private function getVehicleExpiryItems()
    {
        $SQL = "SELECT * FROM  `user_my_motor_vehicles` WHERE  `user_id` =".$_SESSION['user_id'];
        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $UserMotorVehicles = new UserMotorVehicles();
            if($UserMotorVehicles->CheckExpiry($row->vehicle_registration_expiry_date) == 'Expired')
            {
                $VehicleRegistration = new VehicleExpiryItem($row->id,$row->vehicle_registration_expiry_date,"Vehicle ".$row->vehicle_reg_no." Registration Expired on ".$row->vehicle_registration_expiry_date);
                $this->List[] = $VehicleRegistration;
            }

            if($UserMotorVehicles->CheckExpiry($row->insurance_expiry_date) == 'Expired')
            {

                $VehicleInsurance = new VehicleExpiryItem($row->id,$row->insurance_expiry_date,"Vehicle ".$row->vehicle_reg_no." Insurace Expired on ".$row->insurance_expiry_date);
                $this->List[] = $VehicleInsurance;
            } 
        }
    }

    private function getProjectExpiryItems()
    {
        $SQL = "SELECT * FROM my_project WHERE user_id =".$_SESSION['user_id']." AND ((end_date < '".date('Y-m-d')."') OR (end_date = '".date('Y-m-d')."') OR end_date='0000-00-00') AND (actual_end_date = '' OR actual_end_date = ' ' OR actual_end_date = '0000-00-00')";

        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $Project = new ProjectExpiryItem($row->project_id,$row->end_date,"Project ".$row->project_name." was due on ".$row->end_date,$row->start_date);
            $this->List[] = $Project;

        }
    }

    private function getInvoiceCalendarItems()
    {
        $SQL = "SELECT * FROM project_invoices WHERE (dueDate < '".date('Y-m-d')."') AND (date_paid ='0000-00-00' OR date_paid='') AND (user_id = ".$_SESSION['user_id'].") LIMIT 0, 10";
        $RESULT = mysql_query($SQL);

        while($row = mysql_fetch_object($RESULT))
        {
            $Invoice = new InvoiceExpiryItem($row->id,$row->invoice_date,"Invoice #".$row->id." is overdue.");
            //testObj(array($Invoice));
            $this->List[] = $Invoice;
        }
    }

    private function getFollowUpExpiryItems()
    {
        $SQL = "SELECT * from followUps WHERE owner_id=".$_SESSION['user_id']." AND ((Date_Due < '".date('Y-m-d')."') OR (Date_Due = '".date('Y-m-d')."') OR (Date_Due = '0000-00-00')) AND Completed != '1'";
        $RESULT = mysql_query($SQL);

        while($row =  mysql_fetch_object($RESULT))
        {
            $Form_Id = new FormId();
            $Description = "Follow Up on ".$Form_Id->getFormNam($row->Form_id)." was due on ".$row->Date_Due;
            $FollowUp = new FollowUpExpiryItem($row->Id,$row->Date_Due,$Description);
            $this->List[] = $FollowUp;
        }
    }

This is the pagination Class

<?php

class Pagination {
    protected $Items = array();
    protected $Type = "default";
    protected $Title = "List of ";
    protected $Base_Url = "";
    protected $Table;

    //-------------------------Table Settings----------------//
    protected $No_Of_Columns = NULL;
    protected $No_Of_Items_Per_Page = 10; //By Default 10 items will be displayed on a page.protected
    protected $Present_Page = 0;
    protected $Columns = array();
    protected $Rows = array();

    //------------------------Table Class Attributes---------//
    protected $Table_Class = "";
    protected $Table_Id = "";
    protected $GETVarName = "PP";

    /**
     *
     */
    public function __construct()
    {
        $this->Table = false;
    }

    public function paginate()
    {
        //Check if the base url is set
        if(strlen($this->Base_Url) == 0){
            echo "Error: Could not paginate, No base url Found!";
        }

        //Set the Current page value to Present Page
        if(isset($_GET))
        {
            if(isset($_GET[$this->GETVarName])){
                $this->Present_Page = intval($_GET[$this->GETVarName]);
            } else {
                $this->Present_Page = 1;
            }
        }

        //Draw the table and the values
        $this->generatePaginationTable();
    }

    public function setData($data)
    {
        if(is_array($data)){
            $this->Rows = $data;
            return true;
        } else {
            return false;
        }
    }

    public function putData($object,$functionName = "generateRow")
    {
        $TempData = array();
        if(method_exists($object,"getObjs"))
        {
            $ObjectArray = $object->getObjs();
        }

        if(method_exists($object,$functionName))
        {
            foreach($ObjectArray as $Obj)
            {
                $TempData[] = $object->$functionName($Obj);
            }
        }

        $this->setData($TempData);
        unset($TempData);
    }

    public function setIsTable($val)
    {
        $this->IsTable = $val;
    }

    public function addColumnNames($Col){
        if(is_array($Col)){
            $this->No_Of_Columns = $Col;
        } else {
            return false;
        }
    }

    /**
     * @param $config (array)
     * @return bool
     *
     * this function initializes the Pagination object with the
     * initial values
     */
    public function initialize($config)
    {
        if(is_array($config))
        {
            foreach($config as $key => $value)
            {
                if(isset($this->$key))
                {
                    $this->$key = $value;
                } 
            }
        } else if(is_object($config)) {
            return false;
        } else if(is_string($config)){
            return false;
        }
    }


    //------------------------------Private Function For the Class-------------------------//
    private function generatePaginationTable()
    {
        if($this->Table){
            $this->StartTable();
            $this->DisplayHeader();
        }

        $this->DisplayData();
        $this->DisplayLinks();

        if($this->Table)
            echo "</table>";
    }

    private function DisplayLinks()
    {
        if($this->Table){
        echo "<tr>";
        echo '<td colspan="'. count($this->Rows) .'">';
            $this->GenerateLinkCounting();
        echo '</td>';
        echo "</tr>";
        } else {
            if(count($this->Rows) > 0)
            {
                $ROW = $this->Rows[0];
                $ColSpan = substr_count($ROW,"<td");

                 echo "<tr>";
                echo '<td colspan="'. $ColSpan .'" align="right">';
                $this->GenerateLinkCounting();
                echo '</td>';
                echo "</tr>";
            }
        }
    }

    private function GenerateLinkCounting()
    {
        $this->Base_Url .= $this->getOtherGetVar();
        $StartCount = 1;
        $EndCount = count($this->Rows) / $this->No_Of_Items_Per_Page;

        for($i=0; $i < $EndCount; $i++)
        {
            if($i == 0)
            {
                echo ' <a href="'. $this->Base_Url.'&'.$this->GETVarName .'='.intval($i+1). '" >First</a> ';
            } else if($i == intval($EndCount)){
                echo ' <a href="'. $this->Base_Url.'&'.$this->GETVarName .'='.intval($i+1).'" >Last</a> ';
            } else {
                echo ' <a href="'. $this->Base_Url.'&'.$this->GETVarName .'='.intval($i+1). '" >'.intval($i+1).'</a> ';
            }

        }
    }

    private function getOtherGetVar()
    {
        $Link = "";
        if(isset($_GET))
        {
            foreach($_GET as $key => $val)
            {
                if($key != $this->GETVarName)
                {
                   $Link .= "&".$key."=".$val;
                }
            }
        }

        $h = preg_split("/&/",$this->Base_Url);

        $this->Base_Url = $h[0];
        return $Link;
    }

    private function DisplayData()
    {
        $Index = 0;
        $StartIndex = intval(intval($this->Present_Page-1) * $this->No_Of_Items_Per_Page);


        $EndIndex = intval($StartIndex + $this->No_Of_Items_Per_Page);
        foreach($this->Rows as $Row)
        {
            $Index++;
            if($Index >= $StartIndex && $Index <= $EndIndex)
            {
                echo "<tr>";
                    if(is_array($Row))
                    {
                        foreach($Row as $key => $value){
                            echo "<td>".$value."</td>";
                        }
                    } else {
                        echo $Row;
                    }

                echo "</tr>";
            } 
        }
    }

    private function DisplayHeader()
    {
        if(is_array($this->Columns))
        {
            echo "<thead>";
                echo "<tr>";

                foreach($this->Columns as $Col => $value)
                {
                    echo "<td>".$value."</td>";
                }

                echo "</tr>";
            echo "</thead>";
        }
    }

    private function StartTable()
    {
        echo "<table ";
        if(strlen($this->Table_Class) > 0)
                echo 'class="'.$this->Table_Class.'" ';

        if(strlen($this->Table_Id) > 0)
                echo 'id="'.$this->Table_Id.'" ';

        echo ">";
    }


}

Final Implementation of the File

<?php
$Page = new Page('Home');

$data = $Page->getFormData();

$Pagination = new Pagination();

$config = array();
$config['Table'] = false;
$config['No_Of_Items_Per_Page'] = 25;
$config['Base_Url'] = base_url() . 'BootLoader.php?page=Homepage';
$config['GETVarName'] = "ODL";

$Pagination->initialize($config);
$Pagination->setData($data['Rows']);



/**
 * Want to have multiple lists
 */

$CalendarExpiryList = $Page->getObject();

$CalendarExpiryList->createList("Invoice");

$InvoiceList = new Pagination();

$config = array();
$config['Table'] = false;
$config['No_Of_Items_Per_Page'] = 25;
$config['Base_Url'] = base_url() . 'BootLoader.php?page=Homepage';
$config['GETVarName'] = "OIDL";

$InvoiceList->initialize($config);

$data2 = $CalendarExpiryList->getData();
$InvoiceList->setData($data2['Rows']);

//This is the display
include_once("Forms/homepage/home-page.html.php");

?>

The PHP Script runs fine. It takes about 0.03 to load. But when the script reaches the CalendarExpiryItemList class. It takes about 30 seconds and my server times out.

Each table would have around 12 to 15 fields on an average and about 10 to 100 records to go through.

I am on hosting with a hosting company they have load balancers. So if my scripts takes more than 30 seconds the load balancer resets my connection and return an error saying "Server sent no data"

Community
  • 1
  • 1
user1210155
  • 103
  • 2
  • 6
  • 3
    This is a lot of code. You're probably best off finding the exact bottleneck through profiling: [Simplest way to profile a PHP script](http://stackoverflow.com/questions/21133/simplest-way-to-profile-a-php-script) – Pekka Feb 15 '12 at 00:54
  • Alternatively: [What is the best way to profile PHP code](http://stackoverflow.com/q/133686) – Pekka Feb 15 '12 at 00:54
  • 1
    Posting hundreds of lines of code, then asking stuff like why doesn't it work will never get you any answers. you need to ask shorter questions. – iWantSimpleLife Feb 15 '12 at 00:59
  • Read the very bottom of the question, may help answer it. – John V. Feb 15 '12 at 01:00

1 Answers1

1

As the others say you should try profile your code.

...without being able to debug the code, maybe one or more of the methods in CalendarExpiryItemList class is failing at some point either; on the query, or associated query, or returning a endless loop. You should test and debug each method individually on a your test server to see what results your getting. For a quick and dirty test, just log the output of each method to a file. Also check $_SESSION['user_id'] has a value and use ". (int) $_SESSION['user_id'] as well before sending it the db in case its empty because its not escaped.

gus
  • 765
  • 3
  • 14
  • 26
  • I finally found the problem.. Thanks to Pekka for Profiling. The error is in the dynamic function it has a memory leak thanks man.. – user1210155 Feb 15 '12 at 03:25
  • Cool, I didn't have time to set it up and profile it, im doing my own 100,000+ liner so im a bit pushed for time... – gus Feb 15 '12 at 03:34
  • 1
    1 other thing you might to change is to put the objects outsite the while loop you don't need them in there. Its not really good practice to loop objects and it eats memory. – gus Feb 15 '12 at 03:44
  • $InsLic = new ContractorInsLis();while($row = mysql_fetch_object($RESULT)) { $InsLic->getContractorInsLisById($row->contractor_id); – gus Feb 15 '12 at 03:45