php memcached mysql开发详细实例

Memcached的工作方式

以下的部分中,读者最好能准备一份memcached的源代码。

Memcached是传统的网络服务程序,如果启动的时候使用了-d参数,它会以守护进程的方式执行。创建守护进程由daemon.c完成,这个程序只有一个daemon函数,这个函数很简单(如无特殊说明,代码以1.2.1为准):

 代码如下 复制代码

CODE:
#include <fcntl.h>
#include <stdlib.h>
#include <unistd.h>

int
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);
}

这个函数 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
$this->mysqlslave = $this->autotranscat($msg); // slave mysql
if(mysqli_connect_errno()){
printf("Connect failed: %s ",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)"); //插入到主mysql
$result = $sq->fetArray("select * from mybb"); //查询 是 从mysql
foreach($result as $var){
echo $var['pid'];
}
$mem->set('cn_'.$mdsql,$result); //添加到 名为 cn 的 memcached 服务器
}else{
foreach($result as $var){
echo $var['pid'];
}
}
?>

 

 代码如下 复制代码
<?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中,换行符号统一为

时间: 2024-10-29 20:28:31

php memcached mysql开发详细实例的相关文章

windows7配置Nginx+php+mysql的详细教程_php实例

最近在学习php,想把自己的学习经历记录下来,并写一些经验,仅供参考交流.此文适合那些刚刚接触php,想要学习并想要自己搭建Nginx+php+mysql环境的同学. 当然,你也可以选择集成好的安装包,比如 wamp等,不过我推荐大家还是自己手动搭建一下环境比较好,这样能够更好的了解php及其运行流程.下面直接进入正题. 步骤: 1.准备安装包等 (1)nginx-1.10.1.zip,下载链接为http://nginx.org/en/download.html .我个人选择了稳定版. (2)p

apache php mysql开发环境安装教程_php实例

apache php mysql开发环境搭建教程,分享给大家,供大家参考 0.资源链接: 360云盘:https://yunpan.cn/c6wpzYwbfmLJY (提取码:0190) 1.首先安装编译器环境 即如下文件: 2.安装apache+php+mysql 即如下文件: 2.1.安装apache 2.1.1安装 只说关键几点 2.1.1.1 2.1.1.2 2.1.1.3 2.1.1.4.在浏览器地址栏输入:localhost ,若出现以下页面,说明您已成功安装apache 2.1.2

JBuilder7+Weblogic7+mysql 开发EJB的配置(加入BMP,CMP开发实例)[

JBuilder7+Weblogic7+mysql 开发EJB的配置 配置JB+WLS可以说是一场恶梦,网上搜了所有可以搜到的贴子,有质量的不过三四个,可以说这几个 贴子在某些方面写得确实不错,笔者也是靠它们的帮助,经过几天艰苦的摸索才完全成功地整合了JB7+WLS7以 及MYSQL数据库来开发EJB的.但这几个贴子都是以前的JB4-6,WLS5-6.1的情况下写的,有很多选项都不适用 于JB7+WLS7,而且都是单方面的,没有一个从配置到布署的完整的文档.一.安装不说了.二.配置:安装好JB7

Mysql 优化详细介绍

Mysql 优化详细介绍 MySQL 提供了很多参数进行服务器的设置, MySQL 在安装的时候提供几个默认的参数文件供选择,分别是: my-small.cnf . my-medium.cnf . my-large.cnf . my-huge.cnf . my-innodb-heavy-4G.cnf ,从文件名我们可以看出该配置文件适合的应用规模.通常情况下,我们可以选择使用接近自己的系统规模的配置文件,但是系统默认的参数在不同的生产环境可能不能完全满足实际的应用需求,我们可以再按照实际情况对部

056_《Delphi应用程序开发精彩实例》

<Delphi应用程序开发精彩实例> Delphi 教程 系列书籍 (056) <Delphi应用程序开发精彩实例> 网友(邦)整理 EMail: shuaihj@163.com 下载地址: Pdf 作者: 杨志国 王小琼 李世姣 丛书名: 其他 出版社:机械工业出版社* ISBN:7111116135 上架时间:2003-4-17 出版日期:2003 年4月 开本:16开 页码:411 版次:1-1 内容简介 作为一个优秀的.面向对象的可视化开发工具,Delphi拥有快捷方便的开

mysql Replace INTO 实例教程

mysql Replace INTO 实例教程 Replace INTO和INSERT INTO的区别,我和他说晚上上我的blog看吧,那时候还在忙,现在从MYSQL手册里找了点东西,MYSQL手册里说REPLACE INTO说的还是比较详细的. REPLACE的运行与INSERT很相像.只有一点除外,如果表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除.请参见13.2.4节,"INSERT语法". 注意,除

MySQL5创建存储过程详细实例

MySQL5创建存储过程详细实例 用mysql教程客户端登入 2 选择数据库教程 mysql>use test 3 查询当前数据库有哪些存储过程 mysql>show procedure status where Db='test' 4 创建一个简单的存储过程 mysql>create procedure hi() select 'hello'; 5 存储过程创建完毕,看怎么调用它 mysql>call hi(); 显示结果 mysql> call hi(); +------

Linux上通过binlog文件恢复mysql数据库详细步骤_Mysql

 一.binlog 介绍 服务器的二进制日志记录着该数据库的所有增删改的操作日志(前提是要在自己的服务器上开启binlog),还包括了这些操作的执行时间.为了显示这些二进制内容,我们可以使用mysqlbinlog命令来查看. 用途1:主从同步 用途2:恢复数据库(也是线上出现一次数据库文件丢失后,才对这个有所了解并学习的) mysqlbinlog命令用法:shell> mysqlbinlog [options] log_file ... <!--[if !supportLists]-->

Mysql Explain 详细介绍_Mysql

Mysql Explain 这里做一个资料的全面整理. 一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二.explain输出解释 +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+ | id | select_type | table | typ