<?php 
 
$startTime = intval(date("U")); 
 
require_once __DIR__.'/../vendor/autoload.php'; 
 
use JLaso\ToolsLib\ProgressBar; 
use JLaso\ToolsLib\PreEmptiveCache; 
 
$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'; 
 
$conn = mysqli_connect($host, $user, $password, $database); 
 
if (!$conn){ 
    die(mysqli_error($conn)); 
} 
 
$nRecords = mysqli_query($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')); 
 
$debug = false; 
 
if (!$debug) { 
    $pBar = new ProgressBar($nRecords); 
} 
 
$familyCache = new PreEmptiveCache(function($id) use ($conn){ 
    return mysqli_query( 
        $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(); 
}, array( 
    'maxRecordsCached' => 99999, 
    'mode' => PreEmptiveCache::LESS_OLDEST_MODE, 
    'debug' => $debug, 
)); 
 
$totalCost = 0; 
$offset = 0; 
while ($offset < $nRecords){ 
 
    $record = mysqli_query($conn, 'SELECT * FROM `data` LIMIT 1 OFFSET '.$offset)->fetch_assoc(); 
 
    $xmlRecord = $root->appendChild(new DOMElement('record')); 
    $xmlRecord->setAttribute('id', $record['id']); 
    $xmlRecord->appendChild(new DOMElement('family', $record['product_id'])); 
    $xmlRecord->appendChild(new DOMElement('cost', $record['cost'])); 
 
    $product = $familyCache->fetch($record['product_id']); 
 
    $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', $product['product_name'])); 
 
    $totalCost += $realCost; 
    $offset++; 
 
    if (!$debug){ 
        $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")-$startTime)); 
 
 |