1. 程式人生 > >WorkerMan學習篇:連線mysql時到底發生了什麼鬼

WorkerMan學習篇:連線mysql時到底發生了什麼鬼

問題:我們使用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的牛逼了吧。