На основе swoole реализован упрощённый в виде MySQL пул соединений. Позволяет совместно использовать один и тот же клиентский сокет нескольким воркерам.
[1] nowbe (https://gitee.com/nowbe) — добавлена возможность возвращать insert_id при добавлении данных.
>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();
<?php
$mysql = Db::init($this->MysqlPool)->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 )