Workerman/MySQL

Attenzione
Questa libreria non è più mantenuta, si consiglia di usare illuminate/database o topthink/think-orm

Descrizione

I programmi che rimangono attivi in memoria possono spesso incontrare l'errore mysql gone away quando utilizzano mysql; ciò è dovuto al fatto che la connessione con mysql è inattiva per un lungo periodo e viene espulsa dal server mysql. Questa classe di database può risolvere questo problema, poiché quando si verifica l'errore mysql gone away, tenterà automaticamente di riconnettersi.

Estensioni richieste

Questa classe mysql dipende da due estensioni: pdo e pdo_mysql; se mancano, verrà visualizzato l'errore Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .....

Eseguendo il comando php -m dall'interfaccia a riga di comando verranno elencate tutte le estensioni php cli installate. Se non ci sono pdo o pdo_mysql, si prega di installarli.

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

Se non riesci a trovare il nome del pacchetto, prova a cercare con yum search php mysql

Sistema ubuntu/debian

PHP5.x

apt-get install php5-mysql

PHP7.x

apt-get install php7.0-mysql

Se non riesci a trovare il nome del pacchetto, prova a cercare con apt-cache search php mysql

Non riesci a installare usando i metodi sopra?

Se i metodi sopra non funzionano, fare riferimento a manuale workerman - appendice - Installazione estensioni - Metodo tre compilazione sorgenti.

Installazione Workerman/MySQL

Metodo 1:

Puoi installarlo tramite composer, eseguendo il seguente comando dalla riga di comando (poiché la sorgente composer si trova all'estero, il processo di installazione potrebbe essere molto lento).

composer require workerman/mysql

Dopo che il comando sopra è stato eseguito con successo, verrà generata la directory vendor, quindi includere autoload.php nella tua applicazione.

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

Metodo 2:

Scarica il sorgente, posiziona la directory decompressa nel tuo progetto (in qualsiasi posizione) e richiedi direttamente il file sorgente.

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

Avviso

Si consiglia vivamente di inizializzare la connessione al database all'interno del callback onWorkerStart, ed evitare di inizializzarla prima che venga eseguito Worker::runAll();. La connessione inizializzata prima dell'esecuzione di Worker::runAll(); appartiene al processo principale, e il processo secondario erediterà questa connessione, il che potrebbe causare errori a causa della condivisione della stessa connessione al database tra il processo principale e quello secondario.

Esempio

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)
{
    // Memorizza l'istanza db in una variabile globale (può anche essere memorizzata in un membro statico di una classe)
    global $db;
    $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // Ottieni l'istanza db tramite la variabile globale
    global $db;
    // Esegui SQL
    $all_tables = $db->query('show tables');
    $connection->send(json_encode($all_tables));
};
// Esegui worker
Worker::runAll();

Dettagli sull'uso di MySQL/Connection

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

// Ottieni tutti i dati
$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");

// Ottieni una riga di dati
$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'");

// Ottieni una colonna di dati
$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'");

// Ottieni un singolo valore
$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'");

// Query complesse
$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');

// Inserimento
$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)");

// Aggiornamento
$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");

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

// Transazioni
$db->beginTrans();
....
$db->commitTrans(); // o $db->rollBackTrans();