這篇文章主要介紹了關於swoole創建伺服器之一,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
先照著文件建立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)裡的多個車間(進程)
車間裡面有廁所(共享內存),工人都可以共用,但是你得等工人用完才可以進去
所以我們要多個車間(多進程),多個員工(線程),來提高效率
注意:每次修改伺服器腳本檔案後都要關閉進程再
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);
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測試沒有問題^-^
以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!
#######以上是如何使用swoole來建立伺服器(上)的詳細內容。更多資訊請關注PHP中文網其他相關文章!