PHP
mysqlnd_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_log
はmysqlns_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
)
PDOは 'myapp'をホスト名(' 'PDO :: __ construct():php_network_getaddresses:getaddrinfo failed:名前またはサービスが不明です ')のように解決しようとします。 'ini_get'は上記のような' myapp'キーを含む設定ファイルを含め、私が正しい値で上記の設定を与えてくれます。 – Max
実際には動作します:)設定ファイル( 'Unknown :(mysqlnd_ms)でサーバリスト設定ファイル[mysqlnd_ms_config.ini]をUnknown in line 0で開くのに失敗しました ')に問題がありました。これで修正され、今は動作しています。 – Max