日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

swoole使用 常用案例

發(fā)布時(shí)間:2025/4/14 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 swoole使用 常用案例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

swoole使用

服務(wù)器及客戶端

4種服務(wù)器【tcp/udp/web/websocket】

TCP服務(wù)器

//創(chuàng)建Server對(duì)象,監(jiān)聽 127.0.0.1:9501端口 $serv = new swoole_server("127.0.0.1", 9501); //監(jiān)聽連接進(jìn)入事件 $serv->on('connect', function ($serv, $fd) {echo "Client: Connect.\n"; }); //監(jiān)聽數(shù)據(jù)接收事件 $serv->on('receive', function ($serv, $fd, $from_id, $data) {$serv->send($fd, "Server: ".$data); }); //監(jiān)聽連接關(guān)閉事件 $serv->on('close', function ($serv, $fd) {echo "Client: Close.\n"; }); //啟動(dòng)服務(wù)器 $serv->start();

UDP服務(wù)器

//創(chuàng)建Server對(duì)象,監(jiān)聽 127.0.0.1:9502端口,類型為SWOOLE_SOCK_UDP $serv = new swoole_server("127.0.0.1", 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP); //監(jiān)聽數(shù)據(jù)接收事件 $serv->on('Packet', function ($serv, $data, $clientInfo) {$serv->sendto($clientInfo['address'], $clientInfo['port'], "Server ".$data);var_dump($clientInfo); }); //啟動(dòng)服務(wù)器 $serv->start();

http服務(wù)器

$http = new swoole_http_server("0.0.0.0", 9501); $http->on('request', function ($request, $response) {var_dump($request->get, $request->post);$response->header("Content-Type", "text/html; charset=utf-8");$response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>"); }); $http->start();

websocket服務(wù)器

服務(wù)器端:?
//創(chuàng)建websocket服務(wù)器對(duì)象,監(jiān)聽0.0.0.0:9502端口?
$ws = new swoole_websocket_server(“0.0.0.0”, 9502);

//監(jiān)聽WebSocket連接打開事件 $ws->on('open', function ($ws, $request) {var_dump($request->fd, $request->get, $request->server);$ws->push($request->fd, "hello, welcome\n"); });//監(jiān)聽WebSocket消息事件 $ws->on('message', function ($ws, $frame) {echo "Message: {$frame->data}\n";$ws->push($frame->fd, "server: {$frame->data}"); });//監(jiān)聽WebSocket連接關(guān)閉事件 $ws->on('close', function ($ws, $fd) {echo "client-{$fd} is closed\n"; });$ws->start();

客戶端JS:

var wsServer = 'ws://192.168.50.151:9502'; var websocket = new WebSocket(wsServer); websocket.onopen = function (evt) {console.log("Connected to WebSocket server."); };websocket.onclose = function (evt) {console.log("Disconnected"); };websocket.onmessage = function (evt) {console.log('Retrieved data from server: ' + evt.data); };websocket.onerror = function (evt, e) {console.log('Error occured: ' + evt.data); };

輔助

定時(shí)器

//每隔2000ms觸發(fā)一次 swoole_timer_tick(2000, function ($timer_id) {echo "tick-2000ms\n"; });//3000ms后執(zhí)行此函數(shù) swoole_timer_after(3000, function () {echo "after 3000ms.\n"; });

異步tcp服務(wù)器處理任務(wù)

$serv = new swoole_server("127.0.0.1", 9501);//設(shè)置異步任務(wù)的工作進(jìn)程數(shù)量 $serv->set(array('task_worker_num' => 4));$serv->on('receive', function($serv, $fd, $from_id, $data) { //投遞異步任務(wù)$task_id = $serv->task($data);echo "Dispath AsyncTask: id=$task_id\n"; });//處理異步任務(wù) $serv->on('task', function ($serv, $task_id, $from_id, $data) {echo "New AsyncTask[id=$task_id]".PHP_EOL;//返回任務(wù)執(zhí)行的結(jié)果$serv->finish("$data -> OK"); });//處理異步任務(wù)的結(jié)果$serv->on('finish', function ($serv, $task_id, $data) {echo "AsyncTask[$task_id] Finish: $data".PHP_EOL; });$serv->start();

tcp同步客戶端

$client = new swoole_client(SWOOLE_SOCK_TCP);//連接到服務(wù)器 if (!$client->connect('127.0.0.1', 9501, 0.5)) { die("connect failed."); } //向服務(wù)器發(fā)送數(shù)據(jù) if (!$client->send("hello world")) { die("send failed."); } //從服務(wù)器接收數(shù)據(jù) $data = $client->recv(); if (!$data) { die("recv failed."); } echo $data; //關(guān)閉連接 $client->close();

tcp異步客戶端

$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);//注冊(cè)連接成功回調(diào) $client->on("connect", function($cli) { $cli->send("hello world\n"); });//注冊(cè)數(shù)據(jù)接收回調(diào) $client->on("receive", function($cli, $data){ echo "Received: ".$data."\n"; });//注冊(cè)連接失敗回調(diào) $client->on("error", function($cli){ echo "Connect failed\n"; });//注冊(cè)連接關(guān)閉回調(diào) $client->on("close", function($cli){ echo "Connection close\n"; });//發(fā)起連接 $client->connect('127.0.0.1', 9501, 0.5);

自定義通訊協(xié)議設(shè)計(jì)

進(jìn)程/協(xié)程管理

進(jìn)程

單獨(dú)進(jìn)程

$process = new swoole_process('callback_function', true); $pid = $process->start(); function callback_function(swoole_process $worker){ $worker->exec('/usr/bin/php', array(__DIR__.'/write_file.php')); }// 啟用本地的命令,加上絕對(duì)路徑 swoole_process::wait();

【子進(jìn)程】管道緩沖區(qū)讀寫及事件監(jiān)聽?

$workers = []; $worker_num = 3;//創(chuàng)建的進(jìn)程數(shù) for($i=0;$i<$worker_num; $i++){ $process = new swoole_process('process');// 創(chuàng)建子進(jìn)程 啟動(dòng)函數(shù)為 process $pid = $process->start();// 子進(jìn)程啟動(dòng) $workers[$pid] = $process;// 存入字符數(shù)組 } foreach($workers as $process){ //子進(jìn)程會(huì)包含此事件,加入到子進(jìn)程中 異步IO swoole_event_add($process->pipe, function ($pipe) use($process){ $data = $process->read(); echo "RECV: " . $data.PHP_EOL;// 接收數(shù)據(jù) });//函數(shù)調(diào)用的神奇情況 } function process(swoole_process $process){// 第一個(gè)處理 $process->write("processId:".$process->pid);// 子進(jìn)程寫入信息到管道。 echo "echo:".$process->pid."\t".$process->callback .PHP_EOL;// 打印提示信息結(jié)果 及制表符 } // 兩次等待子進(jìn)程結(jié)束 for($i=0; $i<$worker_num; $i++){// 回收子進(jìn)程 否則出現(xiàn)僵尸進(jìn)程 $ret = swoole_process::wait();// 回收結(jié)束運(yùn)行的子進(jìn)程,如果子進(jìn)程結(jié)束。類似于 join $pid = $ret['pid']; unset($workers[$pid]); echo "子進(jìn)程退出, PID=".$pid.PHP_EOL; }

隊(duì)列讀寫

// 進(jìn)程通信 $workers = [];// 進(jìn)程倉庫 $worker_num = 2;// 最大進(jìn)程數(shù) // 循環(huán)創(chuàng)建子進(jìn)程 for($i = 0; $i < $worker_num; $i++){ $process = new swoole_process('callback_function', false, false); $process->useQueue();// 開啟隊(duì)列使用,類似于全局隊(duì)列 $pid = $process->start();//開啟進(jìn)程 $workers[$pid] = $process;// 存入句柄倉庫 } // 子進(jìn)程執(zhí)行函數(shù) function callback_function(swoole_process $worker){ sleep(2);//睡覺2秒 $recv = $worker->pop();// 獲取隊(duì)列數(shù)據(jù) echo "從主進(jìn)程獲取數(shù)據(jù): $recv\n"; $worker->exit(0);// 當(dāng)前子進(jìn)程結(jié)束 } // 主進(jìn)程內(nèi),新增隊(duì)列數(shù)據(jù) foreach($workers as $pid => $process){ $process->push("Hello 子進(jìn)程[$pid]\n"); } // 兩次等待子進(jìn)程結(jié)束 for($i = 0; $i < $worker_num; $i++){ // 回收子進(jìn)程 否則出現(xiàn)僵尸進(jìn)程 $ret = swoole_process::wait();// 回收結(jié)束運(yùn)行的子進(jìn)程,如果子進(jìn)程結(jié)束。類似于 join $pid = $ret['pid']; unset($workers[$pid]); echo "子進(jìn)程退出, PID=".$pid.PHP_EOL; }

循環(huán)觸發(fā)進(jìn)程

// 循環(huán)定時(shí)執(zhí)行 // 定時(shí)器觸發(fā)函數(shù) swoole_process::signal(SIGALRM, function () { static $i = 0; echo "#{$i}\t alarm\n"; $i++; if ($i > 20) { swoole_process::alarm(-1);// 清除定時(shí)器 } });//100ms swoole_process::alarm(100 * 1000);// 定時(shí)器,類似于定時(shí)觸發(fā),類似js 里面的setinterval()

協(xié)程

2.0開始執(zhí)行,暫不深入了解

內(nèi)存讀寫

內(nèi)存鎖—互斥鎖

$lock = new swoole_lock(SWOOLE_MUTEX); echo "[主進(jìn)程]創(chuàng)建鎖\n"; $lock->lock(); if (pcntl_fork() > 0){// 這個(gè)是主進(jìn)程 sleep(1); $lock->unlock(); }else{// 這個(gè)是子進(jìn)程 echo "[子進(jìn)程]等待鎖\n"; $lock->lock(); echo "[子進(jìn)程]獲取鎖\n"; $lock->unlock(); exit("[子進(jìn)程]退出\n"); } echo "[主進(jìn)程]釋放鎖\n"; unset($lock); sleep(1); echo "[主進(jìn)程]退出\n";

異步IO

DNS輪詢

swoole_async_dns_lookup("www.baidu.com", function($host, $ip){ echo "{$host} : {$ip}\n"; });

異步讀取

swoole_async_readfile(__DIR__."/server.php", function($filename, $content) { echo "$filename: $content"; });

異步寫入

$file_content = 'jingshan'; swoole_async_writefile('test.log', $file_content, function($filename) { echo "wirte ok.\n"; }, $flags = 0);

異步事件

$fp = stream_socket_client("tcp://www.qq.com:80", $errno, $errstr, 30); fwrite($fp,"GET / HTTP/1.1\r\nHost: www.qq.com\r\n\r\n"); swoole_event_add($fp, function($fp) { $resp = fread($fp, 8192); //socket處理完成后,從epoll事件中移除socket //var_dump($resp); swoole_event_del($fp); fclose($fp); }); echo "Finish\n"; //swoole_event_add不會(huì)阻塞進(jìn)程,這行代碼會(huì)順序執(zhí)行

異步mysql

// mysql異步客戶端 $db = new swoole_mysql; $server = array( 'host' => '192.168.50.145', 'user' => 'root', 'password' => 'flzx_3QC', 'database' => 'mysql', 'chatset' => 'utf8', //指定字符集 );$db->connect($server, function ($db, $r) { if ($r === false){ var_dump($db->connect_errno, $db->connect_error); die; } $sql = 'show tables'; $db->query($sql, function(swoole_mysql $db, $r) { global $s; if ($r === false){ var_dump($db->error, $db->errno); } elseif ($r === true ){ var_dump($db->affected_rows, $db->insert_id); } var_dump($r); $db->close(); }); });

轉(zhuǎn)載于:https://www.cnblogs.com/gaohj/p/6797007.html

總結(jié)

以上是生活随笔為你收集整理的swoole使用 常用案例的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。