| 
<?php
 $startTime = intval(date("U"));
 
 require_once __DIR__ . '/../vendor/autoload.php';
 
 use JLaso\ToolsLib\ProgressBar;
 
 /**
 * Class SampleUnoptimized
 *
 * This sample was converted to a class in order to obtain data with XDebug and analyze with qCacheGrind
 */
 class SampleUnoptimized
 {
 protected $conn;
 protected $startTime;
 
 /**
 * SampleUnoptimized constructor.
 */
 public function __construct()
 {
 $this->startTime = intval(date("U"));
 $options = getopt("h::u::p::d::");
 
 $host = isset($options['h']) ? $options['h'] : 'localhost';
 $user = isset($options['u']) ? $options['u'] : 'root';
 $password = isset($options['p']) ? $options['p'] : '';
 $database = isset($options['d']) ? $options['d'] : 'test';
 
 $this->conn = mysqli_connect($host, $user, $password, $database);
 
 if ( ! $this->conn)
 {
 die(mysqli_error($this->conn));
 }
 }
 
 /**
 * @param $id
 * @return array
 */
 protected function getRecord($id)
 {
 return mysqli_query(
 $this->conn,
 sprintf(
 'SELECT `p`.`name` AS `product_name`, `p`.`ratio` AS `product_ratio`, ' .
 '`p`.`family_id` AS `family_id`, `f`.`name` AS `family_name`, `f`.`ratio` AS `family_ratio` ' .
 'FROM `product` as `p` ' .
 'LEFT JOIN `family` AS `f` ON `p`.`family_id`=`f`.`id` ' .
 'WHERE `p`.`id`= %d',
 $id
 )
 )->fetch_assoc();
 }
 
 /**
 *
 */
 public function run()
 {
 $nRecords = mysqli_query($this->conn, 'SELECT COUNT(*) AS `qty` FROM `data`;')
 ->fetch_object()
 ->qty;
 
 $xml = new DOMDocument("1.0");
 $xml->formatOutput = true;
 $xml->encoding = 'UTF-8';
 
 $root = $xml->appendChild(new DOMElement('records'));
 
 $pBar = new ProgressBar($nRecords);
 
 $totalCost = 0;
 $offset = 0;
 while ($offset < $nRecords) {
 
 $record = mysqli_query($this->conn, 'SELECT * FROM `data` LIMIT 1 OFFSET ' . $offset)->fetch_assoc();
 $pid = $record['product_id'];
 
 $xmlRecord = $root->appendChild(new DOMElement('record'));
 $xmlRecord->setAttribute('id', $record['id']);
 $xmlRecord->appendChild(new DOMElement('product_id', $pid));
 $xmlRecord->appendChild(new DOMElement('cost', $record['cost']));
 
 $product = $this->getRecord($pid);
 
 $productRatio = isset($product['product_ratio']) ? $product['product_ratio'] : 0;
 $familyRatio = isset($product['family_ratio']) ? $product['family_ratio'] : 0;
 $realCost = $record['cost'] * $productRatio * $familyRatio;
 
 $xmlRecord->appendChild(new DOMElement('relative_cost', $realCost));
 $xmlRecord->appendChild(new DOMElement('product_name', $product['product_name']));
 $xmlRecord->appendChild(new DOMElement('family_id', $product['family_id']));
 $xmlRecord->appendChild(new DOMElement('family_name', $product['family_name']));
 
 $totalCost += $realCost;
 $offset++;
 
 $pBar->updateValue($offset);
 
 }
 
 print "\n";
 
 $xml->appendChild(new DOMElement('total_cost', $totalCost));
 print $xml->saveXML();
 
 print sprintf("this script lasted %d seconds !\n", intval(date("U") - $this->startTime));
 
 }
 }
 
 $sample = new SampleUnoptimized();
 $sample->run();
 |