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

OSCHINA-MIRROR/pipixia-pi-swoole-orm

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

swoole-orm

На основе swoole реализован упрощённый в виде MySQL пул соединений. Позволяет совместно использовать один и тот же клиентский сокет нескольким воркерам.

Благодарности за доработки

[1] nowbe (https://gitee.com/nowbe) — добавлена возможность возвращать insert_id при добавлении данных.

Версия

v0.0.1

  • Завершено создание базовой версии.

v0.0.2

  • Исправлена ошибка в запросе find().

v0.0.3

  • splqueque заменён на channel.
  • Добавлена функция lock().
  • Добавлен журнал.
  • Введены префиксы для таблиц.

v0.0.4

  • Добавлена опция setDefer, которая по умолчанию возвращает результат выполнения запроса (true). Для некоторых операций, таких как insert или update, если результат не требуется, можно установить значение false.
  • Обработка запросов переведена на язык Go.
  • Доработана функциональность журнала.

v0.0.5

  • Журнал исключений и ошибок перенесён в файл журнала. Исключения теперь выбрасываются.
  • Реализована функция переподключения после разрыва соединения.
  • Добавлена функция instance(), которая позволяет получить соединение при необходимости расширения функционала или совместного использования пула соединений, например, для обработки транзакций.
  • Добавлена функция put(), которая возвращает соединение в пул после его использования.
  • Исправлено поведение функции find(), теперь она возвращает одномерный массив.

v0.0.6

  • Устранено предупреждение о типе возвращаемого значения.
  • Исправлены ошибки в запросах с использованием where.

v0.0.7

  • Исправлен баг в запросах, использующих or в where.

Установка

>composer require sethink/swoole-orm

Пример использования

<?php
namespace Demo;

include_once "./vendor/autoload.php";

use sethink\swooleOrm\Db;
use sethink\swooleOrm\MysqlPool;
use swoole;

class Demo
{
    protected $server;
    protected $MysqlPool;

    public function __construct()
    {
        $this->server = new Swoole\Http\Server("0.0.0.0", 9501);
        $this->server->set(array(
            'worker_num'    => 4,
            'max_request'   => 50000,
            'reload_async'  => true,
            'max_wait_time' => 30,
        ));

        $this->server->on('Start', function ($server) {});
        $this->server->on('ManagerStart', function ($server) {});
        $this->server->on('WorkerStart', array($this, 'onWorkerStart'));
        $this->server->on('WorkerStop', function ($server, $worker_id) {});
        $this->server->on('open', function ($server, $request) {});
        $this->server->on('Request', array($this, 'onRequest'));
        $this->server->start();
    }

    public function onWorkerStart($server, $worker_id)
    {
        $config = [
            'host'      => '127.0.0.1', //Сервер
            'port'      => 3306,    //Порт
            'user'      => 'root',  //Пользователь
            'password'  => 'root',  //Пароль
            'charset'   => 'utf8',  //Кодировка
            'database'  => 'test',  //База данных
            'prefix'    => 'sethink_',  //Префикс таблицы
            'poolMin'   => 5, //Минимальное количество свободных соединений
            'poolMax'   => 1000,    //Максимальное количество соединений в пуле
            'clearTime' => 60000, //Время очистки таймера для освобождения соединений
            'clearAll'  => 300000,  //Время полного освобождения всех соединений
            'setDefer'  => true     //Возвращать ли результат выполнения запроса
        ];
        $this->MysqlPool = new MysqlPool($config);
        unset($config);

        //Запуск таймера очистки соединений
        $this->MysqlPool->clearTimer($server);
    }

    public function onRequest($request, $response)
    {
        $rs = Db::init($this->MysqlPool)
            ->name('tt')
            ->select();
        var_dump($rs);
    }
}

new Demo();

Основные операции

Запрос

Запрос одной строки

<?php
Db::init($this->MysqlPool)
    ->name('user_info')
    ->field('id,username,info')
    ->where(['username'=>'sethink','password'=>'sethink'])
    ->find();

Запрос нескольких строк

<?php
Db::init($this->MysqlPool)
    ->name('info')
    ->field('id,username,password,info')
    ->select();

Добавление

Добавление одной строки данных

<?php
$data = [
    'username' => 'sethink2',
    'password' => 'sethink2',
    'info'     => 'ceshi2'
];

Db::init($this->MysqlPool)
    ->name('user_info')
    ->insert($data);

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

<?php
$data = [
    [
        'username' => 'sethink3',
        'password' => 'sethink3',
        'info'     => 'ceshi3'
    ],
    [
        'username' => 'sethink4',
        'password' => 'password4',
        'info'     => 'ceshi4'
    ]
];

Db::init($this->MysqlPool)
    ->name('user_info')
    ->insertAll($data);

Обновление данных

<?php
Db::init($this->MysqlPool)
    ->name('user_info')
    ->where(['username'=>'sethink4'])
    ->update(['password'=>'sethink4-4']);

Удаление данных

<?php
Db::init($this->MysqlPool)
    ->name('user_info')
    ->where(['username'=>'sethink4'])
    ->delete();

Подробное описание

init($server)

  • $server — объект сервера swoole.

instance()

  • Если необходимо расширить функционал или совместно использовать пул соединений, например, для работы с транзакциями, то можно получить отдельное соединение через функцию instance(). Пример:
<?php
$mysql = Db::init($this->MysqlPool)->instance();

put($mysql)

  • Возвращает соединение в пул. Использование совместно с instance, после завершения работы с соединением, поместите соединение обратно в пул соединений.

name($tableName)

$tableName — имя таблицы (строка).

field($field)

$field — имя поля для запроса (строка).

order($order)

$order — порядок сортировки (массив, одномерный или двумерный).

Пример:

Если $order является одномерным массивом:

<?php
Db::init($this->MysqlPool)
    ->name('user_info')
    ->field('id,username')
    ->order(['id'=>'desc'])
    ->select();

Если $order является двумерным массивом:

<?php
Db::int($this->MysqlPool)
    ->name('user_info')
    ->field('id, username')
    ->order([['id'=>'desc'], ['info'=>'asc']])
    ->select();

group($group)

group by — группировка (строка).

Пример:

<?php
Db::init($this->MysqlPool)
    ->name('user_info')
    ->field('id,username')
    ->group('info')
    ->select();

having($having)

Используется для настройки фильтрации данных из группы group. (Строка.)

Пример:

<?php
Db::init($this->MysqlPool)
    ->name('user_info')
    ->field('id,username')
    ->group('info')
    ->having('count(info) > 5')
    ->select();

distinct($distinct)

Убирает дубликаты данных. $distinct имеет значение bool.

Пример:

<?php
Db::init($this->MysqlPool)
    ->name('user_info')
    ->field('id,username')
    ->distinct(true)
    ->select();

lock($state)

Добавляет блокировку.

Пример 1: передача значения bool:

//1、传入 bool 值
Db::init($this->MysqlPool)
    ->name('user_info')
    ->where(['id'=>1])
    ->lock(true)
    ->find();
//会自动在 sql 语句加上 FOR UPDATE

Пример 2: передача строки:

//2、传入字符串
Db::init($this->MysqlPool)
    ->name('user_info')
    ->where(['id'=>1])
    ->lock('lock in share mode')
    ->find();
//特殊锁要求

fetchSql()

Получает SQL-запрос.

Пример:

<?php
Db::init($this->MysqlPool)
    ->name('user_info')
    ->field('id,username')
    ->fetchSql()
    ->select();

where($whereArray)

$whereArray — массив.

Примеры:

//1、
$where = [
    'id'=>'1'
];
//2、
$where = [
    'id'=>['>',5]
];
//3、
$where = [
    'username'=>['LIKE','%seth%']
];
//4、
$where = [
    'id'=>['in',['1','5']]
];
//5、
$where = [
    'note_info'=>['=','sethink','or']
];
Db::init($this->MysqlPool)
    ->name('user_info')
    ->field('id,username')
    ->where($where)
    ->select();
Db::init($this->MysqlPool)
    ->name('user_info')
    ->field('id,username')
    ->where(['id'=>['>',5]])
    ->where(['id'=>['<=',10]])
    ->select();

find()

Выполняет запрос и возвращает одномерный массив.

select()

Выполняет запрос и возвращает двумерный массив.

insert($data)

Вставляет одну строку данных. $data — одномерный массив.

insertAll($data)

Вставляет несколько строк данных. $data — двумерный массив.

update($data)

Обновляет данные. $data — одномерный массив.

delete()

Удаляет данные.

query($sql)

Выполняет SQL-запрос (строка).

Пример:

<?php
$sql = 'select * from `user_info`';
Db::init($this->MysqlPool)->query($sql);

setDefer($bool)

Для некоторых операций, таких как insert, update и т. д., если результат не требуется, можно установить значение false. В отличие от true, когда основной процесс и подпроцесс не должны обмениваться данными после выполнения SQL, программа может продолжить работу без ожидания результата. Также можно настроить глобально, добавив конфигурацию:

$config = [ 'setDefer' => true //установка, нужно ли возвращать результат, по умолчанию true ]; $this->MysqlPool = new MysqlPool($config);

Пример использования:

    //эта операция не вернёт результат
    Db::init($this->MysqlPool)
        ->name('user_info')
        ->setDefer(false)
        ->insert(['username'=>'sethink_5']);

Комментарии ( 0 )

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

Введение

На основе пула соединений MySQL для сопрограмм swoole, простая упаковка. Реализовано совместное использование одного и того же клиента-сопрограммы между несколькими сопрограммами. Смотрите thinkphp-orm. Развернуть Свернуть
Apache-2.0
Отмена

Обновления

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

Участники

все

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

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