PHP Classes

PHP Preemptive Cache: Cache a limited amount of data records in memory

Recommend this page to a friend!
     
  Info   Example   View files Files   Install with Composer Install with Composer   Download Download   Reputation   Support forum   Blog    
Ratings Unique User Downloads Download Rankings
Not enough user ratingsTotal: 284 All time: 7,565 This week: 560Up
Version License PHP version Categories
preemptive-cache 1.1MIT/X Consortium ...5.3PHP 5, Cache
Description 

Author

This class can cache a limited amount of data records in memory.

It takes a callable function as parameter that will be used to retrieve data records to be cached.

When the application needs to fetch a data record, the class will call the given callable function if the record with a given id is not yet cached in memory in class array.

The class will maintain up to a given limit of cached data records in memory.

Innovation Award
PHP Programming Innovation award nominee
September 2015
Number 2
Some algorithms need to access information records multiple times during the execution of the algorithm.

For this type of algorithm it more efficient to keep the most frequently accessed records of information memory.

This class implements a caching method that does that. It retrieves data records into a cache array up to a limited amount of records so it avoids using too much memory.

The use of configurable callback function allows it to be used to retrieve cached records from virtually any type of data source.

Manuel Lemos
Picture of Joseluis Laso
  Performance   Level  
Innovation award
Innovation award
Nominee: 6x

Winner: 2x

 

Example

<?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));


Details

PreEmptiveCache

A little class to help improve our scripts that access to a large quantity of data.

A class to document the article I published on PHPClasses.

Once the repo is in your drive run `composer dumpautoload` in order to generate the appropriate autoload files.


  Files folder image Files (18)  
File Role Description
Files folder imageexample (3 files, 1 directory)
Files folder imagesrc (3 files, 1 directory)
Files folder imagevendor (1 file, 1 directory)
Accessible without login Plain text file composer.json Data Auxiliary data
Accessible without login Plain text file LICENSE Lic. License text
Accessible without login Plain text file README.md Doc. Documentation

The PHP Classes site has supported package installation using the Composer tool since 2013, as you may verify by reading this instructions page.
Install with Composer Install with Composer
 Version Control Unique User Downloads Download Rankings  
 100%
Total:284
This week:0
All time:7,565
This week:560Up