Workerman/MySQL

หมายเหตุ
ไลบรารีนี้ไม่ได้รับการบำรุงรักษาอีกต่อไป แนะนำให้ใช้ illuminate/database หรือ topthink/think-orm

คำอธิบาย

โปรแกรมที่ทำงานอยู่ในหน่วยความจำมักพบข้อผิดพลาด mysql gone away เมื่อใช้ MySQL นี่เป็นผลมาจากการเชื่อมต่อกับ MySQL ที่ไม่มีการสื่อสารเป็นระยะเวลานาน ทำให้การเชื่อมต่อถูกตัดขาดโดยเซิร์ฟเวอร์ MySQL คลาสฐานข้อมูลนี้สามารถแก้ไขปัญหานี้ได้ เมื่อเกิดข้อผิดพลาด mysql gone away จะมีการลองเชื่อมต่อใหม่โดยอัตโนมัติ

ส่วนที่ต้องการ

คลาส MySQL นี้ต้องการ pdo และ pdo_mysql สองส่วน หากขาดส่วนหนึ่งส่วนใด จะทำให้เกิดข้อผิดพลาด Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in ....

การรันคำสั่ง php -m ในบรรทัดคำสั่งจะแสดงรายการส่วนที่ติดตั้งใน php cli ทั้งหมด หากไม่มี pdo หรือ pdo_mysql ให้ติดตั้งด้วยตนเอง

ระบบ 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

หากไม่พบชื่อแพ็กเกจ ให้ลองใช้คำสั่ง yum search php mysql เพื่อค้นหา

ระบบ ubuntu/debian

PHP5.x

apt-get install php5-mysql

PHP7.x

apt-get install php7.0-mysql

หากไม่พบชื่อแพ็กเกจ ให้ลองใช้คำสั่ง apt-cache search php mysql เพื่อค้นหา

ติดตั้งด้วยวิธีดังกล่าวไม่ได้?

หากติดตั้งด้วยวิธีดังกล่าวไม่ได้ ขอแนะนำให้ดู workerman คู่มือ - ภาคผนวก - การติดตั้งส่วนขยาย - วิธีที่สาม การติดตั้งจากซอร์สโค้ด

การติดตั้ง Workerman/MySQL

วิธีที่ 1:

สามารถติดตั้งผ่าน composer โดยการรันคำสั่งต่อไปนี้ในบรรทัดคำสั่ง (เนื่องจากแหล่งที่มาของ composer อยู่ต่างประเทศ อาจใช้เวลาติดตั้งนานมาก)

composer require workerman/mysql

เมื่อคำสั่งข้างต้นสำเร็จแล้ว จะมีการสร้างไดเรกทอรี vendor จากนั้นให้นำไฟล์ autoload.php ที่อยู่ใน vendor ไปใช้งานในโปรเจกต์ของคุณ

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

วิธีที่ 2:

ดาวน์โหลดซอร์สโค้ด จากนั้นแยกไฟล์และวางโฟลเดอร์ในโปรเจกต์ของคุณ (วางตำแหน่งใดก็ได้) และใช้ require เพื่อเรียกใช้งานไฟล์ซอร์ส

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

หมายเหตุ

แนะนำอย่างยิ่งให้ทำการสร้างการเชื่อมต่อฐานข้อมูลใน callback onWorkerStart เพื่อหลีกเลี่ยงการสร้างการเชื่อมต่อก่อนการรัน Worker::runAll(); การสร้างการเชื่อมต่อก่อนการรัน Worker::runAll(); จะเป็นการสร้างในกระบวนการหลัก ซึ่งกระบวนการลูกจะสืบทอดการเชื่อมต่อนี้ การที่กระบวนการหลักและกระบวนการลูกใช้การเชื่อมต่อฐานข้อมูลเดียวกันจะทำให้เกิดข้อผิดพลาด

ตัวอย่าง

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 ไว้ในตัวแปรทั่วไประดับหนึ่ง (สามารถเก็บไว้ในสมาชิกรูปแบบคงที่ของคลาสได้ด้วย)
    global $db;
    $db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // รับตัวอย่าง db จากตัวแปรทั่วไประดับหนึ่ง
    global $db;
    // ดำเนินการ SQL
    $all_tables = $db->query('show tables');
    $connection->send(json_encode($all_tables));
};
// รัน worker
Worker::runAll();

การใช้งาน MySQL/Connection แบบละเอียด

// สร้างการเชื่อมต่อ db
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');

// รับข้อมูลทั้งหมด
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
//เทียบเท่ากับ
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
//เทียบเท่ากับ
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");

// รับข้อมูลหนึ่งแถว
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
//เทียบเท่ากับ
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
//เทียบเท่ากับ
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");

// รับข้อมูลหนึ่งคอลัมน์
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
//เทียบเท่ากับ
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
//เทียบเท่ากับ
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");

// รับค่าจากคอลัมน์เดียว
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
//เทียบเท่ากับ
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
//เทียบเท่ากับ
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");

// การค้นหาที่ซับซ้อน
$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));
// เทียบเท่ากับ
$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');

// การแทรก
$insert_id = $db->insert('Persons')->cols(array(
    'Firstname'=>'abc',
    'Lastname'=>'efg',
    'Sex'=>'M',
    'Age'=>13))->query();
เทียบเท่ากับ
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");

// การอัปเดต
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// เทียบเท่ากับ
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// เทียบเท่ากับ
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");

// การลบ
$row_count = $db->delete('Persons')->where('ID=9')->query();
// เทียบเท่ากับ
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");

// ธุรกรรม
$db->beginTrans();
....
$db->commitTrans(); // หรือ $db->rollBackTrans();