swoole 安装 用的是centOS php安装目录:/usr/local/php php.ini配置文件路径:/usr/local/php/etc/php.ini 1、安装swoole cd /usr/local/src wget https://github.com/swoole/swoole-src/archive/v1.9.1-stable.tar.gz #版本不一样 https://github.com/swoole/swoole-src/releases tar zxvf v1.9.1-stable.tar.gz cd swoole-src-1.9.1-stable /usr/local/php/bin/phpize
#查找对应的php-config find / -name php-config ./configure --with-php-config=/usr/local/php/bin/php-config make make install 2、配置php支持swoole vi /usr/local/php/etc/php.ini 添加 extension=swoole.so 3、重启php-fpm service php-fpm restart 在phpinfo页面可以看到关于swoole的选项,说明安装成功。 搭建tcp 服务器 <?php //创建服务器 $host = '0.0.0.0'; $port = 9501; $serv = new swoole_server($host,$port) ; /* $host:127.0.0.1 本地ip 可以监听多个ip 使用0.0.0.0 $port:端口号 1024端口以下需要root权限 $mode : SWOOLE_PROCESS 多进程的方式 $socke_type:SWOOLE_SPCL_TCP / //使用 // bool $swoole_server->on(string $event,mixed $callback) /* $event: connect: 当建立连接的时候 $serv 服务器信息 $fd:客户端信息 receive: 当接受到的数据$serv 服务器信息,$fd 客户端,$from_id ID,$data 数据 close:关闭连接 */ $serv->on('connect',function($serv,$fd){ echo "连接成功" }); $serv->on('receive',function($serv,$fd,$from_id,$data){ echo "接收到的数据"; var_dump($data); //打印接收到的数据 }); $serv->on('close',function($serv,$fd){ echo"连接关闭"; }) $serv->start();//启动服务 ?> 上传到 服务器后 php index.php 启动 ps -ajft 查看进程来查看启动成功没 使用网络调试助手来进行调试查看tcp服务是否好用 UDP服务器创建 udp.php <?php $serv = new swoole_server("0.0.0.0",9502,SWOOLE_PROCESS,SWOOLE_SOCK_UDP) //监听数据接收事件 /* $serv:服务器信息 $data:数据,接收到的数据 $fd:客户端信息 */ $serv->on('packet',function($serv,$data,$fd){ //发送数据到相应的客户端,反馈信息 $serv->sendto($fd['address'],$fd['port'],"Server: $data"); var_dump($fd); } ); $serv->start() ?> web 服务器 <?php //创建web服务器 $serv = new swoole_http_server("0.0.0.0",9501); // 获取请求 /* $request:请求信息 $response:返回信息 */ $serv->on('request',function($request,$response){ var_dump($request); $response->header("Content-Type","text/html;charset=utf-8");//设置返回头信息 $response->end("hello word".rand(100,999)); }); $serv->start(); ?> 实现websocket <?php //创建webscork 服务器 $ws =new swoole_websocket_server //on //open 建立连接 $ws 服务器, $request:客户端信息 $ws ->on('open',function($ws,$request){ var_dump($request); $ws->push($request->fd,"welcome "); }) //message 接收信息 $ws ->on('message',function($ws,$request){ echo "Message: $request->data"; $ws->push($request->fd,"get it message"); }); //close 关闭连接 $ws->on('close',function($ws,$request){ echo "close "; }) $ws->start(); ?> webscork.html <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> <script> //指的服务器webscort服务器 var wsServer="ws://192.168.0.1:9501;" var webSocket = new WebSocket(wsServer); webSocket.onopen = function(evt){ console.log("连接成功"); } webSocket.onclose = function(evt){ console.log("关闭") } webSocket.onmessage = function(evt){ console.log(data); } webSocket.onerror = function(evt,e){ console.log("error") } </script> </body> </html> <?php //循环执行定时器 swoole_time_tick(2000,function($timer_id){ echo "执行 $timer_id "; }); //单次执行 swoole_time_after(3000,function(){ echo "3 秒后执行" }) ?> <?php //task() 函数 投递异步任务 //on('事件',function(){}) 处理函数 执行异步函数 //finish()函数, 任务处理完成后结果 //异步TCP服务器 //创建TCP服务器 $serv = new swoole_server("0.0.0.0",9501); //设置异步 进程工作数 $serv ->set(array('task_worker_num' =>4 )); // 投递异步任务 $serv->on("receive",function($serv,$fd,$from_id,$data){ $task_id = $serv->tack($data);//获取异步ID echo "异步ID: $task_id "; }); //处理异步任务 $serv -> on('task',functino($serv,$task_id,$from_id,$data){ echo "执行 异步ID:$task_id"; $serv-finish("$data->ok"); }); //处理结果 $serv ->on('finish',function($serv,$task_id,$data){ echo "执行完成"; }) $serv->start(); ?> <?php //进程创建 /* new swoole_process() 参数1: mixed $function 子进程创建成功后执行的函数 参数2: $redirect_stdin_stdout 重定向子进程的标准输入和输出。启用此选项后,在进程内echo将不是打印屏幕。而是写入到管道 读取键盘输入将变成从管道中读取。默认为阻塞读取 $create_pipe 是否创建管道。启用 $redirect_stdin_stdout后,此选项将忽略用户参数,强制为true,如果子进程内没有进程间通信,可以设置为false */ //创建进程 //进程对应的执行函数 function doProcess(swoole_process $worker){ echo "PID",$worker->pid," "; sleep(10); } //创建进程 //创建多个进程 $process = new swoole_process("doProcess"); $pid = $process->start(); $process = new swoole_process("doProcess"); $pid = $process->start(); //等待结束 swoole_process::wait(); ?> <?php //进程事件 //swoole_event_add() /*参数1:int_$sock int 文件描述 mixed $read callback 就是 stream_socket_client/fsockopen创建资源 sockets 就是sockets扩展中socket_create创建的资源,需要在编译时候加入 ./configure --enable-sockets */ $workers = [];//进程数组 $worker_num =3;//创建进程的数量 //创建启动进程 for ($i = 0;$i<$worker_num;$i++){ $process =new swoole_process('doProcess');//创建单独的新进程 $pid = $process->start();//启动进程,获取进程ID $workers[$pid] = $process;// 存入进程数组 } //创建进程执行函数 function doProcess(swoole_process $process){ $process->write("PID:$process->pid");//子进程写入信息 echo "写入信息: $process->pid $process->callback"; } //添加进程事件 向每一个子进程添加需要执行的动作 foreach($workers as $process){ //添加 swoole_event_add($process->pipe,function($pipe) use($process){ $data = $process->read();//能否读取数据 echo "接受到:$data "; }); } ?> <?php //进程队列通信 $workers = [];//进程仓库 $worker_num = 2;//最大进程数 //批量创建进程 for($i = 0;$i<$worker_num;$i++){ $process = new swoole_process('doProcess',false,false)//创建子进程完成 $process->useQuneue();//开启队列,类似于全局函数 $pid = $process->start(); $workers[$pid] = $process } //进程执行函数 function doProcess(swoole_process $process){ $recv = $process->pop();//8192 echo "从主进程获取到的数据:$recv "; sleep(5); $process->exit(0); } //主进程 向子进程添加数据 foreach($workers as $pid =>$process){ $process->push("Hello 子进程 $pid ") } //等待子进程结束回收资源 for($i=0;$i<$worker_num;$i++){ $ret = swoole_process::wait();//等待执行完成 $pid = $ret['pid']; unset($workers[$pid]); echo "子进程退出 $pid "; } ?> <?php //触发函数 异步执行 达到10次停止 swoole_process::signal(SIGALRM,function(){ static $i = 0; echo "$i "; $i++; if($i>10){ swoole_process::alarm(-1); //清除定时器 } }); //定时器 swoole_process::alarm(100 *1000); ?> <?php //创建锁对象 $lock = new swoole_lock(SWOOLE_MUTEX);//互斥锁 echo "创建互斥锁 "; $lock->lock();//开始锁定 主进程 if(pcntl_fork()>0){ sleep(1); $lock->unlock();//解锁 }else{ echo "子进程 等待锁 "; $lock->lock();//上锁 echo "子进程 获取所"; $lock->unlock();//释放锁 exit("子进程退出"); } echo "主进程 释放锁"; unset($lock); sleep(1); echo "子进程退出"; ?> <?php //dns查询 swoole_async_dns_lookup('www.baidu.com',function($host,$ip){ echo "$host,$ip"; }) ?> swoole 实现及时通信 服务器端 <?php //服务器代码 //创建websocker 服务器 $ws =new swoole_websocket_server("0.0.0.0",9502); //on 函数 open message close //open情况 $ws->on('open',function($ws,$request){ echo "新用户 $request->fd 加入。 "; $GLOBALS['fd'][$request->fd]['id'] =$request->fd;//设置用户ID $GLOBALS['fd'][$request->fd]['name'] ='匿名用户';//设置用户名 }); //message 收发消息 $ws->on('message',function($ws,$request){ $msg =$GLOBALS['fd'][$request->fd]['name'].":".$request->data." "; if(strstr($request->data,"#name#")){ //用户设置昵称 $GLOBALS['fd'][$request->fd]['name']=str_replace("#name#",'',$request->data); }else{ //进行用户信息发送 //发送到每一个客户端 foreach ($GLOBALS['fd'] as $i){ $ws->push($i['id'],$msg); } } }); //close $ws->on('close',function($ws,$request){ echo "客户端-{$request} 断开连接 "; unset($GLOBALS['fd'][$request]);//清除连接仓库 }); $ws->start() ?> 作者:a十二_4765 链接:https://www.jianshu.com/p/00babd74567e 来源:简书 简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。