php搭建swooleTCP服务器

这次的swoole学习,比较缓慢

也由于这些几天事比较多,晚上没去学习,swoole的笔记也一直在没编写,下面简单介绍和应用下swoole

swoole是什么?

  • 异步、并行、高性能
  • 纯C编写
  • php扩展

swoole能做什么?

  • 异步多线程服务器及客户端
  • 异步MySQL、Reids、数据库连接池、任务队列
  • http/websocket服务器/客户端
  • 异步文件读写
  • Swoole2.0支持协程

Swolle 实践

swoole手册:https://wiki.swoole.com/wiki/page/1.html

服务器版本:centos7/ubuntu16

php版本:5.4+

一、swoole安装(百度上有很多安装文章,也可以用宝塔直接安装)

二、简单TCP服务器创建

<?php
/**@创建TCP服务器 * 作者:生生 */ $host = '127.0.0.1'; //监听对应外网的IP 0.0.0.0监听所有ip $port = 9501;   //端口号(1024以下端口需要root权限) $mode = SWOOLE_PROCESS; //SWOOLE_PROCESS 进程模式-多进程方式 $socke_type = SWOOLE_SOCK_TCP; //SWOOLE_SOCK_TCP 服务器类型-默认TCP $serv = new swoole_server($host,$port); //后面2参数不写是默认 /**@ * 函数:bool $swoole_server->on(string $event,miexd $callback); * $event * connect:当建立链接的时候 (2个默认参数:$serv-服务器信息,$fd-客户信息 /-名字随意) * receive:当接收数据的时候 (4个默认参数:$serv-同上,$fd-同上,$from_id-客户id,$data-传递数据) * close:关闭链接 */ //@作用:监听链接进入事件 $serv->on('connect',function($serv,$fd){ echo '链接成功'; }); //@作用:监听数据接收事件 $serv->on('receive',function($serv,$fd,$from_id,$data){
    var_dump($fd.'--'.$data);
/**@ * 函数:bool Server->send(mixed $fd, string $data, int $serverSocket = -1); * 作用:向客户端发送数据 * 参数: * $fd,客户端的文件描述符 * $data,发送的数据,TCP协议最大不得超过2M,可修改 buffer_output_size 改变允许发送的最大包长度 * $serverSocket,向Unix Socket DGRAM对端发送数据时需要此项参数,TCP客户端不需要填写 */ $serv->send($fd,"数据:".$data); }); //@作用:监听链接关闭事件 $serv->on('close',function($ser,$fd){ echo '关闭链接'; }); //启动服务 $serv->start();

三、运行上面php文件

  1、浏览器直接访问会提示:Fatal error: Swoole\Server::__construct(): swoole_server only can be used in PHP CLI mode. in /www/jzj/public/aa.php on line 7

     这个文件需要用php CLI模式(php命令行模式运行: php -f 运行文件名.php)

   

       2、如果命令行运行的时候出现这个错误说明,端口被占用,

     

    查看被占用的端口PID:sudo lsof -i:9501

    kill掉进程:sudo kill -9 PID(在运行 php -f 运行文件名.php

      

 四、创建TCP同步客户端(TP5举例)

<?php
namespace app\admin\controller;
use think\Controller;
use think\Db;
use Redis;
use swoole_client;
class Index extends controller
{
//客户端swoole public function swoole() { $client = new swoole_client(SWOOLE_SOCK_TCP); //连接到服务器 if (!$client->connect('127.0.0.1', 9501, 0.5)) { die("connect failed."); } //向服务器发送数据 if (!$client->send("hello world")) { echo '发送失败'; } //从服务器接收数据 $data = $client->recv(); if (!$data) { die("recv failed."); } echo $data; //关闭连接 $client->close(); } }

  注意客户端服务器在框架中要引入

  

  把这个文件上传到服务器项目中,浏览器访问这个后如果报错如下:是因为服务端没有send发送数据出来问题

 

   服务端会出现send为空,要注意很可能是$serv->on中的第一个参数不对,

  

   如图:这个参数一定要是对应的new的对象

  

  在重新运行文件:命令行会出现这个,

  

  

  这样就完成了简单的tcp服务器与同步tcp客户端的搭建,当tcp服务器文件运行完成后删除也不影响(建议保留)

  简单流程是:编写TCP服务器文件->运行服务器文件->TCP服务器创建成功->创建TCP客户端文件->运行与服务端(向服务端发送数据并接受服务端返回信息)

  当然这篇只是简单的搭建与了解swoole,后续还会更新简单的swoole的php异步操作与实时聊天功能

  本人也是新手,swoole是很强大的扩展,里面包含很多知识我也在学习中

  想要探讨swoole或者其他问题可以关注博客园:传说中的生生或+Q:876036823一起交流

                              -----生生的笔记

  

 

posted @ 2018-12-22 13:42  传说中的生生  阅读(6132)  评论(0编辑  收藏  举报