这次的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)

   

swoole rpc swoole rpc 服务器_服务器

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

     

swoole rpc swoole rpc 服务器_swoole rpc_02


9 PID(在运行 php -f 运行文件名.php

      

swoole rpc swoole rpc 服务器_服务器_03

 四、创建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();
    }
}

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

  

swoole rpc swoole rpc 服务器_TCP_04

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

 

swoole rpc swoole rpc 服务器_php_05

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

  

swoole rpc swoole rpc 服务器_TCP_06

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

  

swoole rpc swoole rpc 服务器_php_07

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

  

swoole rpc swoole rpc 服务器_TCP_08

  

swoole rpc swoole rpc 服务器_TCP_09

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

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

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

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


                              -----生生的笔记