Workerman/MySQL

Nota
Esta biblioteca ya no se mantiene, se recomienda usar illuminate/database o topthink/think-orm

Descripción

Los programas que permanecen en memoria a menudo enfrentan el error mysql gone away al usar MySQL, lo que se debe a que la conexión entre el programa y MySQL no ha tenido comunicación durante un período prolongado, y la conexión ha sido cerrada por el servidor MySQL. Esta clase de base de datos puede resolver este problema; cuando ocurre un error de mysql gone away, se reintentará automáticamente una vez.

Dependencias

Esta clase MySQL depende de las extensiones pdo y pdo_mysql. La falta de estas extensiones generará el error Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .....

Ejecutar el comando php -m en la línea de comandos listará todas las extensiones de PHP CLI instaladas; si no hay pdo o pdo_mysql, instálelo usted mismo.

Sistema 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

Si no puede encontrar el nombre del paquete, intente usar yum search php mysql para buscar.

Sistema ubuntu/debian

PHP5.x

apt-get install php5-mysql

PHP7.x

apt-get install php7.0-mysql

Si no puede encontrar el nombre del paquete, intente usar apt-cache search php mysql para buscar.

¿No se puede instalar con los métodos anteriores?

Si los métodos anteriores no funcionan, consulte manual de workerman - apéndice - instalación de extensiones - método tres: instalación por compilación de código fuente.

Instalación de Workerman/MySQL

Método 1:

Se puede instalar a través de composer, ejecute el siguiente comando en la línea de comandos (la fuente de composer está en el extranjero, el proceso de instalación puede ser muy lento).

composer require workerman/mysql

Después de que el comando anterior se ejecute correctamente, se generará un directorio vendor, luego incluya el autoload.php en el proyecto.

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

Método 2:

Descargar el código fuente, coloque el directorio descomprimido en su proyecto (la ubicación es arbitraria) y requiera directamente los archivos fuente.

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

Nota

Se recomienda encarecidamente inicializar la conexión de la base de datos en el callback onWorkerStart, evitando inicializar la conexión antes de ejecutar Worker::runAll();. La conexión inicializada antes de la ejecución de Worker::runAll(); pertenece al proceso principal, y los procesos secundarios heredarán esta conexión, lo que hará que el proceso principal y los procesos secundarios compartan la misma conexión de base de datos, lo cual generará errores.

Ejemplo

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)
{
    // Almacena la instancia de db en una variable global (también se puede almacenar en un miembro estático de alguna clase)
    global $db;
    $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // Obtener la instancia de db a través de la variable global
    global $db;
    // Ejecutar SQL
    $all_tables = $db->query('show tables');
    $connection->send(json_encode($all_tables));
};
// Ejecutar worker
Worker::runAll();

Uso específico de MySQL/Connection

// Inicializar conexión de db
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');

// Obtener todos los datos
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// Equivalente a
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// Equivalente a
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");

// Obtener una fila de datos
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// Equivalente a
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// Equivalente a
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");

// Obtener una columna de datos
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// Equivalente a
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// Equivalente a
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");

// Obtener un solo valor
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// Equivalente a
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// Equivalente a
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");

// Consulta compleja
$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));
// Equivalente a
$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');

// Insertar
$insert_id = $db->insert('Persons')->cols(array(
    'Firstname'=>'abc',
    'Lastname'=>'efg',
    'Sex'=>'M',
    'Age'=>13))->query();
 // Equivalente a
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");

// Actualizar
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// Equivalente a
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// Equivalente a
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");

// Borrar
$row_count = $db->delete('Persons')->where('ID=9')->query();
// Equivalente a
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");

// Transacción
$db->beginTrans();
....
$db->commitTrans(); // o $db->rollBackTrans();