加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php memcached mysql开发详细实例

发布时间:2022-02-17 12:50:17 所属栏目:PHP教程 来源:互联网
导读:Memcached的工作方式:以下的部分中,读者最好能准备一份memcached的源代码. Memcached是传统的网络服务程序,如果启动的时候使用了-d参数,它会以守护进程的方式执行,创建守护进程由daemon.c完成,这个程序只有一个daemon函数,这个函数很简单,如无特殊说明,代
  Memcached的工作方式:以下的部分中,读者最好能准备一份memcached的源代码.
 
  Memcached是传统的网络服务程序,如果启动的时候使用了-d参数,它会以守护进程的方式执行,创建守护进程由daemon.c完成,这个程序只有一个daemon函数,这个函数很简单,如无特殊说明,代码以1.2.1为准,代码如下:
 
  #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)  
  ); //开源代码Cuoxin.com
  $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 成员的状态来决定动作.

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读