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 ...
随机推荐
- k8s单节点改为高可用和更新证书
master单节点添加master节点 apiServer添加域名更新证书 更新kubenertes证书有效期 环境 kubernetes v1.22.12 使用kubeadm安装的集群 #添加节点 ...
- 关于 VMware 与 WSL 在 Win11 虚拟化的一些问题
关于 VMware 与 WSL 在 Win11 虚拟化的一些问题 VMware 虚拟化问题 之前用虚拟机做计网 GNS3 组网实验的时候需要用到虚拟机虚拟化,然后一直显示虚拟化不成功,检查过 BIOS ...
- 【Linux】Deepin安装Anaconda后手动配置环境变量
配置环境变量 如果安装完毕后,重新打开终端,输入conda表示没找到这个命令 说明没有配置环境变量 那么我们首先第一件事,就是找到我们的conda安装到哪里了 例如我的是安装到主目录的(默认在这的,安 ...
- startup
要提取startup/后面的字符,可以使用cut命令或awk命令.以下是两种方法: 使用cut命令: bash #!/bin/bash # 给定的字符串 STR1="startup/valu ...
- zstd - 一种由Facebook使用的快速数据压缩算法
Zstandard (也被称为zstd )是一款免费的开源,快速实时数据压缩程序,具有更好的压缩比,由Facebook开发. 它是用C语言编写的无损压缩算法 (在Java中有一个重新实现) - 因此它 ...
- 从零开始构建一个基于大模型和 RAG 的知识库问答系统
SimpleAbdQA 本项目所使用的大模型为:qwen1.8b 演示中所使用Embedding为:Word2vec 一.介绍 通过从本项目中,你可以得到: 了解基于大模型的本地知识库的运作原理 了解 ...
- JMeter 采样器超详细教程
宝子们,今天咱就来好好唠唠 JMeter 里那些厉害的采样器,让你轻松拿捏性能测试和接口测试! 一.采样器大集合 先给宝子们来个采样器的 "全家福",让你们心里有个底: HTTP ...
- milvus基础
nlist和nprobe nlist 是调用 create_index 时设置的参数,nprobe 则是调用 search 时设置的参数. IVFLAT 和 SQ8 索引都是通过聚类算法把大量的向量划 ...
- 新一代python版本与依赖管理工具 uv
uv python版本与依赖管理 选择原因 1. 新的好玩.rust开发的执行速度快 2. 确实方便 3. 轻,软件就十几二十兆,占磁盘小 4. uv.lock可以锁版本 场景应用 场景一 从 ana ...
- 高并发编程-ReentrantReadWriteLock深入解析
要点解说ReentrantLock在并发情况下只允许单个线程执行受保护的代码,而在大部分应用中都是读多写少,所以,如果使用ReentrantLock实现这种对共享数据的并发访问控制,将严重影响整体的性 ...