Workerman/MySQL
Lưu ý
Thư viện này không còn được bảo trì, khuyến nghị sử dụng illuminate/database hoặc topthink/think-orm
Giới thiệu
Các chương trình lưu trú trong bộ nhớ thường gặp lỗi mysql gone away khi sử dụng MySQL, lỗi này xảy ra do chương trình không có giao tiếp với MySQL trong thời gian dài, kết nối bị máy chủ MySQL đá đi. Lớp cơ sở dữ liệu này có thể giải quyết vấn đề này, khi xảy ra lỗi mysql gone away, nó sẽ tự động thử lại một lần.
Các mở rộng phụ thuộc
Lớp mysql này phụ thuộc vào hai mở rộng là pdo và pdo_mysql, nếu thiếu mở rộng sẽ báo lỗi Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in .....
Chạy lệnh dòng lệnh php -m sẽ liệt kê tất cả các mở rộng PHP CLI đã cài đặt, nếu không có pdo hoặc pdo_mysql, hãy tự cài đặt.
Hệ thống 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
Nếu không tìm thấy tên gói, hãy thử tìm bằng yum search php mysql.
Hệ thống ubuntu/debian
PHP5.x
apt-get install php5-mysql
PHP7.x
apt-get install php7.0-mysql
Nếu không tìm thấy tên gói, hãy thử tìm bằng apt-cache search php mysql.
Không thể cài đặt bằng các phương pháp trên?
Nếu các phương pháp trên không thể cài đặt, xin vui lòng tham khảo hướng dẫn Workerman - Phụ lục - Cài đặt mở rộng - Phương pháp 3 biên dịch mã nguồn.
Cài đặt Workerman/MySQL
Phương pháp 1:
Có thể cài đặt qua composer, chạy lệnh sau trên dòng lệnh (nguồn composer ở nước ngoài, quá trình cài đặt có thể rất chậm).
composer require workerman/mysql
Lệnh trên thành công sẽ tạo thư mục vendor, sau đó trong dự án hãy đưa vào tệp autoload.php dưới thư mục vendor.
require_once __DIR__ . '/vendor/autoload.php';
Phương pháp 2:
Tải mã nguồn, thư mục giải nén đặt vào dự án của bạn (vị trí tùy ý), yêu cầu trực tiếp tệp nguồn.
require_once '/your/path/of/mysql-master/src/Connection.php';
Lưu ý
Khuyến nghị mạnh mẽ rằng bạn nên khởi tạo kết nối cơ sở dữ liệu trong callback onWorkerStart, tránh khởi tạo kết nối trước khi chạy Worker::runAll();, kết nối được khởi tạo trước khi chạy Worker::runAll(); thuộc về tiến trình chính, tiến trình con sẽ kế thừa kết nối này, việc chia sẻ cùng một kết nối cơ sở dữ liệu giữa tiến trình chính và tiến trình con sẽ gây ra lỗi.
Ví dụ
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)
{
// Lưu trữ instance db trong biến toàn cục (cũng có thể lưu trong thành viên tĩnh của một lớp nào đó)
global $db;
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
};
$worker->onMessage = function(TcpConnection $connection, $data)
{
// Lấy instance db qua biến toàn cục
global $db;
// Thực hiện SQL
$all_tables = $db->query('show tables');
$connection->send(json_encode($all_tables));
};
// Chạy worker
Worker::runAll();
Cách sử dụng MySQL/Connection cụ thể
// Khởi tạo kết nối db
$db = new \Workerman\MySQL\Connection('host', 'port', 'user', 'password', 'db_name');
// Lấy tất cả dữ liệu
$db->select('ID,Sex')->from('Persons')->where('sex= :sex AND ID = :id')->bindValues(array('sex'=>'M', 'id' => 1))->query();
// Tương đương với
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' AND ID = 1")->query();
// Tương đương với
$db->query("SELECT ID,Sex FROM `Persons` WHERE sex='M' AND ID = 1");
// Lấy một hàng dữ liệu
$db->select('ID,Sex')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->row();
// Tương đương với
$db->select('ID,Sex')->from('Persons')->where("sex= 'M' ")->row();
// Tương đương với
$db->row("SELECT ID,Sex FROM `Persons` WHERE sex='M'");
// Lấy một cột dữ liệu
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->column();
// Tương đương với
$db->select('ID')->from('Persons')->where("sex= 'F' ")->column();
// Tương đương với
$db->column("SELECT `ID` FROM `Persons` WHERE sex='M'");
// Lấy giá trị đơn lẻ
$db->select('ID')->from('Persons')->where('sex= :sex')->bindValues(array('sex'=>'M'))->single();
// Tương đương với
$db->select('ID')->from('Persons')->where("sex= 'F' ")->single();
// Tương đương với
$db->single("SELECT ID FROM `Persons` WHERE sex='M'");
// Truy vấn phức tạp
$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));
// Tương đương với
$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');
// Chèn
$insert_id = $db->insert('Persons')->cols(array(
'Firstname'=>'abc',
'Lastname'=>'efg',
'Sex'=>'M',
'Age'=>13))->query();
Tương đương với
$insert_id = $db->query("INSERT INTO `Persons` ( `Firstname`,`Lastname`,`Sex`,`Age`)
VALUES ( 'abc', 'efg', 'M', 13)");
// Cập nhật
$row_count = $db->update('Persons')->cols(array('sex'))->where('ID=1')
->bindValue('sex', 'F')->query();
// Tương đương với
$row_count = $db->update('Persons')->cols(array('sex'=>'F'))->where('ID=1')->query();
// Tương đương với
$row_count = $db->query("UPDATE `Persons` SET `sex` = 'F' WHERE ID=1");
// Xóa
$row_count = $db->delete('Persons')->where('ID=9')->query();
// Tương đương với
$row_count = $db->query("DELETE FROM `Persons` WHERE ID=9");
// Giao dịch
$db->beginTrans();
....
$db->commitTrans(); // hoặc $db->rollBackTrans();