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 ...
随机推荐
- 依赖注入在 dotnet core 中实现与使用:5. 使用支持 Unicode 的 HtmlEncoder
现象 在 ASP.NET Core MVC 中,当在页面中传递了一个包含中文字符串到页面的时候,页面的显示是正常的,但是如果查看页面源码,却看不到中文,变成了一串编码之后的内容. 例如,在页面中直接定 ...
- archlinux 显卡驱动
https://arch.icekylin.online/guide/rookie/graphic-driver.html archlinux 显卡驱动# 接天莲叶无穷碧,映日荷花别样红# 近年来,a ...
- jacoco代码覆盖率报告分析
一.目的 对Jacoco代码覆盖率统计维度.报告字段说明.报告详细分析描述.并为精准测试.健壮性测试提供指导. 二.Jacoco代码覆盖率统计维度 Jacoco是从代码指令(Instructions, ...
- Qt编写的项目作品4-输入法V2019
一.功能特点 未采用Qt系统层输入法框架,独创输入切换机制. 纯QWidget编写,支持任何目标平台(亲测windows.linux.嵌入式linux等),支持任意Qt版本(亲测Qt4.6.0到Qt5 ...
- PostgreSQL 数据库的启动与停止管理
title: PostgreSQL 数据库的启动与停止管理 date: 2024/12/28 updated: 2024/12/28 author: cmdragon excerpt: 作为一个强大的 ...
- python连接pgsql&mysql
1.python连接pgsql import psycopg2 def connect_pgsql(list_sql): conn = psycopg2.connect(host='db_host', ...
- Solution Set - “愿所有罗盘都指向那片海洋”
目录 0.「NOI Simu.」哈希计数 1.「NOI Simu.」运输计划 2.「NOI Simu.」时代的眼泪 3.「Subset」LP 的被动练习 4.「EC Final 2018」「LOJ # ...
- 史上最全Redis面试49题(含答案):哨兵+复制+事务+集群+持久化等
Redis主要有哪些功能? 1.哨兵(Sentinel)和复制(Replication) Redis服务器毫无征兆的罢工是个麻烦事,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要哨兵和复制. ...
- biancheng-Spring Boot框架
目录http://c.biancheng.net/spring_boot/ 1Spring Boot是什么2创建Spring Boot项目3Spring Boot starter4YAML5Sprin ...
- 如何分析jmeter性能测试数据
1.jmeter插件 https://blog.csdn.net/weixin_39430584/article/details/80947093 http://www.doc88.com/p-214 ...