php tutorial memcached mysql tutorial development detailed examples
How Memcached works
In the following sections, readers are best prepared to prepare a copy of the source code of memcached.
Memcached is a traditional network service program. If the -d parameter is used when starting, it will be executed as a daemon process. The creation of the daemon process is completed by daemon.c. This program has only one daemon function. This function is very simple (if no special instructions are given, the code shall be subject to 1.2.1):
CODE:
# include
#include
#includeint
daemon(nochdir, noclose)
int nochdir , noclose;
{
int fd;switch (fork()) {
case -1:
return (-1);
case 0:
break;
default:
_exit(0);
}if (setsid() == -1)
return (-1);if (!nochdir)
(void)chdir(”/”);if (!noclose && (fd = open(”/dev/null”, O_RDWR, 0)) != - 1) {
(void)dup2(fd, STDIN_FILENO);
(void)dup2(fd, STDOUT_FILENO);
(void)dup2(fd, STDERR_FILENO);
if (fd > ; STDERR_FILENO)
(void)close(fd);
}
return (0);
}
After this function forks the entire process, the parent process exits , and then relocate STDIN, STDOUT, and STDERR to empty devices, and the daemon will be created successfully.
class Memcached
{
private $mem;
public $pflag=''; // memcached pconnect tag
private function memConnect($serkey ){
require 'config.php';
$server = $memcached;
$this->mem = new Memcache;
$link = !$this->pflag ? 'connect ' : 'pconnect' ;
$this->mem->$link($server[$serkey][0],$server[$serkey][1]) or $this->errordie(' memcached connect error');
}
public function set($ser_key,$values,$flag='',$expire=''){
$this->memConnect($this-> ;tag($ser_key));
if($this->mem->set($ser_key,$values,$flag,$expire)) return true;
else return false;
}
public function get($ser_key){
$this->memConnect($this->tag($ser_key));
if($var=$this->mem-> ;get($ser_key)) return $var;
else return false;
}
private function tag($ser_key){
$tag=explode('_',$ser_key);
return $tag[0];
}
private function errordie($errmsg){
die($errmsg);
}
}
?>
class Mysql
{
private $mysqlmaster;
private $myssqlslave;
private static $auid=0;
public function __construct(){
require 'config.php';
$msg = $mysql;$this->mysqlmaster = new mysqli($msg['master'][0], $msg['master'][1],$msg['master'][2],$msg['master'][3]); //master mysql
$this->mysqlslave = $this ->autotranscat($msg); // slave mysql
if(mysqli_connect_errno()){
printf("Connect failed: %sn",mysqli_connect_error());
exit();
}
if(!$this->mysqlmaster->set_charset("latin1") && !$this->mysqlslave->set_charset("latin1")){
exit("set charset error");
}
}
private function autotranscat($mysql){
session_start();
$_SESSION['SID']!=0 || $_SESSION['SID ']=0 ;
if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1;
else $_SESSION['SID']+ +;
$key = 'slave_'.$_SESSION['SID'];
echo($_SESSION['SID']);
return new mysqli($mysql[$key][0] ,$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);
}
public function mquery($sql){ //insert update
if(!$this->mysqlmaster->query($sql)){
return false;
}
}
public function squery($sql){
if($result=$this->mysqlslave->query($sql)){
return $result;
}else{
return false;
};
}
public function fetArray($sql){
if($result=$this->squery($sql)){
while($row=$result->fetch_array(MYSQLI_ASSOC)){
$resultraa[] = $row;
};
return $resultraa;
}
}
}
?>
require 'init.php';
$mem = new Memcached;
/* $mem->set('en_xx','bucuo');
echo($mem-> get('en_xx'));
$mem->set('cn_jjyy','wokao');
echo($mem->get('cn_jjyy'));
*/
$sq = new Mysql;
$sql = "insert into mybb(pid) values(200)";
$mdsql = md5($sql);
if(!$result=$ mem->get('cn_'.$mdsql)){
$sq->mquery("insert into mybb(pid) values(200)"); //Insert into main mysql
$result = $sq->fetArray("select * from mybb"); //The query is from mysql
foreach($result as $var){
echo $var['pid'];
}
$mem->set('cn_'.$mdsql,$result); //Add to the memcached server named cn
}else{
foreach($result as $var){
echo $var['pid'];
}
}
?>
$memcached = array( //Use memcached multi-process to simulate multiple memcached servers cn en is the memory server name
'cn'=>array('192.168.254.144',11211),
'en'=>array ('192.168.254.144',11212)
);
$mysql = array( // mysql master-slave My environment is: xp master linux slave mysql 5 php5
'master'=>array ('192.168.254.213','root','1','mydz'),
'slave_1'=>array('192.168.254.144','root','1','mydz') / /Can flexibly add multiple slave servers
);
?>
The startup process of Memcached itself, in the main function of memcached.c, the sequence is as follows:
1, Call settings_init() to set the initialization parameters
2, read parameters from the startup command to set the setting value
3, set the LIMIT parameter
4, and start network socket monitoring (if non-socketpath exists) (1.2 UDP mode will be supported later)
5. Check user identity (Memcached does not allow root identity to be started)
6. If socketpath exists, open UNIX local connection (Sock pipe)
7. If started in -d mode , create a daemon process (call the daemon function as above)
8. Initialize item, event, status information, hash, connection, slab
9. If managed takes effect in the settings, create a bucket array
10. Check whether it is needed Lock memory page
11, initialize signal, connect, delete queue
12. If daemon mode, process process ID
13, event starts, the startup process ends, and the main function enters the loop.
In daemon mode, because stderr has been directed to the black hole, no visible error information during execution will be fed back.
The main loop function of memcached.c is drive_machine. The incoming parameter is a structure pointer pointing to the current connection, and the action is determined based on the status of the state member.
Memcached uses a set of custom protocols to complete data exchange. Its protocol documentation can be referred to: http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
In the API, the newline symbol is rn