一、简介
Swoole:是一个使用 C++ 语言编写的基于异步事件驱动和协程的并行网络通信引擎,为 PHP 提供协程、高性能网络编程支持。提供了多种通信协议的网络服务器和客户端模块,可以方便快速的实现 TCP/UDP服务、高性能Web、WebSocket服务、物联网、实时通讯、游戏、微服务等,使 PHP 不再局限于传统的 Web 领域,Swoole是PHP一个扩展的形式
Swoole可以使 PHP开发人员编写高性能的异步并发 TCP、UDP、Unix Socket、HTTP,WebSocket 服务
Swoole 可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域
使用 PHP + Swoole 可以使企业 IT 研发团队的效率大大提升,更加专注于开发创新产品
swoole应用场景
用户案例
https://wiki.swoole.com/wiki/page/p-case.html
二、下载安装
swoole是一个PHP的扩展,所以安装的方式和安装其它的PHP扩展的方式一样。swoole不支持windows安装,没有windows扩展,仅支持linux系统或Mac系统、Docker也是可以的
2.1 下载地址
Github:https://github.com/swoole/swoole-src/tags
php官方扩展库:http://pecl.php.net/package/swoole
开源中国:http://git.oschina.net/swoole/swoole/tags
下载
在linux服务器中新建目录存放下载的源码
mkdir /src
cd /src
wget https://pecl.php.net/get/swoole-4.4.4.tgz
2.2 安装依赖环境
仅支持Linux,FreeBSD,MacOS,3类操作系统
Linux内核版本2.3.32如centos必须6.6以上 uname -r
查看Linux内核版本
查看CentOS版本
PHP7.0以上版本 php -v
gcc4.4以上版本 gcc --version
如果版本较低使用下面的命令进行安装即可
centos g++
yum install -y gcc-c++
ubuntu apt install -y g++
cmake2.4以上版本 cmake --version
如果你的云服务器上没有cmake,安装即可
yum install -y cmake
2.3 安装swoole
# 下载
wget https://pecl.php.net/get/swoole-4.3.3.tgz
# 解压
tar zxf swoole-4.3.3.tgz
# 编译安装扩展
# 进入目录
cd swoole-4.3.3
# 执行phpize命令,产生出configure可执行文件
/usr/bin/phpize
# 进行配置
./configure --with-php-config=/usr/bin/php-config
# 编译和安装
make && make install
vi /etc/php.ini
复制如下代码
extension=swoole.so
放到你所打开或新建的文件中即可,无需重启任何服务
# 查看扩展是否安装成功
php -m|grep swoole
解压
切入安装目录查看
检查一下php开发包是否安装(安装php的扩展一定要先安装这个软件包)
使用yum search php | grep dev 查找
如果没找到使用命令安装即可
yum install -y php71w-devel.x86_64
初始化
配置安装和环境检查
which php-config
./configure --with-php-config=/usr/bin/php-config
指定后如果产生下述错误
重新安装一下dev
yum install -y php72w-devel.x86_64
再次执行./configure --with-php-config=/usr/bin/php-config
安装即为正常
编译安装
make && make install
linux中php扩展文件的后缀名为: xxxx.so
看到此文件存在表示安装扩展成功
用命令查看扩展是否安装成功
修改配置文件
注:因为服务器用的yum安装的PHP
检查扩展是否生效
如果感觉上述安装较为复杂,可以使用宝塔面板实现一键安装
三、快速起步
3.1 进程管理
swoole是一个多进程,多线程的服务 master主进程负责创建多个线程来接受和返回用户请求,同时生成一个manager进程,manager进程负责生成和管理N多个worker和task进程,worker和task进程是负责干活的
3.2 环境准备
使用ftp或sftp上传源代码,使用phpstorm提供ftp来直接保存即上传代码
配置phpstorm支持ftp上传
设置保存就上传
让phpstorm更好的支持swoole开发
下载:https://github.com/wudi/swoole-ide-helper
放到项目根目录下面就可以了
3.3 创建TCP服务器
查看端口命令:netstat -tunpl
<?php
//创建Server对象,监听 127.0.0.1:9501 端口
$server = new Swoole\Server('127.0.0.1', 9501);
//监听连接进入事件
$server->on('Connect', function ($server, $fd) {
echo "Client: Connect.\n";
});
//监听数据接收事件
$server->on('Receive', function ($server, $fd, $from_id, $data) {
// 返回给客户端的内容
// $server->send($fd, "Server: " . $data);
echo "接收到的数据为:\n".$data;
});
//监听连接关闭事件
$server->on('Close', function ($server, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$server->start();
查看tcp服务端口
netstat -tunpl
设置启动的Worker进程数
//设置启动的 Worker 进程数
$server->set([
'worker_num' => 2
]);
可以通过命令查看到worker数的变化
ps auxf | grep php
测试使用telnet来进行测试
# 默认系统是没有安装telnet
yum install -y telnet
安装完成后执行
telnet 127.0.0.1 9501
回车进入,按下ctrl+]再次回车,就可以发内容,退出,按ctrl+] 输入 quit 退出
3.4 tcp客户端
创建一个php脚本client.php
<?php
// 创建tcp客户端
$client = new Swoole\Client(SWOOLE_SOCK_TCP);
// 连接 设置超时时间
if (!$client->connect('127.0.0.1', 9501, 10)) {
exit("connect failed. Error: {$client->errCode}\n");
}
// 发送数据
$client->send("hello\n");
// 接收服务器返回的数据
$buffer = $client->recv();
// 关闭客户端
$client->close();
// 输出服务器返回内容
echo $buffer;
修改服务器端文件代码:
<?php
//创建Server对象,监听 127.0.0.1:9501 端口
$server = new Swoole\Server('127.0.0.1', 9501);
//设置启动的 Worker 进程数
$server->set([
'worker_num' => 2
]);
//监听连接进入事件
$server->on('Connect', function ($server, $fd) {
echo "Client: Connect.\n";
});
//监听数据接收事件
$server->on('Receive', function ($server, $fd, $from_id, $data) {
// 返回给客户端的内容
$server->send($fd, "服务器对你说: " . $data);
});
//监听连接关闭事件
$server->on('Close', function ($server, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$server->start();
执行客户端文件:
php client.php
原生PHP实现tcp客户端
<?php
// socket当做成一个网络中的文件
$socket = stream_socket_client("tcp://81.68.207.29:9501",$errno,$errstr);
// 发送数据 写文件的过程
fwrite($socket,"我是一个php");
// 接收
$buffer = fread($socket,9000);
// 关闭
fclose($socket);
// 输出接收内容
echo $buffer;
Linux下重新执行服务
windows下执行PHP文件
3.5 rpc
参考:https://www.swoft.org/documents/v2/core-components/rpc-server/
rpc服务端
客户端调用
效果
继承到TP框架中
定义服务,引入tp入口文件
<?php
//创建Server对象,监听 127.0.0.1:9501 端口
$server = new Swoole\Server('0.0.0.0', 9504);
//设置
$server->set([
// 守护进程
'daemonize' => false,
// 启动的 Worker 进程数
'worker_num' => 1
]);
//监听连接进入事件
$server->on('Connect', function ($server, $fd) {
echo "Client: Connect.\n";
});
//监听数据接收事件
$server->on('Receive', function ($server, $fd, $from_id, $data) {
// 引入tp
static $import = true;
//接收传递的路径
$_REQUEST['argv_rpc'] = $data;
if ($import) {
define('APP_PATH', '/wwwdata/rpc/Order/application'); //框架目录
define('RPC_RUN', true);
$path = '/wwwdata/rpc/Order/thinkphp/base.php'; //base文件所在路径
include $path;
}
$import = false;
$app = new \think\App();
$res = $app->run();
// 返回结果
$server->send($fd,$res);
});
//监听连接关闭事件
$server->on('Close', function ($server, $fd) {
echo "Client: Close.\n";
});
//启动服务器
$server->start();
客户端调用
<?php
// socket当做成一个网络中的文件
$socket = stream_socket_client("tcp://81.68.207.29:9504",$errno,$errstr);
// 发送数据 写文件的过程 传送访问地址,如果没有默认显示index方法
fwrite($socket,$_SERVER['PATH_INFO']?:"/index/Index/index");
// 接收
$body = fread($socket,9000);
// 关闭
fclose($socket);
// 输出内容
echo $body;