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();