大規模な Web サイトでは、メモリをデータベース (memcached) として使用するのが一般的ですが、優れた読み取り/書き込み分離バックアップ メカニズム (mysql マスター/スレーブ) を使用して、そのような環境で 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 master linux smile mysql 5 php5
'master'= >array ('192.168.254.213','root','1','mydz'),
'slave_1'=>array('192.168.254.144','root','1','mydz') //はい、複数のスレーブ サーバーを柔軟に追加できます
?>
次のようにコードをコピーします:
class Memcached
{
public $pflag='' // memcached pconnect タグ
private function memConnect($serkey){
require ' config.php';
$server = $memcached ;
$link = !$this->pflag : 'pconnect' ; ->$link($server[$serkey][0],$server[$serkey][1]) または $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,$ 期限切れ)) true を返す
else を返す
}
public function get($ser_key){
$this->memConnect($this->tag($ser_key) ));
if($var=$this ->mem->get($ser_key)) return $var;
else return false
}
プライベート関数タグ($ser_key){
$tag=explode( '_',$ser_key);
return $tag[0];
}
private function errordie($errmsg);
}
}
?>
は単に memcached の操作をカプセル化します。詳細についてはあまり時間がありません。
memcached マルチサーバー上での実装のアイデアは次のとおりです: メモリ サーバーに情報を追加する場合、従来のサーバーに追加するのではなく手動で設定することにしましたID に基づく自動割り当て
これはより柔軟に機能します。
たとえば、情報 $arr を en メモリ サーバーに保存するには、 $mem->set('en_) と書きます。 '.$arr);
次のようにコードをコピーします:
private $mysqlslave;
public function __construct(){
require 'config .php';
$ this->mysqlmaster = new mysqli($msg['master'][0],$msg['master' '][2],$msg['master'][ 3]); //マスター mysql
$this->mysqlslave = $this->autotranscat($msg); // スレーブ mysql
if(mysqli_connect_errno( )){
printf("接続に失敗しました: %sn", mysqli_connect_error());
exit();
}
if(!$this->mysqlmaster->set_charset("latin1") && !$this- >mysqlslave->set_charset("latin1")){
exit("set charset error")
}
プライベート関数 autotranscat($mysql){
session_start(); !=0 || $_SESSION['SID']=0 ;
if($_SESSION['SID'] >=count($mysql)-1) $_SESSION['SID'] = 1; ['SID']++;
$key = 'slave_ '.$_SESSION['SID'];
echo($_SESSION['SID']);
新しい mysqli($mysql[$key][0]) ,$mysql[$key][1],$mysql[ $key][2],$mysql[$key][3]);
}
public function mquery($sql){ //更新を挿入
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;
}
?>
mysqli のカプセル化
の read-slave-write-master 操作のカプセル化でもあります。
require 'init.php';
$mem = 新しい Memcached;
echo($mem->get('en_xx'));
$mem->set('cn_jjyy','wokao');
echo($mem->get('cn_jjyy'));
*/
$sq = 新しい MySQL に挿入します。 mybb(pid) 値(200)";
$mdsql = md5($sql);
if(!$result=$mem->get('cn_'.$mdsql)){
$sq->mquery ("insert into mybb(pid) names(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 中国語 Web サイト (www.php.cn) を参照してください。 )!