前面源碼安裝完成,現在進入學習時間,順便做一些筆記
//創建server端代碼
https://wiki.swoole.com/wiki/page/14.html
<?php //創建對象 $server = new Swoole_server('0.0.0.0',9501); $server->set(array( 'worker_num' => 2, //設置啟動的Worker
進程數量。Swoole
采用固定Worker
進程的模式。 'max_request' => 100 //此參數表示worker進程在處理完n次請求后結束運行。manager會重新創建一個worker進程。此選項用來防止worker進程內存溢出。 )); //監聽連接進入事件 /** * $fd 表示客戶端鏈接server的唯一標識,自增的形式 * $reactor_id 線程標識 */ $server->on('Connect', function ($server, $fd, $reactor_id){ echo "Connect:{$fd} - {$reactor_id} success\n"; }); //監聽鏈接接收事件 $server->on('receive', function ($server, $fd, $from_id, $data){ //send給客戶端發送數據 $fd 客戶端唯一標識 //$from_id 線程ID $server->send($fd, "Server:{$fd} - {$from_id} - {$data}\n"); echo 'get '.$fd .':'.$data."\n"; }); //關閉監聽事件 $server->on('Close', function ($server, $fd){ echo "Close {$fd}\n\n"; }); $server->start();
驗證是否可用方法有多種
第一種:命令形式
root@VM-0-16-ubuntu:/data/www# telnet 127.0.0.1 9501 Trying 127.0.0.1... Connected to 127.0.0.1. Escape character is '^]'. 123 Server:4 - 0 - 123
服務端輸出打印對應的輸出
Connect:4 - 0 success
get 4:123
第二種方法,使用swoole client 服務
https://wiki.swoole.com/wiki/page/29.html
//創建對象 $client = new Swoole_client(SWOOLE_SOCK_TCP);
//判斷是否連接成功,返回bool值 if (!$client->connect('127.0.0.1', 9501)){ echo "Connect error\n"; exit; }; //PHP cli常量 fwrite(STDOUT,'請輸入:'); $msg = trim(fgets(STDIN)); //發送消息給服務器 ,判斷是否發送成功 返回 bool值 if (!$client->send($msg)){ echo "send error\n"; }; //接收服務器發送的數據 $res = $client->recv(); echo $res . "\n";
肯能還有別的方法來驗證,才疏學淺只能用這兩種方式
最后,查看server的set設置是否生效可以使用ps命令查看,如修改需要重啟服務端server
root@VM-0-16-ubuntu:/data/www# ps -aft | grep tcp_server.php 13059 pts/3 S+ 0:00 \_ grep --color=auto tcp_server.php 12828 pts/2 Sl+ 0:00 \_ /usr/local/php/bin/php tcp_server.php 12829 pts/2 S+ 0:00 \_ /usr/local/php/bin/php tcp_server.php 12831 pts/2 S+ 0:00 \_ /usr/local/php/bin/php tcp_server.php 12832 pts/2 S+ 0:00 \_ /usr/local/php/bin/php tcp_server.php
------------------------------
SEOOLE UDP
http://wiki.swoole.com/wiki/page/477.html
swoole的udp和tcp區別還是很大的。
UDP服務器與TCP服務器不同,UDP沒有連接的概念。啟動Server后,客戶端無需Connect,直接可以向Server監聽的9502端口發送數據包。對應的事件為onPacke。
<?php //采用UDP方式SWOOLE_SOCK_UDP //UDP服務器與TCP服務器不同,UDP沒有連接的概念。啟動Server后,客戶端無需Connect,直接可以向Server監聽的9502端口發送數據包。對應的事件為onPacke $server = new Swoole_server('0.0.0.0', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); $server->set(array( 'worker_num' => 2, 'max_request' => 100, )); /** * $data Client發送的數據 * $clientInfo Client信息 * UDP fd的概念。 */ $server->on('Packet', function ($server, $data, $clientInfo){ //這里注意tcp這里使用的是send,而UDP使用的是sendto //向任意的客戶端IP:PORT發送UDP數據包。 $server->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data); var_dump($clientInfo); }); $server->start();
server啟動之后,會啟動一個進程,默認不是4個,就一個主進程,來處理數據。
//'task_worker_num' => 4, //業務請求量很大,一個worker 肯定是不夠的,我們利用多個task worker的方式來改寫下server。
root@VM-0-16-ubuntu:/data/www# ps -aft | grep udp_server.php 19316 pts/3 S+ 0:00 \_ grep --color=auto udp_server.php 19304 pts/2 Sl+ 0:00 \_ /usr/local/php/bin/php udp_server.php 19305 pts/2 S+ 0:00 \_ /usr/local/php/bin/php udp_server.php 19312 pts/2 S+ 0:00 \_ /usr/local/php/bin/php udp_server.php
Clinet端代碼
<?php $client = new Swoole_client(SWOOLE_SOCK_UDP); $client->connect('127.0.0.1', 9502); //PHP cli常量 fwrite(STDOUT,'請輸入:'); $msg = trim(fgets(STDIN)); //發送消息給服務器 if (!$client->send($msg)){ echo "send error\n"; }; //接收服務器發送的數據 $res = $client->recv(); echo $res . "\n";