<?php
/*
*Author: beiliwenxiao
*Name: eAccelerator-based solutions for shared memory.
*Version: 1.0
*Date: 2009-08-31
*Description:
*Can only be applied to a single primary key table.
*You must have eAccelerator.
*It can be reduce the database pressure and Ensure data accuracy and synchronization.
*You can be applied to High interactive webgame.
*/
/*
*Example:
*According to different sequential access
*
*test_get.php
*test_show.php
*test_del.php
*
*You can understand it how to work.
*And change the databese code with youself's,then you can use this at one page.
*/
class SharedMemory
{
//Your table primary key value
var $id;
//Your class name
var $classname;
//Your function name
var $funname;
//Your Data's id list
var $idlist;
//Need to remove a list of id
var $idlist_del;
//How many of each data processing
var $m = 1000;
//The number of seconds to suspend
var $n = 1;
function __construct($classname,$funname,$id='')
{
$this->id=$id;
$this->classname=$classname;
$this->funname=$funname;
$this->idlist = eaccelerator_get($this->classname.'_'.$this->funname.'_idlist');
}
function setData($data)
{
if ($this->id<>0 and $this->id<>'')
{
eaccelerator_lock($this->classname.'_'.$this->funname.'_'.$this->id);
eaccelerator_put($this->classname.'_'.$this->funname.'_'.$this->id,$data,'0');
eaccelerator_unlock($this->classname.'_'.$this->funname.'_'.$this->id);
if (!$this->idlist)
{
$this->idlist[0]=$this->id;
eaccelerator_lock($this->classname.'_'.$this->funname.'_idlist');
eaccelerator_put($this->classname.'_'.$this->funname.'_idlist',$this->idlist,'0');
eaccelerator_unlock($this->classname.'_'.$this->funname.'_idlist');
}
else
{
if(!in_array($this->id,$this->idlist))
{
array_push($this->idlist, $this->id);
eaccelerator_lock($this->classname.'_'.$this->funname.'_idlist');
eaccelerator_put($this->classname.'_'.$this->funname.'_idlist',$this->idlist,'0');
eaccelerator_unlock($this->classname.'_'.$this->funname.'_idlist');
}
}
}
}
function getData($id='')
{
if ($id<>'')
{
$data = eaccelerator_get($this->classname.'_'.$this->funname.'_'.$id);
if (!$data)
{
$data = call_user_func(array($this->classname, $this->funname),$id);
$this->setData($data);
}
}
else
{
$data = eaccelerator_get($this->classname.'_'.$this->funname.'_'.$this->id);
if (!$data)
{
/*
echo $this->classname;
echo $this->funname;
echo $this->id;
exit();
*/
$data = call_user_func(array($this->classname, $this->funname),$this->id);
$this->setData($data);
}
}
return $data;
}
function upData($data)
{
eaccelerator_lock($this->classname.'_'.$this->funname.'_'.$this->id);
eaccelerator_put($this->classname.'_'.$this->funname.'_'.$this->id,$data,'0');
eaccelerator_unlock($this->classname.'_'.$this->funname.'_'.$this->id);
}
function delData()
{
eaccelerator_lock($this->classname.'_'.$this->funname.'_'.$this->id);
eaccelerator_rm($this->classname.'_'.$this->funname.'_'.$this->id);
eaccelerator_unlock($this->classname.'_'.$this->funname.'_'.$this->id);
call_user_func(array($this->classname, $this->funname.'_del'),$this->id);
}
/*
*
*You need set regular implementation of the syncData();
*/
function syncData()
{
if ($this->idlist)
{
$c=count($this->idlist);
for($i=0;$i<$c;$i++)
{
$data=$this->getData($this->idlist[$i]);
call_user_func(array($this->classname, $this->funname.'_updata'),$this->idlist[$i],$data);
if ($i%$this->m == 0 )
{
sleep($this->n);
}
}
eaccelerator_lock($this->classname.'_'.$this->funname.'_idlist');
eaccelerator_rm($this->classname.'_'.$this->funname.'_idlist');
eaccelerator_unlock($this->classname.'_'.$this->funname.'_idlist');
}
}
}
?>
|