如何使用swoole來建立伺服器(上)

來源:互聯網
上載者:User
這篇文章主要介紹了關於swoole建立伺服器之一,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下

1.建立tcp伺服器

先照著文檔建立一個tcp伺服器

<?php//建立伺服器 參數分別是 //監聽的地址 127.0.0.1 表示監聽本機,0.0.0.0表示監聽所有地址//9501 連接埠號碼 這個你隨便定都行只要沒被佔用過(netstat -an | grep 查看連接埠使用方式) 如果被佔用就使用 命令 kill殺死進程//SWOOLE_PROCESS 為多進程模式,一般這裡不傳值,預設為多進程 SWOOLE_BASE為基本模式 //SWOOLE_SOCK_TCP 也就是說建立tcp伺服器 $serv=new swoole_server('127.0.0.1','9501',SWOOLE_PROCESS,SWOOLE_SOCK_TCP);//伺服器設定參數$serv->set(['worker_num'=>4,  //worker進程數 一般為cpu數的 1-4倍'max_request'=>10000, //worker進程在處理完n次請求後結束運行重建一個]);//這裡//當然還有很多設定的參數 文檔傳送門:https://wiki.swoole.com/wiki/page/13.html//監聽串連進入事件(這裡是一個閉包寫法)串連後調用的函數//$fd用戶端串連的唯一標示//$reactor_id 線程id 是一個自增數字,範圍是1 ~ 1600萬,fd超過1600萬後會自動從1開始進行複用$serv->on('connect', function ($serv, $fd, $reactor_id) {    echo "Client: {$reactor_id} - {$fd}-Connect.\n";});//監聽資料接收事件//$data就是接收的資料$serv->on('receive', function ($serv, $fd, $reactor_id, $data)) {    $serv->send($fd, "Server: ".$data);    echo '收到了資料'.$data;});//監聽串連關閉事件$serv->on('close', function ($serv, $fd) {    echo "Client: Close".$fd."\n";});//啟動伺服器$serv->start();

ok我們測試一下 php tcp.php 開啟tcp伺服器(如果連接埠被佔用,則殺死佔用連接埠的進程,關掉使用ctrl+c,掛起使用ctrl+z)

再開啟telnet(我們要再開啟一個終端)測試一下是不是成功了,隨便輸入eqqeq

再看看tcp伺服器

看到這裡我們整理一下思路:
建立了tcp伺服器->telnet串連伺服器->tcp執行connect->telnent發送資訊->tcp監聽到receive事件->telnent斷開->tcp 監聽到close事件

疑問
1.server與telnet的關係
伺服器與客服端的關係,一個server對應多個telnet

2.$serv->send($fd, "Server: ".$data); 和 直接輸出 echo 有什麼區別呀?

send是發送資料 給 對方(串連我伺服器的) ,比如你用和你的朋友聊天,你發了一個server: ".$data,那麼就相當於你把訊息發給了你朋友, 而echo的話是輸出內容,只給自己。

3.線程與進程是什麼鬼?
相當於一個工廠(CPU)裡的多個車間(進程)
一個車間(進程)有很多個工人(線程)
車間裡面有廁所(共用記憶體),工人都可以共用,但是你得等工人用完才可以進去

我們平時使用php是單進程,那麼大的工廠就用了一個車間效率當然慢,
所以我們要多個車間(多進程),多個員工(線程),來提高效率

注意:
每次修改伺服器指令碼檔案後都要
關閉進程再重新開啟才會生效

2.建立udp伺服器

1.TCP核ucp都是傳輸層協議,但是UDP伺服器與TCP伺服器不同,UDP沒有串連的概念,udp消耗資源比較小,但是速度快。啟動Server後,用戶端無需Connect,直接可以向Server監聽的9502連接埠發送資料包。

2.udp的建立方式跟tcp很像

//就是把最後一個參數改為 SWOOLE_SOCK_UDP $serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);

3.UDP伺服器可以使用不用telnet而是用 netcat -u 來串連測試
nc安裝:
yum -y install yum -y install nc.x86_64 使用就是直接 nc -u 127.0.0.1 9502

4.完整的實現

//建立Server對象,監聽 127.0.0.1:9502連接埠,類型為SWOOLE_SOCK_UDP$serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); //udp沒有 $serv->on connect的概念//監聽資料接收事件$serv->on('Packet', function ($serv, $data, $clientInfo) {    $serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);    var_dump($clientInfo);});//啟動伺服器$serv->start();

5.測試,同樣我們也開啟2個終端
udp伺服器 這裡我們列印了$clientInfo

nc測試伺服器

ok測試沒有問題^-^

以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.