php-cp (php-connect-pool), redis и pdo: локальный прокси
[Краткое описание на китайском языке] http://blog.sina.com.cn/s/blog_9eaa0f400102v9fd.html
Предоставляет пул соединений, разделение чтения и записи, балансировку нагрузки, журнал медленных запросов и журнал больших блоков данных.
Требования:
— PHP 5.3+ (без zts); — Linux 2.6+; — Установленные расширения pdo и redis.
Установка:
phpize && ./configure && make install
.echo "extension=xx/connect_pool.so" >> php.ini
.Использование Docker для установки:
Можно использовать Docker для компиляции. Необходимо выполнить следующие шаги в корневом каталоге проекта:
php.ini.example
как php.ini
, изменить файл pool.ini
.docker build -t php-cp
.Технические характеристики:
Советы:
Интегрированные фреймворки:
Применение:
$ mv ./pool.ini.example /etc/pool.ini
$ chmod +x ./pool_server //pool_server — это скрипт PHP, который можно изменить
$ mv pool_server /usr/local/bin/
$ pool_server start //запустить службу (если конфигурация daemonize включена, служба будет работать в фоновом режиме, в противном случае она будет работать на переднем плане)
$ pool_server stop //остановить службу
$ pool_service restart //перезапустить службу
$ pool_service status //просмотреть статус службы
<?php
/* * ****************don't use pool(не использовать пул, самый простой способ)************************ */
$obj = new Redis();
$rs = $obj->connect("192.168.20.130");
$obj->select(5);
$obj->set("test", '1111');
var_dump($obj->get("test"));
$obj = new PDO('mysql:host=192.168.20.130;dbname=test1', "admin", "admin");
$rs = $obj->query("show tables");
var_dump($rs->fetchAll());
//*****************use pool(использовать пул)*********************************/
$obj = new redisProxy();
$rs = $obj->connect("192.168.20.130");
$obj->select(5);
$obj->set("test", '1111');
var_dump($obj->get("test"));
$obj->release();
$obj1 = new pdoProxy('mysql:host=192.168.20.131;dbname=db1', "admin", "admin");
$rs = $obj1->query("show tables");
var_dump($rs->fetchAll());
$obj1->release();
/* * ****************асинхронные операции pdo и redis**********************************************
* зависит от функции события swoole
*/
include './asyncClass.php';
$obj = new asyncRedisProxy();
$obj->connect("127.0.0.1", "6379");
$obj->set("a", 11111, function($obj, $ret) {
$obj->get("a", function($obj, $data) {
var_dump($data);
$obj->release(); //release to con pool
});
});
$obj2 = new asyncPdoProxy('mysql:host=192.168.1.19;dbname=mz_db', "public_user", "1qa2ws3ed");
$obj2->query("select 1 from mz_user where user_id=299", function($obj, $stmt) {
$arr = $stmt->fetchAll();
var_dump($arr);
$obj->query("select 2 from mz_user where user_id=299", function($obj, $stmt) {
$arr = $stmt->fetchAll();
var_dump($arr);
$obj->release(); //release to con pool
});
});
$obj3 = new asyncPdoProxy('mysql:host=192.168.1.19;dbname=mz_db', "public_user", "1qa2ws3ed");
$obj3->exec("insert into t1(name) values('111111')", function($obj, $data) {
var_dump($data);
$obj->release(); ////release to con pool
});
$obj4 = new asyncPdoProxy('mysql:host=192.168.1.19;dbname=mz_db', "public_user", "1qa2ws3ed");
$stmt = $obj4->prepare("select * from mz_account where user_id=:user_id");
$stmt->bindParam(':user_id', "311");
$stmt->execute(function($stmt, $ret) {
$data = $stmt->fetchAll();
var_dump($data);
$stmt->release();
});
``` **master slave(последняя версия поддерживает разделение чтения и записи и балансировку нагрузки от библиотеки, использование следующее)***********************/**
$config = array( 'master' => array( 'data_source' => "mysql:host=192.168.1.19;dbname=db1", 'username' => "public_user", 'pwd' => "1qa2ws3ed", 'options' => array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 3, PDO::ATTR_CASE => PDO::CASE_UPPER, ), ), 'slave' => array( "0" => array( 'data_source' => "mysql:host=192.168.1.20;dbname=db2", 'username' => "public_user", 'pwd' => "1qa2ws3ed", 'options' => array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 3, PDO::ATTR_CASE => PDO::CASE_UPPER, ), ), "1" => array( 'data_source' => "mysql:host=192.168.1.21;dbname=db3", 'username' => "public_user", 'pwd' => "1qa2ws3ed", 'options' => array( PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, PDO::ATTR_TIMEOUT => 3, PDO::ATTR_CASE => PDO::CASE_LOWER, ), ), ), ); /* * ***************"select"и"show"начинающиеся операторы идут на случайный узел из библиотеки */
$obj1 = new pdoProxy($config); $rs = $obj1->query("select * from test limit 1"); var_dump($rs->fetchAll()); //идём на случайный узел из библиотеки $obj1->release();
/* * чтение принудительно идёт на основной узел* */
$obj1->enable_slave = false; $rs = $obj1->query("select * from test limit 1"); var_dump($rs->fetchAll()); //читаем с основного узла $obj1->release();
/* * ***************кроме"select"и"show"начинающихся операторов все идут на основной узел */
$sql = "insert into test
(tid) values (5)";
$rs = $obj1->exec($sql); //идём на основной узел
$obj1->release();
## Тестирование
Запустите команду
`php tests/RunTest.php --host 172.17.0.2 --class RedisTest --test test_set_get`
для выполнения теста. Эта команда принимает три параметра:
+ --host устанавливает адрес хоста, опционально, значение по умолчанию — «127.0.0.1»
+ --class устанавливает имя класса для запуска теста, опционально, значение по умолчанию — «RedisTest»
+ --test устанавливает имя функции теста для запуска, опционально, если не установлено, выполняются все тесты
## Контакты
- http://weibo.com/u/2661945152
- 83212019@qq.com
- qq группа № 538716391
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )