Workerman/MySQL
Hinweis
Diese Bibliothek wird nicht mehr gewartet. Es wird empfohlen, illuminate/database oder topthink/think-orm zu verwenden.
Beschreibung
Programme, die im Speicher residieren, stoßen beim Umgang mit MySQL häufig auf den Fehler mysql gone away. Dieser Fehler tritt auf, wenn die Verbindung zwischen dem Programm und MySQL über einen längeren Zeitraum keine Kommunikation hatte und die Verbindung vom MySQL-Server getrennt wurde. Diese Datenbankklasse kann dieses Problem lösen. Wenn der Fehler mysql gone away auftritt, wird automatisch ein erneuter Versuch unternommen.
Abhängige Erweiterungen
Diese MySQL-Klasse hängt von den beiden Erweiterungen pdo und pdo_mysql ab. Wenn eine der Erweiterungen fehlt, wird der Fehler Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .... ausgegeben.
Wenn Sie den Befehl php -m in der Kommandozeile ausführen, werden alle installierten PHP-CLI-Erweiterungen aufgelistet. Wenn Sie pdo oder pdo_mysql nicht finden, installieren Sie diese bitte selbst.
CentOS-Systeme
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
Wenn Sie die Paketnamen nicht finden können, versuchen Sie yum search php mysql.
Ubuntu/Debian-Systeme
PHP5.x
apt-get install php5-mysql
PHP7.x
apt-get install php7.0-mysql
Wenn Sie die Paketnamen nicht finden können, versuchen Sie apt-cache search php mysql.
Konnte mit den oben genannten Methoden nicht installiert werden?
Wenn Sie mit den oben genannten Methoden nicht installieren können, lesen Sie bitte das Workerman-Handbuch - Anhang - Erweiterungen installieren - Methode 3: Quellcode kompilieren und installieren.
Installation von Workerman/MySQL
Methode 1:
Sie können es über Composer installieren, führen Sie den folgenden Befehl in der Kommandozeile aus (Composer-Quellen sind im Ausland, der Installationsprozess kann sehr langsam sein).
composer require workerman/mysql
Wenn der obige Befehl erfolgreich ist, wird das Verzeichnis vendor erstellt. Binden Sie dann die autoload.php unter vendor in Ihr Projekt ein.
require_once __DIR__ . '/vendor/autoload.php';
Methode 2:
Laden Sie den Quellcode herunter, das entpackte Verzeichnis an einem beliebigen Ort in Ihrem Projekt ablegen und die Quelldatei direkt einbinden.
require_once '/your/path/of/mysql-master/src/Connection.php';
Hinweis
Es wird dringend empfohlen, die Datenbankverbindung im onWorkerStart Callback zu initialisieren, um zu vermeiden, dass die Verbindung vor der Ausführung von Worker::runAll(); initialisiert wird. Die vor dem Ausführen von Worker::runAll(); initialisierte Verbindung gehört zum Hauptprozess, und der Kindprozess wird diese Verbindung erben. Das gemeinsame Verwenden der gleichen Datenbankverbindung zwischen Haupt- und Kindprozessen führt zu Fehlern.
Beispiel
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-Instanz in einer globalen Variable speichern (kann auch in einem statischen Mitglied einer Klasse gespeichert werden)
global $db;
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// db-Instanz über die globale Variable abrufen
global $db;
// SQL ausführen
$all_tables = $db->query('show tables');
$connection->send(json_encode($all_tables));
};
// Worker ausführen
Worker::runAll();
Detaillierte Verwendung von MySQL/Connection
// db-Verbindung initialisieren
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
// Alle Daten abrufen
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// Entspricht
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// Entspricht
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");
// Eine Zeile Daten abrufen
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// Entspricht
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// Entspricht
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");
// Eine Spalte Daten abrufen
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// Entspricht
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// Entspricht
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");
// Einen einzelnen Wert abrufen
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// Entspricht
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// Entspricht
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");
// Komplexe Abfrage
$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));
// Entspricht
$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');
// Einfügen
$insert_id = $db->insert('Persons')->cols(array(
'Firstname'=>'abc',
'Lastname'=>'efg',
'Sex'=>'M',
'Age'=>13))->query();
entspricht
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");
// Aktualisieren
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// Entspricht
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// Entspricht
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");
// Löschen
$row_count = $db->delete('Persons')->where('ID=9')->query();
// Entspricht
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");
// Transaktionen
$db->beginTrans();
....
$db->commitTrans(); // oder $db->rollBackTrans();