Caching Data For Performance

Preview:

DESCRIPTION

Information on how PHP developers can implement data caching to improve performance and scalability. Presented at the West Suburban Chicago PHP Meetup on February 7, 2008.

Citation preview

Caching Data For Performance

Dave RossWest Suburban Chicago PHP Meetup

February 7, 2008

Caching

It's faster to get informationfrom somewhere close...

Caching

Than somewherefar away.

It's all about scalability.

(seriously)

Where?

Generally speaking...

Local Database faster than Shared DatabaseLocal Disk faster than Database

RAM faster than Disk

What?

Anything you don't want tofetch or compute

every time your code runs.

Anything that isn't going to changevery often.

Everybody's Doing It!

WP-Cache (Wordpress)

Drupal has it built-in

memcached (LiveJournal, Slashdot, WikiPedia)

Even PHP Itself Is Getting Cached

PHP opcode caches compile your scripts and run these pre-parsed versions instead.

Zend Optimizer APC (Alternative PHP Cache) Xcache eAccelerator ionCube

A Few Things I Cached Recently

Access Control List

Page metadata

Entire CMS pages

Caching On Disk

Make a big array of the data you need.

// At the start of your script$array = unserialize(file_get_contents($fileName));

// If the data isn't already there, put it thereif(array_key_exists('key', $array)){ $value = $array['key'];}else{ // Retrieve or compute $value $value = “Hello, World!”; $array['key'] = $value;}

// At the end of your scriptfile_put_contents($fileName, serialize($array));

Of Course, the OS Caches Files

Modern operating systems use all your free RAM as a disk cache.

If you read the same file over & over, it's probably being read out of RAM the second time on.

So, it's usually ok to read a small file over & over.

memcached

“memcached is a high-performance, distributed memory object caching system, generic in nature, but intended for use in speeding up dynamic web

applications by alleviating database load.”

memcached

(It's a big array that doesn't go away when your PHP program ends.)

memcached

<?php

$memcache = new Memcache;$memcache->connect('localhost', 11211) or die ("Could not connect");

$version = $memcache->getVersion();echo "Server's version: ".$version."<br/>\n";

$tmp_object = new stdClass;$tmp_object->str_attr = 'test';$tmp_object->int_attr = 123;

$memcache->set('key', $tmp_object, false, 10) or die ("Failed to save data at the server");echo "Store data in the cache (data will expire in 10 seconds)<br/>\n";

$get_result = $memcache->get('key');echo "Data from the cache:<br/>\n";

var_dump($get_result);

?>

Caveats

Be careful caching anything where security matters.

Don't cache credit card info (PCI compliance)

Keep cache up-to-date (when data changes)

For More Information

Caching In General http://en.wikipedia.org/wiki/Cache

PHP Accelerators/Opcode Caches http://en.wikipedia.org/wiki/PHP_accelerator http://www.zend.com/en/products/guard/optimizer

memcached http://www.danga.com/memcached/