Workerman/MySQL
Açıklama
Sürekli bellekte çalışan bir program, genellikle mysql kullanırken mysql gone away
hatasıyla karşılaşır, bu, programın MySQL ile iletişim kurmaması sonucu uzun süre bağlantının kesilmesine neden olan bir hatadır. Bu veritabanı sınıfı bu sorunu çözebilir, mysql gone away
hatası oluştuğunda otomatik olarak bir kez yeniden deneyecektir.
Bağımlılıklar
Bu mysql sınıfı pdo ve pdo_mysql iki uzantıya bağlıdır, eksik uzantılar Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in ....
hatasına neden olabilir.
Komut satırında php -m
komutunu çalıştırarak yüklü PHP CLI uzantılarının listesini görebilirsiniz, eğer pdo veya pdo_mysql bulamazsanız lütfen kendiniz yükleyin.
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
Eğer paket adını bulamazsanız, yum search php mysql
komutunu kullanarak arayabilirsiniz.
Ubuntu/Debian Sistemi
PHP5.x
apt-get install php5-mysql
PHP7.x
apt-get install php7.0-mysql
Eğer paket adını bulamazsanız, apt-cache search php mysql
komutunu kullanarak arayabilirsiniz.
Yukarıdaki yöntemlerle yüklenemiyor mu?
Eğer yukarıdaki yöntemlerle yüklenemiyorsa, lütfen Workerman el kitabı - Ekler - Uzantıları Yükleme - Üçüncü Yöntem: Kaynak Kodunu Derleyerek Yükleme bölümüne bakın.
Workerman/MySQL Kurulumu
Yöntem 1:
Composer aracılığıyla aşağıdaki komutu çalıştırarak yükleyebilirsiniz (composer kaynağı yurtdışında olduğu için kurulum süreci oldukça yavaş olabilir).
composer require workerman/mysql
Yukarıdaki komut başarıyla çalıştıktan sonra vendor dizini oluşturulur, ardından projeye bu dizinin altındaki autoload.php dosyasını ekleyin.
require_once __DIR__ . '/vendor/autoload.php';
Yöntem 2:
Kaynak kodunu indirin, ardından zip dosyasını açarak (herhangi bir konuma) projenize kopyalayın, sonra kaynak dosyasını doğrudan require edin.
require_once '/sizin/dizininiz/mysql-master/src/Connection.php';
Not
Database bağlantısını onWorkerStart
geri çağrı fonksiyonunun içinde başlatmanızı şiddetle tavsiye ederiz, Worker::runAll();
çalıştırılmadan önce bağlantıyı başlatırsanız, bu bağlantı ana sürece ait olur ve alt süreçler bu bağlantıyı devralır, ana süreç ve alt süreçlerin aynı veritabanı bağlantısını paylaşması hatalara neden olabilir.
Ö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şken içinde saklayın (aynı şekilde bir sınıfın statik üyesinde saklayabilirsiniz)
global $db;
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Global değişken aracılığıyla db örneğine erişin
global $db;
// SQL'i çalıştırın
$all_tables = $db->query('show tables');
$connection->send(json_encode($all_tables));
};
// Worker'ı çalıştırın
Worker::runAll();
Workerman/MySQL/Connection Kullanımı
// db bağlantısını başlatın
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
// Tüm verileri alın
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
//eşdeğeri
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
//eşdeğeri
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");
// Bir satır veri al
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
//eşdeğeri
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
//eşdeğeri
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");
// Bir sütun veri al
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
//eşdeğeri
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
//eşdeğeri
$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ğeri
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
//eşdeğeri
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");
// Karmaşık sorgular
$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ğeri
$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');
// Ekleme
$insert_id = $db->insert('Persons')->cols(array(
'Firstname'=>'abc',
'Lastname'=>'efg',
'Sex'=>'M',
'Age'=>13))->query();
eşdeğeri
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");
// Güncelleme
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// eşdeğeri
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// eşdeğeri
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");
// Silme
$row_count = $db->delete('Persons')->where('ID=9')->query();
// eşdeğeri
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");
// İşlem
$db->beginTrans();
....
$db->commitTrans(); // veya $db->rollBackTrans();