IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Swoole(一) -> 正文阅读

[PHP知识库]Swoole(一)

一、简介

网址:http://www.swoole.com

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;
  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-30 12:32:03  更:2021-07-30 12:32:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 1:39:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码