Workerman/MySQL

Note
Cette bibliothèque n'est plus maintenue, il est recommandé d'utiliser illuminate/database ou topthink/think-orm

Description

Les programmes résidant en mémoire rencontrent souvent l'erreur mysql gone away lors de l'utilisation de mysql. Cela est dû au fait que la connexion avec mysql n'a pas communiqué pendant une longue période, entraînant un débranchement de la connexion par le serveur mysql. Cette classe de base de données peut résoudre ce problème : lorsqu'elle rencontre une erreur mysql gone away, elle réessaiera automatiquement une fois.

Extensions dépendantes

Cette classe mysql dépend de deux extensions, pdo et pdo_mysql. L'absence de ces extensions entraînera l'erreur Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .....

L'exécution de la commande en ligne php -m listera toutes les extensions php cli installées. Si pdo ou pdo_mysql n'est pas présent, veuillez les installer vous-même.

Système 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 vous ne trouvez pas le nom du paquet, essayez d'utiliser yum search php mysql pour le chercher.

Système ubuntu/debian

PHP5.x

apt-get install php5-mysql

PHP7.x

apt-get install php7.0-mysql

Si vous ne trouvez pas le nom du paquet, essayez d'utiliser apt-cache search php mysql pour le chercher.

Vous ne pouvez pas installer avec les méthodes ci-dessus ?

Si les méthodes ci-dessus ne fonctionnent pas, veuillez consulter workerman doc - annexe - installation des extensions - méthode 3 compilation depuis le code source.

Installation de Workerman/MySQL

Méthode 1 :

Vous pouvez installer via composer, exécutez la commande suivante en ligne de commande (la source composer est à l'étranger, le processus d'installation peut être très lent).

composer require workerman/mysql

Après le succès de la commande ci-dessus, le répertoire vendor sera créé, puis incluez vendor/autoload.php dans votre projet.

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

Méthode 2 :

Télécharger le code source, placez le répertoire extrait dans votre projet (n'importe où), et incluez directement le fichier source.

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

Remarque

Il est fortement recommandé d'initialiser la connexion à la base de données dans le rappel onWorkerStart, afin d'éviter d'initialiser la connexion avant l'exécution de Worker::runAll();. La connexion initialisée avant l'exécution de Worker::runAll(); appartient au processus principal, et les processus enfants hériteront de cette connexion. Partager la même connexion à la base de données entre le processus principal et les processus enfants peut entraîner des erreurs.

Exemple

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)
{
    // Stocker l'instance db dans une variable globale (peut également être stockée dans un membre statique de certaines classes)
    global $db;
    $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // Obtenir l'instance db via la variable globale
    global $db;
    // Exécuter SQL
    $all_tables = $db->query('show tables');
    $connection->send(json_encode($all_tables));
};
// Exécuter le worker
Worker::runAll();

Utilisation spécifique de MySQL/Connection

// Initialiser la connexion db
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');

// Obtenir toutes les données
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// équivalent à
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// équivalent à
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");

// Obtenir une ligne de données
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// équivalent à
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// équivalent à
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");

// Obtenir une colonne de données
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// équivalent à
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// équivalent à
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");

// Obtenir une seule valeur
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// équivalent à
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// équivalent à
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");

// Requête complexe
$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));
// équivalent à
$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');

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

// Mise à jour
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// équivalent à
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// équivalent à
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");

// Suppression
$row_count = $db->delete('Persons')->where('ID=9')->query();
// équivalent à
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");

// Transaction
$db->beginTrans();
....
$db->commitTrans(); // ou $db->rollBackTrans();