swoole(8)http服务
简介:
swoole内置实现了一个简单的httpServer类.swoole的http server相当于php-fpm.最大优势在于高性能,代码只载入一次

- http_server本质是swoole_server,不过在协议的解析部分固定使用的是http协议解析
- 完整的http协议请求会被解析并封装在swoole_http_request对象中
- 所有的http响应都通过swoole_http_response对象进行封装和发送
代码:
<?php
/**
* Created by PhpStorm.
* User: huahua
* Date: 2020/3/10
* Time: 下午2:09
*/ $server = new \Swoole\Http\Server('0.0.0.0',9800); $server->set([
'pack_max_length'=>1024*1024*2,
'upload_tmp_dir'=>__DIR__."/upload",
'document_root' =>__DIR__,
'enable_static_handler' => true,
]);
//onRequest回调接收两个参数分别是swoole_http_request对象和swoole_http_response对象,分别负责request请求和response响应
$server->on('request',function($request,$response){
//swoole_http_request,负责http请求的相关信息。我们可以在这个对象上,获取header\server\get\post\files\cookie等信息,这等同于php的超全局变量
$uri = $request->server['request_uri'];
if ($uri == '/favicon.ico') {
$request->status(404);
$request->end();
} echo __DIR__."/upload";
//swoole_http_response负责处理HTTP响应信息
$response->header("Content-type","text/html");
$response->header("Charset","utf-8");
$response->cookie('user','peter');
//请在end()之前设置相应的响应头、状态等等,end操作后将向客户端浏览器发送内容,并销毁request/response对象
$response->end("hello");
});
$server->start();
实现热重启:
<?php
/**
* Created by PhpStorm.
* User: huahua
* Date: 2020/3/17
* Time: 下午4:50
*/ namespace Six; use Swoole\Http\Server; class App {
protected $server; public static $rootPath;
public static $framePath;
public static $applicationPath; protected $watch_path; protected $md5File; public function run() {
self::$rootPath = dirname(dirname(__DIR__));
self::$framePath = self::$rootPath . '/framework';
self::$applicationPath = self::$rootPath . '/application'; $this->watch_path = [self::$framePath, self::$applicationPath];
$this->md5File = $this->getMd5(); $this->server = new Server('0.0.0.0', 9800);
$this->server->set([
'pack_max_length' => 1024 * 1024 * 2,
'worker_num' => 3,
]); $this->server->on('request', [$this, 'request']);
$this->server->on('Start', [$this, 'start']);
$this->server->on('workerStart', [$this, 'workerStart']);
$this->server->start();
} public function request($request, $response) {
$uri = $request->server['request_uri'];
if ($uri == '/favicon.ico') {
$response->status(404);
$response->end();
} else {
$this->reload();
$response->end('test');
}
} /**
*加载热重启(比对文件的散列值)
*/
public function reload() {
swoole_timer_tick(3000,function(){
$md5 = $this->getMd5();
if ($md5 != $this->md5File){
$this->server->reload();
$this->md5File = $md5;
}
});
} public function start() {
$this->reload();
} public function workerStart($server, $worker_id) { } public function getMd5() {
$md5 = ''; foreach ($this->watch_path as $dir) {
$md5 .= self::md5File($dir);
}
return $md5;
} public static function md5File($dir) { //遍历文件夹当中的所有文件,得到所有的文件的md5散列值
if (!is_dir($dir)) {
return '';
}
$md5File = array();
$d = dir($dir);
while (false !== ($entry = $d->read())) { if ($entry !== '.' && $entry !== '..') {
if (is_dir($dir . '/' . $entry)) {
//递归调用
$md5File[] = self::md5File($dir . '/' . $entry);
} elseif (substr($entry, -4) === '.php') {
$md5File[] = md5_file($dir . '/' . $entry);
}
$md5File[] = $entry;
}
}
$d->close();
return md5(implode('', $md5File));
}
}
test.php
<?php
/**
* Created by PhpStorm.
* User: huahua
* Date: 2020/3/17
* Time: 下午4:48
*/ require_once dirname(__DIR__).'/vendor/autoload.php'; $app = new \Six\App();
$app->run();
结果:

多端口监听:
<?php
/**
* Created by PhpStorm.
* User: huahua
* Date: 2020/3/18
* Time: 下午5:42
*/ $server=new Swoole\Server('0.0.0.0',9800); $server->set([
]); $server->listen('127.0.0.1', 9502, SWOOLE_SOCK_TCP); //必须在start之前
$server->on('receive',function ($serv, $fd, $from_id, $data){
$info=$serv->connection_info($fd,$from_id); //获取连接信息
if($info['server_port']=='9502'){
echo "admin";
}
});
$server->start();
<?php
$http_server = new swoole_http_server('0.0.0.0',9998);
$http_server->set(array('daemonize'=> false));
$http_server->on('request',function(){
var_dump('request');
});
//......设置各个回调......
//多监听一个tcp端口,对外开启tcp服务,并设置tcp服务器的回调
$tcp_server = $http_server->addListener('0.0.0.0', 9999, SWOOLE_SOCK_TCP);
//默认新监听的端口 9999 会继承主服务器的设置,也是 Http 协议
//需要调用 set 方法覆盖主服务器的设置
$tcp_server->set(array());
$tcp_server->on("receive", function ($serv, $fd, $threadId, $data) {
echo $data;
}); $http_server->start();
swoole(8)http服务的更多相关文章
- Swoole 启动一个服务,开启了哪些进程和线程?
目录 概述 代码 小结 概述 Swoole 启动一个服务,开启了哪些进程和线程? 为了解决这个问题,咱们启动一个最简单的服务,一起看看究竟启动了哪些进程和线程? 然后结合官网运行流程图,对每个进程和线 ...
- virtualbox虚拟机ubuntu操作系统,设置网络互通、访问,能访问虚拟机swoole的http服务
网络互通 1.设置virtualbox网络连接模式为桥接网卡模式 2.重启虚拟机查看虚拟机IP ifconfig 3.开启window的telnet程序 控制面板->程序->启用或关闭wi ...
- PHP laravel+thrift+swoole打造微服务框架
Laravel作为最受欢迎的php web框架一直广受广大互联网公司的喜爱. 笔者也参与过一些由laravel开发的项目.虽然laravel的性能广受诟病但是业界也有一些比较好的解决方案,比如堆机器, ...
- swoole 客户端和服务端不断通信
server.php <?php class Chat { const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问 const PART = 9501; ...
- swoole创建TCP服务端和客户端
服务端: server.php <?php //创建Server对象,监听 127.0.0.1:9501端口 $serv = new swoole_server("127.0.0 ...
- swoole的http服务
PHP实现基于Swoole简单的HTTP服务器 引用Swoole官方定义: PHP语言的异步.并行.高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户 ...
- php超全局数组 为什么swoole的http服务不能用
php的超全局数组$_GET等九个 可以直接使用 无需定义 实际上是浏览器请求到Apache或者nginx的时候 转发到PHP处理模块 fpm转发给php解释器处理 php封装好后丢给php的 sw ...
- [Swoole系列入门教程 2] 入门级的Swoole的demo.服务端与客户端
- 【swoole】使用swoole简单实现TCP服务
上一篇写到了如何在windows系统上面利用docker快速搭建swoole开发环境,接下来体验下swoole的使用 使用swoole实现tcp服务 <?php $serv = new Swoo ...
- 使用php+swoole对client数据实时更新(上)
如果想对一个列表做实时的更新,传统的做法是采用轮询的方式.以web为例,通过Ajax定时请求服务端然后获取数据显示在页面.这种方式实现简单,缺点就是浪费资源. HTTP1.1新增加了对websocke ...
随机推荐
- OpenType 字体文件组织结构
OpenType 字体文件结构 OpenType 字体的组织 https://docs.microsoft.com/en-us/typography/opentype/spec/otff#organi ...
- Spring Boot logback springProperty 设置默认值
springProperty 当没有读取到source字段中设置的log.path值时,设置为defaultValue字段中的${user.dir}/logs变量值. <springProper ...
- 关于Java的UUID
UUID或者UNID或者UID,是一个统一唯一标识,可以用来标记文档.数据或其它需要唯一标识的东西.Java 5.0内置UUID的实现,见java.util.UUID. 下面代码是找到的2种实现方式, ...
- Qt/C++地图标注点的添加删除移动旋转/指定不同图标和动图/拿到单击信号
一.前言说明 标注点在地图开发中是最常见的应用场景之一,比如在地图上需要显示设备的位置,基本上都是添加标注点,指定图片和尺寸已经经纬度坐标位置.这个功能在每种地图内核中都提供的,这个并没有任何难点,在 ...
- Qt/C++音视频开发68-检查是否含有B帧/转码推流/拉流显示/监控拉流推流/海康大华宇视监控
一.前言 为什么需要判断视频文件是否含有B帧,这个在推流的时候很容易遇到这个问题,一般来说,没有B帧的视频文件,解码后的数据帧pts和dts都是顺序递增的,而有B帧的则未必,可能有些需要先解码后面显示 ...
- _findnext()调试中断,发生访问错误,错误定位到ntdll.dll
问题: 采用_findfirst和_findnext获取指定的文件夹下的文件时,_findnext()函数在调试时发生中断,发生访问错误,错误定位到ntdll.dll.错误提示如下所示: _findn ...
- 高通MSM8909 Mutil-HAL Sensor 调试
Mutil-HAL的介绍: Sensors Multi-HAL 是一个框架,允许传感器 HAL 与其他传感器 HAL 一起运行. Sensors Multi-HAL 动态加载作为动态库存储在供应商分区 ...
- Linux安全加固(一)
1.Linux关键用户文件/etc/password文件 Root:x:0:0:root:/bin/bash ●用户名:代表用户账号的字符串.通常长度不超过8个字符,并且由大小写字母和/或数字组成.登 ...
- (.net core)Kong网关的使用
一.优势: 提供统一的 API 管理,简化流量控制.负载均衡.安全性控制等工作. 有可视化界面可操作,支持高度 可扩展性,可以通过插件来扩展功能. 在 微服务架构 中表现优异,支持多种协议和高并发场景 ...
- Solution Set - “我献上明月一盏,照满河山”
目录 0.「集训队互测 2018」「洛谷 P9248」完美的集合 1.「UR #6」「UOJ #74」破解密码 2.「NOI Simu.」苯为 3.「NOI Simu.」西克 4.「NOI Simu. ...