site : http://www.php.net/manual/en/book.mysqlnd-ms.php
source iste : http://pecl.php.net/package/mysqlnd_ms
case : amazon linux ami
amazon linux ami 2012.09-release-notes 에서는 httpd24(apache 2.4)를 사용해야 한다고 한다.
yum install httpd24 php54-mcrypt php54-pecl-memcache php54-gd php54-devel php54-cli php54-mysqlnd # simple install # sudo pecl install mysqlnd_ms wget http://pecl.php.net/get/mysqlnd_ms-1.4.2.tgz tar xvfz mysqlnd_ms-1.4.2.tgz cd mysqlnd_ms-1.4.2 phpize ./configure make sudo make install sudo vi /etc/php.d/mysqlnd_ms.ini extension=mysqlnd_ms.so mysqlnd_ms.enable=1 mysqlnd_ms.config_file=/var/www/mysqlnd_ms_plugin.conf vi /var/www/mysqlnd_ms_plugin.ini { "localhost": { "master": { "master_0": { "host": "192.168.x.x", "port": "3306" } }, "slave": { "slave_0": { "host": "localhost", "socket": "\/var\/lib\/mysql\/mysql.sock" } } } }
제대로 master/slave spilt가 되는지 확인하기 위해선 다음 소스를 이용한다. 결과로 @myrole = ” 이 나오면 master/slave가 나뉘는 것이다.
<?php $mysqli = new mysqli("localhost", "id", "password", "database"); if (mysqli_connect_errno()) /* Of course, your error handling is nicer... */ die(sprintf("[%d] %s\n", mysqli_connect_errno(), mysqli_connect_error())); /* Connection 1, connection bound SQL user variable, no SELECT thus run on master */ if (!$mysqli->query("SET @myrole='master'")) { printf("[%d] %s\n", $mysqli->errno, $mysqli->error); } /* Connection 2, run on slave because SELECT */ if (!($res = $mysqli->query("SELECT @myrole AS _role"))) { printf("[%d] %s\n", $mysqli->errno, $mysqli->error); } else { $row = $res->fetch_assoc(); $res->close(); printf("@myrole = '%s'\n", $row['_role']); } $mysqli->close(); ?>
wordpress 의 경우 mysqlnd_ms 를 사용할 경우 mysql_get_server_info 명령어가 듣지 않는다. 이유는 master/slave spilt가 되고나서 하나의 쿼리라도 던지기 전에 미리 mysql_get_류의 명령어를 던지게 되면 NULL값이라 segmentation fault 가 난다. /wordpress/wp-includes/wp-db.php 파일의 db_version() 함수에서 나오는 값을 고정시키면 오류를 피할수 있다.
PHP segmentation fault when mysqlnd_ms is enabled
/** * The database version number. * * @since 2.7.0 * * @return false|string false on failure, version number on success */ function db_version() { // mysqlnd_ms patch 5.5.28 return '5.5.28'; // return preg_replace( '/[^0-9.].*/', '', mysql_get_server_info( $this->dbh ) ); }
case : ubuntu 12.04LTS
sudo apt-get install php5-dev apt-get source php5 vi php-x.x/ext/mysqlnd/mysqlnd_portability.h # ---- edit line 40 ---- # include <ext /mysqlnd/php_mysqlnd.h> sudo cp -R php-x.x/ext/mysqlnd /usr/include/php5/ext sudo pecl install mysqlnd_ms