首頁  >  文章  >  後端開發  >  如何使用swoole來建立伺服器(上)

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

不言
不言原創
2018-07-11 11:39:512154瀏覽

這篇文章主要介紹了關於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(&#39;127.0.0.1&#39;,&#39;9501&#39;,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)
如何使用swoole來建立伺服器(上)

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

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

#再看看tcp伺服器

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

我們看到這裡我們整理一下想法:
建立了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如何使用swoole來建立伺服器(上)

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


ok測試沒有問題^-^

以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!

#相關推薦:
Swooled的學習之Swoole的介紹

#######

以上是如何使用swoole來建立伺服器(上)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn