1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/Gxhua-php-cp

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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.

Установка:

  1. phpize && ./configure && make install.
  2. echo "extension=xx/connect_pool.so" >> php.ini.

Использование Docker для установки:

Можно использовать Docker для компиляции. Необходимо выполнить следующие шаги в корневом каталоге проекта:

  1. Скопировать файл php.ini.example как php.ini, изменить файл pool.ini.
  2. Выполнить команду docker build -t php-cp .

Технические характеристики:

  • Предоставлен метод release, который вызывается после каждого получения данных (redis get set), чтобы вернуть соединение в пул, избегая проблем с большим количеством соединений в слое базы данных из-за других длительных операций.
  • Поддерживаются минимальные и максимальные настройки количества соединений.
  • Соединения автоматически пингуют базу данных, предотвращая проблемы с исчезновением соединения из-за небольшого давления и отсутствия запросов в течение длительного времени.
  • Автоматически получает (максимум до максимального количества соединений) или освобождает (от минимального до минимального количества соединений) соединения в пуле в зависимости от нагрузки.
  • Несмотря на то что запросы проходят через прокси-процесс, существенной потери производительности не происходит.
  • Когда все соединения в пуле заняты, последующие процессы, пытающиеся получить соединения, будут ожидать в очереди, пока занятые соединения не будут освобождены.
  • Прозрачная интеграция позволяет заменить традиционные операции pdo и redis, просто изменив имя нового класса и вызывая release при необходимости (можно интегрировать в слой базы данных).
  • Поддержка разделения чтения и записи pdo и балансировки нагрузки от сервера к серверу.
  • Поддержка асинхронных запросов pdo и redis в режиме командной строки.
  • Поддержка журналов медленных запросов (max_hold_time_to_log) и журналов больших блоков данных (max_data_size_to_log).

Советы:

  • При завершении запроса (rshutdown/mshutdown) будет автоматически вызван release, но не следует полагаться на этот release, иначе использование соединений будет низким.
  • Относительно исключений: pdoProxy и оригинальный Pdo отличаются тем, что по умолчанию pdo работает в тихом режиме без выдачи исключений, а pdoProxy выдаёт исключения (используя класс Exception, а не PDOException).
  • Pool_server должен запускаться с правами root.
  • Redis не поддерживает методы pub/sub.
  • После использования одного соединения (например, fetchAll завершается), необходимо вызвать release, чтобы немедленно освободить соединение обратно в пул (если транзакция требует освобождения после commit или rollback, можно вызвать release в коде фреймворка после каждого fetch (или get/set)).

Интегрированные фреймворки:

Применение:

  • Переместить файл pool.ini из проекта в /etc/pool.ini и настроить его в соответствии с требованиями.
$ 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 //просмотреть статус службы
  • Для ежедневной разработки: добавьте исходный код этого проекта в IDE в качестве внешней библиотеки, чтобы получить подсказки кода. Не добавляйте путь включения конфигурации PHP.
<?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 )

Вы можете оставить комментарий после Вход в систему

Введение

Подключение к прокси через PHP предоставляет пул соединений, асинхронное использование PDO и Redis, разделение операций чтения и записи, балансировку нагрузки, а также функции логирования. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/Gxhua-php-cp.git
git@api.gitlife.ru:oschina-mirror/Gxhua-php-cp.git
oschina-mirror
Gxhua-php-cp
Gxhua-php-cp
master