ホームページ バックエンド開発 PHPチュートリアル mysql プロキシの読み書き分離設定と php mysql 読み書き分離クラス

mysql プロキシの読み書き分離設定と php mysql 読み書き分離クラス

Jul 25, 2016 am 08:56 AM

  1. mysql-proxy
  2. –proxy-backend-addresses=narcissus:3306
  3. –proxy-backend-addresses=nostromo:3306
コードをコピー

3. データベースの読み取りと書き込みの分離、192.168.18 .11 0 Enter は書き込みを担当し、192.168.18.107 はデータの読み取りを担当します。 もちろん、データを読み取るためのサーバーを追加することもできます。

  1. mysql-proxy
  2. –proxy-backend-addresses=192.168.18.110:3306
  3. –proxy-read-only-backend-addresses=192.168.18.107:3306
コードをコピー

このメソッドは読み取りと書き込みを分離しません。 mysql-proxy はどれがスレーブサーバーに送信されるかを区別できないため、スクリプトを使用してそれらを制御する必要があります。4 番目の方法を参照してください。

4. Lua スクリプトは、接続と配布、クエリと返される結果セットを適切に制御できます。 Lua スクリプトを使用する場合は、-proxy-lua-script を使用してスクリプトの名前を指定する必要があります。 接続が生成されるまでスクリプトは読み取られません。つまり、スクリプトの変更後にサービスを再起動する必要はありません。 mysql-proxy –proxy-lua-script=rw-splitting.lua –proxy-backend-addresses=192.168.18.110:3306 –proxy-read-only-backend-addresses=192.168.18.107:3306

注: 1. プロキシの読み取り/書き込み分離メカニズムは、まず最初のいくつかのクエリをマスターに送信して接続を確立します。 マスターに送信されるクエリの数が接続プールの最小値を超えると、クエリの送信が開始されます

2. LAST_INSERT_ID をメインサーバーに送信することはできません。226 行目を次のように変更します。 elseif is_insert_id かつ token.token_name == “TK_FUNCTION” then

3. デフォルトの rw-splitting.lua を使用すると、proxy-command が見つからないというメッセージが表示されます。mysql-proxy のパスをシステム パスに設定し、共有ディレクトリで実行すると問題ありません。操作中に cmd を入力します。 次に、 C:toolsmysql-proxyshare を cd します。

4.文字化け プロキシ経由でデータベースに接続した後、見つかった文字列は常に文字化けします。セット名「utf8」を手動で実行しても効果はありません。 解決策、mysqlサーバーを設定する必要があります

  1. class mysql_rw_php {
  2. //クエリ数
  3. var $querynum = 0;
  4. //現在の操作のデータベース接続
  5. var $link = null
  6. //文字セット
  7. var $charset; ;
  8. //現在のデータベース
  9. var $cur_db = '';
  10. //有効な読み取り専用データベース接続があるかどうか
  11. var $ro_exist = false
  12. //読み取り専用データベース接続
  13. var $link_ro = null;
  14. // データベース接続の読み取りおよび書き込み
  15. var $link_rw = null;
  16. function mysql_rw_php(){
  17. }
  18. function connect($dbhost, $dbuser, $dbpw, $dbname = '', $pconnect = 0, $ halt = TRUE) {
  19. if($pconnect) {
  20. if(!$this->link = @mysql_pconnect($dbhost, $dbuser, $dbpw)) {
  21. $halt && $this->halt('Can MySQL サーバーに接続しません');
  22. }
  23. } else {
  24. if(!$this->link = @mysql_connect($dbhost, $dbuser, $dbpw)) {
  25. $halt && $this->halt( 'MySQL サーバーに接続できません');
  26. }
  27. }
  28. //読み取り専用接続に失敗しました
  29. if(!$this->link && !$halt) return false;
  30. //rw が初期化されていない場合、最初の接続は rw
  31. if($this->link_rw == null)
  32. $this->link_rw = $this->link;
  33. if($this->version() > ' 4.1') {
  34. if ($this->charset) {
  35. @mysql_query("SETcharacter_set_connection=$this->charset,character_set_results=$this->charset,character_set_client=binary", $this->link );
  36. }
  37. if ($this->version() > '5.0.1') {
  38. @mysql_query("SET sql_mode=''", $this->link); ($dbname) {
  39. $this->select_db($dbname);
  40. }
  41. }
  42. //読み取り専用の mysql データベースに接続します
  43. function connect_ro($dbhost, $dbuser, $dbpw, $dbname = '' , $pconnect = 0) {
  44. if($this->link_rw == null)
  45. $this->link_rw = $this->link = null;
  46. //停止なしエラー
  47. $this->connect($dbhost, $dbuser, $dbpw, $dbname, $pconnect, false);
  48. if($this->link){
  49. //接続成功
  50. //echo "link ro sussess! $this->ro_exist = true;
  51. $this->link_ro = $this->link;
  52. if($this->cur_db){
  53. //データベースの場合選択されているため、操作が必要です Once
  54. @mysql_select_db($this->cur_db, $this->link_ro)
  55. }
  56. }else{
  57. //接続に失敗しました
  58. //echo "link ro failed! $this- >link = &$this->link_rw;
  59. }
  60. }
  61. //一連の読み取り専用データベースを設定し、そのうちの 1 つに接続します
  62. function set_ro_list($ro_list){
  63. if(is_array($ro_list)){
  64. / /ランダムに 1 つを選択
  65. $link_ro = $ro_list[array_rand($ro_list)]
  66. $this->connect_ro($link_ro['dbhost'], $link_ro ['dbuser'], $link_ro['dbpw'] ; $dbname, $this->link_ro)
  67. }
  68. return @mysql_select_db($dbname, $this->link_rw);
  69. function fetch_array( $query, $result_type = MYSQL_ASSOC) {
  70. return mysql_fetch_array($ query, $result_type)
  71. }
  72. function fetch_one_array($sql, $type = '') {
  73. $qr = $this->query($sql) , $type);
  74. return $this->fetch_array( $qr); }
  75. function query($sql, $type = '') {
  76. $this->link = &$this->link_rw ;
  77. //選択文を判定する
  78. if($this- >ro_exist && preg_match ("/^(s*)select/i", $sql)){
  79. $this->link = &$this- >link_ro;
  80. }
  81. $func = $type == 'UNBUFFERED' && @function_exists('mysql_unbuffered_query')
  82. 'mysql_unbuffered_query' : 'mysql_query' ? (!($query = $sql, $ this->link)) && $type != 'SILENT' ) {
  83. $this->halt('MySQL クエリ エラー', $sql);
  84. $this->querynum++;
  85. return $query;
  86. }
  87. functionaffected_rows() {
  88. return mysql_affected_rows($this->link);
  89. }
  90. function error() {
  91. return (($this->link) ? mysql_error($this->link) : mysql_error());
  92. }
  93. function errno() {
  94. return intval(($this->link) ? mysql_errno($this->link) : mysql_errno());
  95. }
  96. 関数 result($query, $row) {
  97. $query = @mysql_result($query, $row);
  98. $query を返す;
  99. }
  100. 関数 num_rows($query) {
  101. $query = mysql_num_rows($query);
  102. $query を返す;
  103. }
  104. function num_fields($query) {
  105. return mysql_num_fields($query);
  106. }
  107. function free_result($query) {
  108. return mysql_free_result($query);
  109. }
  110. function insert_id() {
  111. return ($id = mysql_insert_id($this->link)) >= 0 ? $id : $this->result($this->query("SELECT last_insert_id()"), 0);
  112. }
  113. 関数 fetch_row($query) {
  114. $query = mysql_fetch_row($query);
  115. $query を返す;
  116. }
  117. function fetch_fields($query) {
  118. return mysql_fetch_field($query);
  119. }
  120. function version() {
  121. return mysql_get_server_info($this->link);
  122. }
  123. function close() {
  124. return mysql_close($this->link);
  125. }
  126. function halt($message = '', $sql = '') {
  127. $dberror = $this->error();
  128. $dberrno = $this->errno();
  129. echo "
  130. MySQL エラー
  131. メッセージ: $message
  132. SQL
  133. エラー ;br>
  134. エラー: $dberrno
  • exit();
  • }
  • }
  • ?>
  • 复制代

    调用例:

    1. /*****************************************
    2. *** mysql-rw-php バージョン 0.1
    3. *** http://bbs.it-home.org
    4. *** http://code.google.com/p/mysql-rw-php/
    5. *** class_mysql.php (uchome) からコードを修正します
    6. ***************************************/
    7. require_once('mysql_rw_php.class.php');
    8. //rw 情報
    9. $db_rw = array(
    10. 'dbhost'=>'bbs.it-home.org',
    11. 'dbuser'=>'jbxue',
    12. 'dbpw'=>'bbs. it-home.org',
    13. 'dbname'=>'test'
    14. );
    15. $db_ro = array(
    16. array(
    17. 'dbhost'=>'bbs.it-home.org:4306',
    18. 'dbuser'=>'jbxue',
    19. 'dbpw'=>'bbs. it-home.org'
    20. )
    21. );
    22. $DB = 新しい mysql_rw_php;
    23. //マスターに接続します
    24. $DB->connect($db_rw[dbhost], $db_rw[dbuser], $db_rw[dbpw], $db_rw[dbname]);
    25. //方法 1: 1 つのサーバーに接続します
    26. $DB->connect_ro($db_ro[0][dbhost], $db_ro[0][dbuser], $db_ro[0][dbpw]);
    27. //方法 2: rand によりリストから 1 つのサーバーに接続します
    28. $DB->set_ro_list($db_ro);
    29. //rw に送信
    30. $sql = "セットに挿入 a='test'";
    31. $DB->クエリ($sql);
    32. //ro に送信
    33. $sql = "select * from a";
    34. $qr = $DB->クエリ($sql);
    35. while($row = $DB->fetch_array($qr)){
    36. echo $row[a];
    37. }
    38. ?>
    复制發


    このウェブサイトの声明
    この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

    ホットAIツール

    Undresser.AI Undress

    Undresser.AI Undress

    リアルなヌード写真を作成する AI 搭載アプリ

    AI Clothes Remover

    AI Clothes Remover

    写真から衣服を削除するオンライン AI ツール。

    Undress AI Tool

    Undress AI Tool

    脱衣画像を無料で

    Clothoff.io

    Clothoff.io

    AI衣類リムーバー

    AI Hentai Generator

    AI Hentai Generator

    AIヘンタイを無料で生成します。

    ホットツール

    メモ帳++7.3.1

    メモ帳++7.3.1

    使いやすく無料のコードエディター

    SublimeText3 中国語版

    SublimeText3 中国語版

    中国語版、とても使いやすい

    ゼンドスタジオ 13.0.1

    ゼンドスタジオ 13.0.1

    強力な PHP 統合開発環境

    ドリームウィーバー CS6

    ドリームウィーバー CS6

    ビジュアル Web 開発ツール

    SublimeText3 Mac版

    SublimeText3 Mac版

    神レベルのコード編集ソフト(SublimeText3)

    JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

    JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

    確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 確固たる原則と、それらがPHP開発にどのように適用されるかを説明してください。 Apr 03, 2025 am 12:04 AM

    PHP開発における固体原理の適用には、次のものが含まれます。1。単一責任原則(SRP):各クラスは1つの機能のみを担当します。 2。オープンおよびクローズ原理(OCP):変更は、変更ではなく拡張によって達成されます。 3。Lischの代替原則(LSP):サブクラスは、プログラムの精度に影響を与えることなく、基本クラスを置き換えることができます。 4。インターフェイス分離原理(ISP):依存関係や未使用の方法を避けるために、細粒インターフェイスを使用します。 5。依存関係の反転原理(DIP):高レベルのモジュールと低レベルのモジュールは抽象化に依存し、依存関係噴射を通じて実装されます。

    システムの再起動後にUnixSocketの権限を自動的に設定する方法は? システムの再起動後にUnixSocketの権限を自動的に設定する方法は? Mar 31, 2025 pm 11:54 PM

    システムが再起動した後、UnixSocketの権限を自動的に設定する方法。システムが再起動するたびに、UnixSocketの許可を変更するために次のコマンドを実行する必要があります:sudo ...

    PHPにおける後期静的結合の概念を説明します。 PHPにおける後期静的結合の概念を説明します。 Mar 21, 2025 pm 01:33 PM

    記事では、PHP 5.3で導入されたPHPの後期静的結合(LSB)について説明し、より柔軟な継承を求める静的メソッドコールのランタイム解像度を可能にします。 LSBの実用的なアプリケーションと潜在的なパフォーマ

    PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? PHPのCurlライブラリを使用してJSONデータを含むPOSTリクエストを送信する方法は? Apr 01, 2025 pm 03:12 PM

    PHP開発でPHPのCurlライブラリを使用してJSONデータを送信すると、外部APIと対話する必要があることがよくあります。一般的な方法の1つは、Curlライブラリを使用して投稿を送信することです。

    フレームワークセキュリティ機能:脆弱性から保護します。 フレームワークセキュリティ機能:脆弱性から保護します。 Mar 28, 2025 pm 05:11 PM

    記事では、入力検証、認証、定期的な更新など、脆弱性から保護するためのフレームワークの重要なセキュリティ機能について説明します。

    phpstormでCLIモードをデバッグする方法は? phpstormでCLIモードをデバッグする方法は? Apr 01, 2025 pm 02:57 PM

    phpstormでCLIモードをデバッグする方法は? PHPStormで開発するときは、PHPをコマンドラインインターフェイス(CLI)モードでデバッグする必要がある場合があります。

    See all articles