2012-11-18 3 views
5

PHPmysqlnd_msという拡張子を設定しようとしていて、何か問題があります。これまでのところ、ここで私がやっていることです:PHPで動作するように読み書きの分割を取得する問題mysqlnd_ms

- (私はpecl info mysqlnd_msを実行した場合、私はmysqlnd_msプラグインに関する情報を得るか)compiled PHP from source while enabling mysqlnd

-installed mysqlnd_ms

$ sudo pecl install mysqlnd_ms 

は(PHP.iniを - 修飾し、それ以降に再開しました)。

mysqlnd_ms.enable=1 
mysqlnd_ms.disable_rw_split=0 ; for good measure 
mysqlnd_ms.config_file=mysqlnd_ms_config.ini 

-created mysqlnd_ms_config.ini次コンテンツ(which is given as example in the official doc

{ 
    "myapp": { 
     "master": { 
      "master_0": { 
       "host": "127.0.0.1", 
       "port": "3306" 
      } 
     }, 
     "slave": { 
      "slave_0": { 
       "host": "localhost", 
       "socket": "\/var\/run\/mysqld\/mysqld.sock" 
      } 
     } 
    } 
} 

According to the documentationで:

プラグイン構成のMySQL スレーブ上の読み取り専用ステートメント、およびMySQLマスター上の他のすべてのクエリを実行します。ステートメントは、SELECT、SQLヒント /ms = slave /で始まる場合、またはスクロールが以前の クエリを実行するために選択されていて、クエリがSQLヒント/ msで開始する場合、読み取り専用とみなされます。 = last_used /。すべて 他の例では、クエリは、したがって、この時点で私はslaveと(例えばUPDATEなど)他の文にに送信することが私のSELECT文を期待していMySQLのレプリケーションマスター サーバー

に送信されますmasterに送信してください。

$socket = '/var/run/mysqld/mysqld.sock'; 
$dbname = 'mysqlnsmstest'; 
$user = 'root'; 
$pass = 'root'; 

$mysql = new PDO("mysql:unix_socket=$socket;dbname=$dbname", $user, $pass); 

$result = $mysql->query('SELECT * FROM mytable'); 
foreach($result as $row) { 
    print_r($row); 
} 

$count = $mysql->exec("UPDATE mytable SET field='test' WHERE id=2"); 
echo "Nb rows affected: $count\n"; 

クエリが正常に彼らはすべてのslave(私は$ tcpdump -ni any port 3306 Iでトラフィックを盗聴ためならば、私はこのことを知っているに送信されしかしを実行されます。

私はセットアップをテストするために小さなスクリプトを書きました何も表示されませんが、 3306で手動クエリを実行すると、 tcpdumpに表示されます)。

/*ms=slave*//*ms=master*/などのコメントを使用しても違いはありません。 general_logmysqlns_msを混乱させる可能性のある他のコメントがないことを示しています。ネットワーク経由「力」接続に

121118 19:14:40 36 Connect [email protected] on mysqlnsmstest 
      36 Query /*ms=slave*/SELECT * FROM mytable 
      36 Query /*ms=master*/UPDATE mytable SET field='test' WHERE id=2 
      36 Quit 

私は(そのような私の10.0.0.56地域の一つとして)非ループバックIPを使用してみましたが、それ違いはありません。

$pdo->getAttribute(PDO::ATTR_CLIENT_VERSION)"mysqlnd 5.0.10 - 20111026 - $Id: b0b3b15c693b7f6aeb3aa66b646fee339f175e39であり、これはmysqlndが使用されていることを示しています。

読み込み/書き込み分割が機能するためには、何が欠けていますか(任意の提案歓迎)?

更新:
私はread/writeスプリットが動作しているかどうかをチェックするtcpdumpのより良い方法を見つけました:

print_r(mysqlnd_ms_get_last_used_connection($pdo)); 
Array 
(
    [scheme] => unix:///var/run/mysqld/mysqld.sock 
    [host_info] => Localhost via UNIX socket 
    [host] => 
    [port] => 3306 
    [socket_or_pipe] => /var/run/mysqld/mysqld.sock 
    [thread_id] => 48 
    [last_message] => Rows matched: 1 Changed: 0 Warnings: 0 
    [errno] => 0 
    [error] => 
    [sqlstate] => 00000 
) 

答えて

6

してください、サーバを定義PECL/mysqlnd_msのドキュメントのセクションを参照してください接続を確立しようとしています。使用するPHP MySQL APIの接続関数のホストとして、セクション名 - 例では "myapp"を渡す必要があります。

$pdo = new PDO('mysql:host=myapp;dbname=database', 'username', 'password'); 

それとも、あなたのケースでのようなもの:

$mysql = new PDO("mysql:host=myapp;dbname=$dbname", $user, $pass); 

は使用しないでください。このような何か

$mysql = new PDO("mysql:unix_socket=$socket;dbname=$dbname", $user, $pass); 

これはソケットでリッスンしている非常にサーバーに接続します$ソケット。

+0

PDOは 'myapp'をホスト名(' 'PDO :: __ construct():php_network_getaddresses:getaddrinfo failed:名前またはサービスが不明です ')のように解決しようとします。 'ini_get'は上記のような' myapp'キーを含む設定ファイルを含め、私が正しい値で上記の設定を与えてくれます。 – Max

+1

実際には動作します:)設定ファイル( 'Unknown :(mysqlnd_ms)でサーバリスト設定ファイル[mysqlnd_ms_config.ini]をUnknown in line 0で開くのに失敗しました ')に問題がありました。これで修正され、今は動作しています。 – Max

関連する問題