Workerman/MySQL

Внимание
Эта библиотека больше не поддерживается, рекомендуется использовать illuminate/database или topthink/think-orm

Описание

Программы, работающие в памяти, часто сталкиваются с ошибкой mysql gone away при использовании mysql. Это происходит из-за того, что программа долгое время не общалась с mysql, и соединение было разорвано сервером mysql. Этот класс базы данных может решить эту проблему, автоматически повторяя попытку соединения при возникновении ошибки mysql gone away.

Зависимые расширения

Этот класс mysql зависит от расширений pdo и pdo_mysql; отсутствие расширений вызовет ошибку Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .....

Запустите команду php -m в командной строке, чтобы увидеть все установленные расширения php cli. Если pdo или pdo_mysql отсутствуют, установите их самостоятельно.

Система centos

PHP5.x

yum install php-pdo
yum install php-mysql

PHP7.x

yum install php70w-pdo_dblib.x86_64
yum install php70w-mysqlnd.x86_64

Если пакеты не найдены, попробуйте выполнить yum search php mysql для поиска.

Система ubuntu/debian

PHP5.x

apt-get install php5-mysql

PHP7.x

apt-get install php7.0-mysql

Если пакеты не найдены, попробуйте выполнить apt-cache search php mysql для поиска.

Не удается установить вышеописанные методы?

Если вышеперечисленные методы не помогают, обратитесь к руководству Workerman - приложение - Установка расширений - Метод 3: Установка через сборку исходного кода.

Установка Workerman/MySQL

Метод 1:

Можно установить через composer, запустив следующую команду (источники composer находятся за границей, так что процесс установки может занять много времени).

composer require workerman/mysql

После успешного выполнения этой команды будет создана директория vendor, затем подключите autoload.php из директории vendor в проекте.

require_once __DIR__ . '/vendor/autoload.php';

Метод 2:

Скачайте исходный код, поместите распакованную директорию в свой проект (в произвольное место) и напрямую подключите исходный файл.

require_once '/your/path/of/mysql-master/src/Connection.php';

Внимание

Рекомендуется инициализировать соединение с базой данных в обратном вызове onWorkerStart, чтобы избежать инициализации соединения до выполнения Worker::runAll();. Инициализированное соединение до выполнения Worker::runAll(); принадлежит основному процессу, и дочерние процессы унаследуют это соединение, что может привести к ошибкам из-за совместного использования одного и того же соединения между основным и дочерними процессами.

Пример

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onWorkerStart = function($worker)
{
    // Сохраняем экземпляр db в глобальной переменной (можно также сохранить в статическом члене какого-либо класса)
    global $db;
    $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // Получаем экземпляр db через глобальную переменную
    global $db;
    // Выполняем SQL запрос
    $all_tables = $db->query('show tables');
    $connection->send(json_encode($all_tables));
};
// Запускаем worker
Worker::runAll();

Конкретное использование MySQL/Connection

// Инициализация соединения с db
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');

// Получение всех данных
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// эквивалентно
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// эквивалентно
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");

// Получение одной строки данных
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// эквивалентно
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// эквивалентно
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");

// Получение одного столбца данных
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// эквивалентно
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// эквивалентно
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");

// Получение одного значения
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// эквивалентно
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// эквивалентно
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");

// Сложный запрос
$db->select('*')->from('table1')->innerJoin('table2','table1.uid = table2.uid')->where('age > :age')->groupBy(array('aid'))->having('foo="foo"')->orderByASC/*orderByDESC*/(array('did'))
->limit(10)->offset(20)->bindValues(array('age' => 13));
// эквивалентно
$db->query('SELECT * FROM `table1` INNER JOIN `table2` ON `table1`.`uid` = `table2`.`uid`
WHERE age > 13 GROUP BY aid HAVING foo="foo" ORDER BY did LIMIT 10 OFFSET 20');

// Вставка
$insert_id = $db->insert('Persons')->cols(array(
    'Firstname'=>'abc',
    'Lastname'=>'efg',
    'Sex'=>'M',
    'Age'=>13))->query();
эквивалентно
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");

// Обновление
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// эквивалентно
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// эквивалентно
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");

// Удаление
$row_count = $db->delete('Persons')->where('ID=9')->query();
// эквивалентно
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");

// Транзакции
$db->beginTrans();
....
$db->commitTrans(); // или $db->rollBackTrans();