Memcached的工作方式
以下的部分中,读者最好能准备一份memcached的源代码。
Memcached是传统的网络服务程序,如果启动的时候使用了-d参数,它会以守护进程的方式执行。创建守护进程由daemon.c完成,这个程序只有一个daemon函数,这个函数很简单(如无特殊说明,代码以1.2.1为准):
代码如下 | 复制代码 |
CODE: #include <fcntl.h> #include <stdlib.h> #include <unistd.h> int switch (fork()) { if (setsid() == -1) if (!nochdir) if (!noclose && (fd = open(”/dev/null”, O_RDWR, 0)) != -1) { |
这个函数 fork 了整个进程之后,父进程就退出,接着重新定位 STDIN 、 STDOUT 、 STDERR 到空设备, daemon 就建立成功了。
代码如下 | 复制代码 |
<?php 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
require 'init.php'; |
代码如下 | 复制代码 |
<?php $memcached = array( //用memcached 的 多 进程模拟 多台memcached 服务器 cn en 为 内存服务器名 'cn'=>array('192.168.254.144',11211), 'en'=>array('192.168.254.144',11212) ); $mysql = array( // mysql 的主从 我的环境是 : xp 主 linux 从 mysql 5 php5 'master'=>array('192.168.254.213','root','1','mydz'), 'slave_1'=>array('192.168.254.144','root','1','mydz') //可以灵活添加多台从服务器 ); ?> |
Memcached 本身的启动过程,在 memcached.c 的 main 函数中顺序如下:
1 、调用 settings_init() 设定初始化参数
2 、从启动命令中读取参数来设置 setting 值
3 、设定 LIMIT 参数
4 、开始网络 socket 监听(如果非 socketpath 存在)( 1.2 之后支持 UDP 方式)
5 、检查用户身份( Memcached 不允许 root 身份启动)
6 、如果有 socketpath 存在,开启 UNIX 本地连接(Sock 管道)
7 、如果以 -d 方式启动,创建守护进程(如上调用 daemon 函数)
8 、初始化 item 、 event 、状态信息、 hash 、连接、 slab
9 、如设置中 managed 生效,创建 bucket 数组
10 、检查是否需要锁定内存页
11 、初始化信号、连接、删除队列
12 、如果 daemon 方式,处理进程 ID
13 、event 开始,启动过程结束, main 函数进入循环。
在 daemon 方式中,因为 stderr 已经被定向到黑洞,所以不会反馈执行中的可见错误信息。
memcached.c 的主循环函数是 drive_machine ,传入参数是指向当前的连接的结构指针,根据 state 成员的状态来决定动作。
Memcached 使用一套自定义的协议完成数据交换,它的 protocol 文档可以参考: http://code.sixapart.com/svn/memcached/trunk/server/doc/protocol.txt
在API中,换行符号统一为