一般的大站通常做法是:拿着内存当数据库来用(memcached)
,以及很好的读、写分离
,备份机制(
mysql的主从)
。 在这样的环境下我们怎么进行
PHP开发呢?
刚在
linux的VIM里使用
PHP5写的一个demo调试通过
。 <?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从;mysql5php5
'master'=>array('192.168.254.213','root','1','mydz'),
'slave_1'=>array('192.168.254.144','root','1','mydz')//可以灵活添加多台从服务器
);
?>
服务器配置文件:十分方便的切换主从,当主换了,从可以迅速切换为主,支持多从服务器。
<?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
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
",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(MY
SQLI_ASSOC)){
$resultraa[]=$row;
};
return$resultraa;
}
}
}
?>
这个是mysqli的封装.也就是读从写主的操作的封装。
<?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'];
}
}
?>
这个是使用程序,大站就差不多是这样实现的了。