Workerman/MySQL

Dikkat
Bu kütüphane artık bakımda değildir, illuminate/database veya topthink/think-orm kullanılması önerilir.

Açıklama

Bellekte sürekli çalışan uygulamalar, mysql kullanırken sıkça mysql gone away hatası ile karşılaşırlar; bu, uygulama ile mysql arasındaki bağlantının uzun süre iletişim kurmaması nedeniyle mysql sunucusu tarafından bağlantının kapatılmasından kaynaklanır. Bu veritabanı sınıfı bu sorunu çözebilir; mysql gone away hatası meydana geldiğinde, otomatik olarak bir kez daha deneyecektir.

Bağımlı Uzantılar

Bu mysql sınıfı, pdo ve pdo_mysql adlı iki uzantıya bağımlıdır, eksik uzantılarla Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .... hatası verir.

Komut satırında php -m çalıştırmak, tüm php cli tarafından yüklü olan uzantıları listeleyecektir. Eğer pdo veya pdo_mysql yoksa, lütfen kendiniz kurun.

centos sistemi

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

Paket adını bulamıyorsanız, yum search php mysql ile arama yapmayı deneyin.

ubuntu/debian sistemi

PHP5.x

apt-get install php5-mysql

PHP7.x

apt-get install php7.0-mysql

Paket adını bulamıyorsanız, apt-cache search php mysql ile arama yapmayı deneyin.

Yukarıdaki yöntemlerle yükleyemiyor musunuz?

Eğer yukarıdaki yöntemlerle yükleyemiyorsanız, lütfen workerman belgesi - Ek - Uzantı Yükleme - Üçüncü Yöntem: Kaynak Kodunu Derleyerek Kurma kısmına bakın.

Workerman/MySQL Kurulumu

Yöntem 1:

Composer ile yükleyebilirsiniz, komut satırında aşağıdaki komutu çalıştırın (composer kaynağı yurtdışında, yükleme süreci oldukça yavaş olabilir).

composer require workerman/mysql

Yukarıdaki komut başarıyla çalıştığında vendor dizini oluşturulacaktır, ardından projede vendor altındaki autoload.php dosyasını dahil edin.

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

Yöntem 2:

Kaynağı indirin, sıkıştırılmış dosyayı çıkardıktan sonra dizini kendi projenize yerleştirin (herhangi bir konumda), kaynak dosyayı doğrudan require edin.

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

Dikkat

Veritabanı bağlantısını onWorkerStart geri çağırmasında başlatmanız şiddetle tavsiye edilir, Worker::runAll(); çalıştırılmadan önce bağlantıyı başlatmaktan kaçının; çünkü Worker::runAll(); çalıştırılmadan önce başlatılan bağlantı ana süreçte yer alır ve alt süreç bu bağlantıyı miras alır. Ana süreç ile alt süreçlerin aynı veritabanı bağlantısını paylaşması hatalara yol açabilir.

Örnek

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 örneğini global değişkende saklayın (aynı zamanda belirli bir sınıfın statik üyesinde de saklayabilirsiniz)
    global $db;
    $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // db örneğini global değişkenden alın
    global $db;
    // SQL çalıştırma
    $all_tables = $db->query('show tables');
    $connection->send(json_encode($all_tables));
};
// worker'ı çalıştır
Worker::runAll();

MySQL/Connection Kullanım Detayları

// db bağlantısını başlat
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');

// Tüm verileri al
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// eşdeğerdir
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// eşdeğerdir
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");

// Bir satırı al
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// eşdeğerdir
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// eşdeğerdir
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");

// Bir sütunu al
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// eşdeğerdir
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// eşdeğerdir
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");

// Tek bir değer al
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// eşdeğerdir
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// eşdeğerdir
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");

// Karmaşık sorgu
$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));
// eşdeğerdir
$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');

// Ekle
$insert_id = $db->insert('Persons')->cols(array(
    'Firstname'=>'abc',
    'Lastname'=>'efg',
    'Sex'=>'M',
    'Age'=>13))->query();
eşdeğerdir
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");

// Güncelle
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// eşdeğerdir
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// eşdeğerdir
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");

// Sil
$row_count = $db->delete('Persons')->where('ID=9')->query();
// eşdeğerdir
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");

// İşlem
$db->beginTrans();
....
$db->commitTrans(); // ya da $db->rollBackTrans();