WorkerMan學習篇:連線mysql時到底發生了什麼鬼
阿新 • • 發佈:2019-02-07
問題:我們使用php或java來連線資料庫的時候,是不是也是通過類似的原理來連線的呢?
連線mysql有很多種協議,如果是遠端連線是通過tcp,如果是本機一般是socket。
1.回顧
<?php
//本機IP是10.211.55.13
//需要監聽的埠是 9090
use Workerman\Worker;
require 'workerman/Autoloader.php';
// 建立一個Worker監聽9090埠,不使用任何應用層協議
$tcp_worker = new Worker("tcp://10.211.55.13:9090");
// 啟動4個程序對外提供服務
$tcp_worker->count = 4 ;
//當連線建立時觸發的回撥函式
$tcp_worker->onConnect = function($connection)
{
echo "new connection from ip " . $connection->getRemoteIp() . "\n";
};
// 當客戶端發來資料時
$tcp_worker->onMessage = function($connection, $data)
{
// 向客戶端傳送hello $data
$connection->send('hello ' . $data);
$connection ->close();
};
// 執行worker
Worker::runAll();
這是『直接使用TCP傳輸資料』的形式,注意今天我們的程式碼中多了一個onConnect
,這是當連線建立時觸發的回撥函式。每個連線只會觸發一次onConnect
回撥。
我們開啟服務,然後用瀏覽器來訪問10.211.55.13:9090
,看看是否會觸發onConnect
這個回撥函式。
我們在瀏覽器中建立了2個連線,發現服務端輸出了2次new connection from ip 10.211.55.2
。
2.和mysql有啥關係?
我們用msyql客戶端來嘗試連線,發現我們的socket服務端,也會輸出new connection from ip 10.211.55.2
onConnect
這個回撥函式。
3.既然我們的mysql客戶端能夠成功連線我們的socket伺服器,那麼我們怎麼才能連線上mysql呢?
用socket服務端來做中轉服務(也就是mysql代理服務)。
server.php:
<?php
//本機IP是10.211.55.13
//需要監聽的埠是 9090
use Workerman\Connection\AsyncTcpConnection;
use Workerman\Worker;
require 'workerman/Autoloader.php';
// 建立一個Worker監聽9090埠,不使用任何應用層協議
$tcp_worker = new Worker("tcp://10.211.55.13:9090");
// 啟動4個程序對外提供服務
$tcp_worker->count = 4;
//當連線建立時觸發的回撥函式
$tcp_worker->onConnect = function($connection)
{
echo "new connection from ip " . $connection->getRemoteIp() . "\n";
// 非同步建立一個到實際mysql伺服器的連線
$connection_to_mysql = new AsyncTcpConnection('tcp://127.0.1:3306');
// 執行非同步連線
$connection_to_mysql->connect();
// mysql連線發來資料時,轉發給對應客戶端的連線
$connection_to_mysql->onMessage = function($connection_to_mysql, $buffer)use($connection)
{
$connection->send($buffer); //傳送mysql資料
};
// 客戶端發來資料時,轉發給對應的mysql連線
$connection->onMessage = function($connection, $buffer)use($connection_to_mysql)
{
$connection_to_mysql->send($buffer);
};
};
// 當客戶端發來資料時
$tcp_worker->onMessage = function($connection, $data)
{
// 向客戶端傳送hello $data
$connection->send('hello ' . $data);
$connection->close();
};
// 執行worker
Worker::runAll();
輸入mysql帳號密碼,成功連線。
到這裡,我們已經初步領略了WorkerMan的牛逼了吧。