4点了.今天是最后一天在这间公司.心情不是很好.
所以写下东西发泄下. 一般的大站通常做法是 拿着内存当数据库来用(memcached). 和很好的读写分离备份机制 (
mysql 的主从)
在这样的环境下我们怎么进行
PHP开发呢.本人不太会讲话.所以还是帖代码吧.
刚在linux的 VIM里写的一个demo 调试通过.也同时希望大家拍砖 ,使用PHP5写的. PHP4写出来怕大家说我落后了
复制PHP内容到剪贴板
PHP代码:
<?php
$memcached=array(//用memcached的多进程模拟多台memcached服务器cnen为内存服务器名
'cn'=>array('192.168.254.144',11211),
'en'=>array('192.168.254.144',11212)
);
$mysql=array(//mysql的主从我的环境是:xp主linux从mysql5php5
'master'=>array('192.168.254.213','root','1','mydz'),
'slave_1'=>array('192.168.254.144','root','1','mydz')//可以灵活添加多台从服务器
);
?>
服务器配置文件: 十分方便的 切换主从.当主换了从可以迅速切换为主.支持 多从服务器 .
复制PHP内容到剪贴板
PHP代码:
<?php
classMemcached
{
private$mem;
public$pflag='';//memcachedpconnecttag
privatefunctionmemConnect($serkey){
require'config.php';
$server=$memcached;
$this->mem=newMemcache;
$link=!$this->pflag?'connect':'pconnect';
$this->mem->$link($server[$serkey][0],$server[$serkey][1])or$this->errordie('memcachedconnecterror');
}
publicfunctionset($ser_key,$values,$flag='',$expire=''){
$this->memConnect($this->tag($ser_key));
if($this->mem->set($ser_key,$values,$flag,$expire))returntrue;
elsereturnfalse;
}
publicfunctionget($ser_key){
$this->memConnect($this->tag($ser_key));
if($var=$this->mem->get($ser_key))return$var;
elsereturnfalse;
}
privatefunctiontag($ser_key){
$tag=explode('_',$ser_key);
return$tag[0];
}
privatefunctionerrordie($errmsg){
die($errmsg);
}
}
?>
简单的封装了 memcached的操作. 详细的时间不多.我要离开公司了
在memcached 的多服务器上.我的实现思路是这样的: 在把信息添加到 内存服务器的时候.我选择了手工设置添加到那个服务器.而不用传统的根据ID自动分配.
这样可以更灵活点.
以内存服务器名 为表示 比如 存$arr 这个信息到en 这台 内存服务器 我就这样写 $mem->set('en_'.$arr); 明白了吧
复制PHP内容到剪贴板
PHP代码:
<?php
classMysql
{
private$mysqlmaster;
private$myssqlslave;
privatestatic$auid=0;
publicfunction__construct(){
require'config.php';
$msg=$mysql;
$this->mysqlmaster=newmysqli($msg['master'][0],$msg['master'][1],$msg['master'][2],$msg['master'][3]);//mastermysql
$this->mysqlslave=$this->autotranscat($msg);//slavemysql
if(mysqli_connect_errno()){
printf("Connectfailed:%s/n",mysqli_connect_error());
exit();
}
if(!$this->mysqlmaster->set_charset("latin1")&&!$this->mysqlslave->set_charset("latin1")){
exit("setcharseterror");
}
}
privatefunctionautotranscat($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']);
returnnewmysqli($mysql[$key][0],$mysql[$key][1],$mysql[$key][2],$mysql[$key][3]);
}
publicfunctionmquery($sql){//insertupdate
if(!$this->mysqlmaster->query($sql)){
returnfalse;
}
}
publicfunctionsquery($sql){
if($result=$this->mysqlslave->query($sql)){
return$result;
}else{
returnfalse;
};
}
publicfunctionfetArray($sql){
if($result=$this->squery($sql)){
while($row=$result->fetch_array(MYSQLI_ASSOC)){
$resultraa[]=$row;
};
return$resultraa;
}
}
}
?>
这个是 mysqli 的封装.也就是 读从写 主的操作的封装.
复制PHP内容到剪贴板
PHP代码:
<?php
require'init.php';
$mem=newMemcached;
/*$mem->set('en_xx','bucuo');
echo($mem->get('en_xx'));
$mem->set('cn_jjyy','wokao');
echo($mem->get('cn_jjyy'));
*/
$sq=newMysql;
$sql="insertintomybb(pid)values(200)";
$mdsql=md5($sql);
if(!$result=$mem->get('cn_'.$mdsql)){
$sq->mquery("insertintomybb(pid)values(200)");//插入到主mysql
$result=$sq->fetArray("select*frommybb");//查询是从mysql
foreach($resultas$var){
echo$var['pid'];
}
$mem->set('cn_'.$mdsql,$result);//添加到名为cn的memcached服务器
}else{
foreach($resultas$var){
echo$var['pid'];
}
}
?>
这个是使用
程序. 看下就大概明白了.
大站就差不多是这样实现的了. 这种帖似乎只有我发了. 献丑了