国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發 > PHP > 正文

php memcached mysql開發詳細實例

2024-05-04 21:49:01
字體:
來源:轉載
供稿:網友

Memcached的工作方式:以下的部分中,讀者最好能準備一份memcached的源代碼.

Memcached是傳統的網絡服務程序,如果啟動的時候使用了-d參數,它會以守護進程的方式執行,創建守護進程由daemon.c完成,這個程序只有一個daemon函數,這個函數很簡單,如無特殊說明,代碼以1.2.1為準,代碼如下:

  1. #include <fcntl.h> 
  2. #include <stdlib.h> 
  3. #include <unistd.h> 
  4.  
  5. int 
  6. daemon(nochdir, noclose) 
  7.     int nochdir, noclose; 
  8.     int fd; 
  9.  
  10.     switch (fork()) { 
  11.     case -1: 
  12.         return (-1); 
  13.     case 0:  
  14.         break;   
  15.     default
  16.         _exit(0); 
  17.     } 
  18.  
  19.     if (setsid() == -1) 
  20.         return (-1); 
  21.  
  22.     if (!nochdir) 
  23.         (void)chdir(”/”); 
  24.  
  25.     if (!noclose && (fd = open(”/dev/null”, O_RDWR, 0)) != -1) { 
  26.         (void)dup2(fd, STDIN_FILENO); 
  27.         (void)dup2(fd, STDOUT_FILENO); 
  28.         (void)dup2(fd, STDERR_FILENO); 
  29.         if (fd > STDERR_FILENO) 
  30.             (void)close(fd); 
  31.     } 
  32.     return (0); 

這個函數 fork 了整個進程之后,父進程就退出,接著重新定位 STDIN 、 STDOUT 、 STDERR 到空設備,daemon 就建立成功了,代碼如下:

  1. <?php  
  2. class Memcached  
  3. {  
  4. private $mem;  
  5. public $pflag=''// memcached pconnect tag  
  6. private function memConnect($serkey){  
  7. require 'config.php';  
  8. $server = $memcached;  
  9. $this->mem = new Memcache;  
  10. $link = !$this->pflag ? 'connect' : 'pconnect' ;  
  11. $this->mem->$link($server[$serkey][0],$server[$serkey][1]) or $this->errordie('memcached connect error');  
  12. }  
  13. public function set($ser_key,$values,$flag='',$expire=''){  
  14. $this->memConnect($this->tag($ser_key));  
  15. if($this->mem->set($ser_key,$values,$flag,$expire)) return true;  
  16. else return false;  
  17. }  
  18. public function get($ser_key){  
  19. $this->memConnect($this->tag($ser_key));  
  20. if($var=$this->mem->get($ser_key)) return $var;  
  21. else return false;  
  22. }  
  23. private function tag($ser_key){  
  24. $tag=explode('_',$ser_key);  
  25. return $tag[0];  
  26. }  
  27. private function errordie($errmsg){  
  28. die($errmsg);  
  29. }  
  30. }  
  31. ?> 
  32.  
  33. class Mysql  
  34. {  
  35. private $mysqlmaster;  
  36. private $myssqlslave;  
  37. private static $auid=0;  
  38. public function __construct(){  
  39. require 'config.php';  
  40. $msg = $mysql
  41.  
  42. $this->mysqlmaster = new mysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]); //master mysql  
  43. $this->mysqlslave = $this->autotranscat($msg); // slave mysql  
  44. if(mysqli_connect_errno()){  
  45. printf("Connect failed: %s ",mysqli_connect_error());  
  46. exit();  
  47. }  
  48. if(!$this->mysqlmaster->set_charset("latin1") && !$this->mysqlslave->set_charset("latin1")){  
  49. exit("set charset error");  
  50. }  
  51. }  
  52. private function autotranscat($mysql){  
  53. session_start();  
  54. $_SESSION['SID']!=0 || $_SESSION['SID']=0 ;  
  55. if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1;  
  56. else $_SESSION['SID']++;  
  57. $key = 'slave_'.$_SESSION['SID'];  
  58. echo($_SESSION['SID']);  
  59. return new mysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);  
  60. }  
  61. public function mquery($sql){ //insert update  
  62. if(!$this->mysqlmaster->query($sql)){  
  63. return false;  
  64. }  
  65. }  
  66. public function squery($sql){  
  67. if($result=$this->mysqlslave->query($sql)){  
  68. return $result;  
  69. }else{  
  70. return false;  
  71. };  
  72. }  
  73. public function fetArray($sql){  
  74. if($result=$this->squery($sql)){  
  75. while($row=$result->fetch_array(MYSQLI_ASSOC)){  
  76. $resultraa[] = $row;  
  77. };  
  78. return $resultraa;  
  79. }  
  80. }  
  81. }  
  82. ?> 
  83. require 'init.php';  
  84. $mem = new Memcached;  
  85. /* $mem->set('en_xx','bucuo');  
  86. echo($mem->get('en_xx'));  
  87. $mem->set('cn_jjyy','wokao');  
  88. echo($mem->get('cn_jjyy'));  
  89. */  
  90. $sq = new Mysql;  
  91. $sql = "insert into mybb(pid) values(200)";  
  92. $mdsql = md5($sql);  
  93. if(!$result=$mem->get('cn_'.$mdsql)){  
  94. $sq->mquery("insert into mybb(pid) values(200)"); //插入到主mysql  
  95. $result = $sq->fetArray("select * from mybb"); //查詢 是 從mysql  
  96. foreach($result as $var){  
  97. echo $var['pid'];  
  98. }  
  99. $mem->set('cn_'.$mdsql,$result); //添加到 名為 cn 的 memcached 服務器  
  100. }else{  
  101. foreach($result as $var){  
  102. echo $var['pid'];  
  103. }  
  104. }  
  105. ?> 
  106.  
  107. <?php  
  108. $memcached = array//用memcached 的 多 進程模擬 多臺memcached 服務器 cn en 為 內存服務器名  
  109. 'cn'=>array('192.168.254.144',11211),  
  110. 'en'=>array('192.168.254.144',11212)  
  111. ); //開源代碼Vevb.com 
  112. $mysql = array// mysql 的主從 我的環境是 : xp 主 linux 從 mysql 5 php5  
  113. 'master'=>array('192.168.254.213','root','1','mydz'),  
  114. 'slave_1'=>array('192.168.254.144','root','1','mydz'//可以靈活添加多臺從服務器  
  115. );  
  116. ?>   

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 成員的狀態來決定動作.

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芦溪县| 景东| 清徐县| 彭泽县| 昌平区| 安图县| 青州市| 元氏县| 蒙自县| 沐川县| 全州县| 禹州市| 遵化市| 太仓市| 常德市| 陆河县| 团风县| 璧山县| 临高县| 长沙市| 文安县| 察雅县| 通城县| 江津市| 特克斯县| 弥勒县| 股票| 武宣县| 秦安县| 调兵山市| 迭部县| 长宁区| 吉林省| 涡阳县| 阜城县| 广汉市| 明水县| 普格县| 玉树县| 鞍山市| 阳谷县|