Sunday, April 27, 2008

What is Memcache

Introduction

Memcache module provides handy procedural and object oriented interface to memcached, highly effective caching daemon, which was especially designed to decrease database load in dynamic web applications.

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.

The Memcache module also provides a session handler (memcache).

More information about memcached can be found at » http://www.danga.com/memcached/.

Thursday, April 24, 2008

Lazy Initialization Pattern

Lazy initialization is the tactic of delaying the creation of an object, the calculation of a value, or some other expensive process until the first time it is needed.

In a software design pattern view, lazy initialization is often used together with a factory method pattern. This combines three ideas:
  • using a factory method to get instances of a class (factory method pattern)
  • storing the instances in a map, so you get the same instance the next time you ask for an instance with same parameter (compare with a singleton pattern)
  • using lazy initialization to instantiate the object the first time it is requested (lazy initialization pattern).

A Simple PHP Example

php
class User
{
protected $_id;

public function getId()
{
return $this->_id;
}
}

class Post
{
protected $_userId;

protected $_text;

/**
*
* @var User
*/

protected $_user;


public function setUser(User $user)
{
$this->_userId = $user->getId();
$this->_user = $user;
}

public function getUser()
{
if (!$this->_user) {
$this->_user = new User($this->_userId);
}
return $this->_user;
}

public function setText($text)
{
$this->_text = $text;
}

public function getText()
{
return $this->_text;
}
}

A PHP 5 Example

php
class View
{
protected $_values = array();

public function set($name, $value)
{
$this->_values[$name] = $value;
}

public function render($file)
{
extract($this->_values);
ob_start();
include($file);
return ob_get_clean();
}
}

class Page
{
/**
* View object.
*
* @var View
*/

protected $_view;

public function __construct()
{
// remove attribute to use the __get magic method in first access
unset($this->_view);
}

public function __get($name)
{
if ($name == '_view') {
// load view object
$this->_view = new View();
return $this->_view;
}
}

public function actionIndex()
{
$this->_view->set('title', 'Lazy Initialization');
print $this->_view->render('lazy.tpl');
}
}