workerman 學習

chaofu發表於2021-04-25

介紹

Workerman是一款純PHP開發的開源高效能的PHP socket 服務框架。

Workerman不是重複造輪子,它不是一個MVC框架,而是一個更底層更通用的socket服務框架,你可以用它開發tcp代理、梯子代理、做遊戲伺服器、郵件伺服器、ftp伺服器、甚至開發一個php版本的redis、php版本的資料庫、php版本的nginx、php版本的php-fpm等等。Workerman可以說是PHP領域的一次創新,讓開發者徹底擺脫了PHP只能做WEB的束縛。

實際上Workerman類似一個PHP版本的nginx,核心也是多程式+Epoll+非阻塞IO。Workerman每個程式能維持上萬併發連線。由於本身常住記憶體,不依賴Apache、nginx、php-fpm這些容器,擁有超高的效能。同時支援TCP、UDP、UNIXSOCKET,支援長連線,支援Websocket、HTTP、WSS、HTTPS等通訊協議以及各種自定義協議。擁有定時器、非同步socket客戶端、非同步Mysql、非同步Redis、非同步Http、非同步訊息佇列等眾多高效能元件

在tp5.0 框架中使用

# 檢查環境是否ok
curl -Ss http://www.workerman.net/check.php | php
# 依賴 worker
composer require topthink/think-worker=1.0.*
# workerman 
composer require workerman/workerman=3.3.0

建立server.php 檔案

<?php
#在 public 服務下面
define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin/Worker'); // 模組/控制器
// 載入框架引導檔案
require __DIR__ . '/../thinkphp/start.php';

建立 Worker 檔案

### 在application/admin/controller 目錄建立 Worker 檔案
<?php


namespace app\admin\controller;

use think\worker\Server;
use \Workerman\Connection\AsyncTcpConnection;

class Worker extends Server
{
    protected $socket =  "";//本地域名

    protected $modle = null;
    public function __construct(){
        $this->processes = 16;
        $this->socket = 'websocket://127.0.0.1:1234';
        parent::__construct(); // 啟動 websocker 服務
    }

    /**
     * 收到資訊
     * @param $connection
     * @param $data
     */
    public function onMessage($ws_connection, $data)
    {
        // 與遠端task服務建立非同步連線,ip為遠端task服務的ip,如果是本機就是127.0.0.1,如果是叢集就是lvs的ip
        $task_connection = new AsyncTcpConnection('Text://127.0.0.1:1235');
        // 傳送資料 到非同步服務處理
        $task_connection->send($data);
        // 非同步獲得結果
        $task_connection->onMessage = function($task_connection, $task_result)use($ws_connection)
        {
            // 結果 $task_result
            // 獲得結果後記得關閉非同步連線
            $task_connection->close();
            // 通知對應的websocket客戶端任務完成
            $ws_connection->send($task_result);
        };
        // 執行非同步連線
        $task_connection->connect();

    }

    /**
     * 當連線建立時觸發的回撥函式
     * @param $connection
     */
    public function onConnect($connection)
    {

    }

    /**
     * 當連線斷開時觸發的回撥函式
     * @param $connection
     */
    public function onClose($connection)
    {
        echo "close";
    }

    /**
     * 當客戶端的連線上發生錯誤時觸發
     * @param $connection
     * @param $code
     * @param $msg
     */
    public function onError($connection, $code, $msg)
    {
        echo "error $code $msg\n";
    }

    /**
     * 每個程式啟動
     * @param $worker
     */
    public function onWorkerStart($worker)
    {

    }
}

非同步處理 建立 Asyncworker.php 檔案


<?php

namespace app\admin\controller;

use think\worker\Server;
use \Workerman\Connection\AsyncTcpConnection;

class Asyncworker extends Server
{
  protected $socket = "";//本地域名

  protected $modle = null;
  protected $monitorviewController = null;
  public function __construct(){
  $this->processes = 16;
  $this->socket = 'Text://127.0.0.1235';//本地域名
  parent::__construct();
 }

 /**
 * 收到資訊
  * @param $connection
 * @param $data
 */  public function onMessage($connection, $route)
 {  
     // 處理非同步業務邏輯
     // 返回結果到 Worker 程式
    $connection->send("task ok");
 }
  /**
 * 當連線建立時觸發的回撥函式
  * @param $connection
 */  public function onConnect($connection)
 {
 }
  /**
 * 當連線斷開時觸發的回撥函式
  * @param $connection
 */  public function onClose($connection)
 {//        echo "close";
  unset($connection);

 }
  /**
 * 當客戶端的連線上發生錯誤時觸發
  * @param $connection
 * @param $code
 * @param $msg
 */  public function onError($connection, $code, $msg)
 {  echo "error $code $msg\n";
 }
  /**
 * 每個程式啟動
  * @param $worker
 */  public function onWorkerStart($worker)
 {
 }}

非同步服務檔案 serverAsync.php


define('APP_PATH', __DIR__ . '/../application/');
define('BIND_MODULE','admin/Asyncworker');
// 載入框架引導檔案
require __DIR__ . '/../thinkphp/start.php';

啟動服務

 // 進入public 目錄

php serverAsync.php start -d
php server.php start -d

// 檢視 狀態
php server.php status
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章