简介:

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

  1. http_server本质是swoole_server,不过在协议的解析部分固定使用的是http协议解析
  2. 完整的http协议请求会被解析并封装在swoole_http_request对象中
  3. 所有的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服务的更多相关文章

  1. Swoole 启动一个服务,开启了哪些进程和线程?

    目录 概述 代码 小结 概述 Swoole 启动一个服务,开启了哪些进程和线程? 为了解决这个问题,咱们启动一个最简单的服务,一起看看究竟启动了哪些进程和线程? 然后结合官网运行流程图,对每个进程和线 ...

  2. virtualbox虚拟机ubuntu操作系统,设置网络互通、访问,能访问虚拟机swoole的http服务

    网络互通 1.设置virtualbox网络连接模式为桥接网卡模式 2.重启虚拟机查看虚拟机IP ifconfig 3.开启window的telnet程序 控制面板->程序->启用或关闭wi ...

  3. PHP laravel+thrift+swoole打造微服务框架

    Laravel作为最受欢迎的php web框架一直广受广大互联网公司的喜爱. 笔者也参与过一些由laravel开发的项目.虽然laravel的性能广受诟病但是业界也有一些比较好的解决方案,比如堆机器, ...

  4. swoole 客户端和服务端不断通信

    server.php <?php class Chat { const HOST = '0.0.0.0';//ip地址 0.0.0.0代表接受所有ip的访问 const PART = 9501; ...

  5. swoole创建TCP服务端和客户端

    服务端: server.php <?php //创建Server对象,监听 127.0.0.1:9501端口    $serv = new swoole_server("127.0.0 ...

  6. swoole的http服务

    PHP实现基于Swoole简单的HTTP服务器 引用Swoole官方定义: PHP语言的异步.并行.高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户 ...

  7. php超全局数组 为什么swoole的http服务不能用

    php的超全局数组$_GET等九个 可以直接使用 无需定义 实际上是浏览器请求到Apache或者nginx的时候 转发到PHP处理模块 fpm转发给php解释器处理 php封装好后丢给php的  sw ...

  8. [Swoole系列入门教程 2] 入门级的Swoole的demo.服务端与客户端

  9. 【swoole】使用swoole简单实现TCP服务

    上一篇写到了如何在windows系统上面利用docker快速搭建swoole开发环境,接下来体验下swoole的使用 使用swoole实现tcp服务 <?php $serv = new Swoo ...

  10. 使用php+swoole对client数据实时更新(上)

    如果想对一个列表做实时的更新,传统的做法是采用轮询的方式.以web为例,通过Ajax定时请求服务端然后获取数据显示在页面.这种方式实现简单,缺点就是浪费资源. HTTP1.1新增加了对websocke ...

随机推荐

  1. 《Django 5 By Example》读后感

    一. 为什么选择这本书? 本人的工作方向为Python Web方向,想了解下今年该方向有哪些新书出版,遂上packt出版社网站上看了看,发现这本书出版时间比较新(2024年9月),那就它了. 从202 ...

  2. idea中terminal的配置

    idea中terminal的配置流程: File->settings->Tools->terminal 然后根据需要进行配置: 显示git操作界面 Shell path ==> ...

  3. spring boot 启动原理解析

    https://www.cnblogs.com/xiaoxi/p/7999885.html 我们开发任何一个Spring Boot项目,都会用到如下的启动类 1 @SpringBootApplicat ...

  4. 『玩转Streamlit』--上传下载文件

    在Web应用中,文件的上传下载是交互中不可缺少的功能. 因为在业务功能中,一般不会只有文字的交互,资料或图片的获取和分发是很常见的需求. 比如,文件上传可让用户向服务器提交数据,如上传图片分享生活.提 ...

  5. Qt编写嵌入式linux输入法/支持自定义词语和繁体/支持wayland和watson/纯QWidget/界面精美可换肤

    一.功能特点 纯QWidget编写,原创输入法机制,没有任何第三方动态库的依赖. 支持各种Qt版本,包括Qt4.Qt5.Qt6及后续版本. 支持各种编译器,包括mingw.msvc.gcc.clang ...

  6. Qt/C++音视频开发81-采集本地麦克风/本地摄像头带麦克风/桌面采集和麦克风/本地设备和桌面推流

    一.前言 随着直播的兴起,采集本地摄像头和麦克风进行直播推流,也是一个刚需,最简单的做法是直接用ffmpeg命令行采集并推流,这种方式简单粗暴,但是不能实时预览画面,而且不方便加上一些特殊要求.之前就 ...

  7. Qt/C++音视频开发55-加密保存到文件并解密播放

    一.前言 为了保证视频文件的安全性,有时候需要对保存的视频文件加密,然后播放的时候解密出来再播放,只有加密解密的秘钥一致时才能正常播放,用ffmpeg做视频文件的加密保存和解密播放比较简单,基于ffm ...

  8. Datawhale冬令营第二期!Task2🌼

    Datawhale冬令营第二期-Task2:学AI编程的Prompt工程,提升效果 对应链接:https://www.datawhale.cn/activity/116/23/95?rankingPa ...

  9. Spring+Vue+ElementUI的前后端分离开发项目中,前端向后端发送请求,后端返回错误:Cannot deserialize instance of `java.util.LinkedHashMap` out of START_ARRAY token

    问题描述: Spring+Vue+ElementUI的前后端分离开发项目中,前端向后端发送请求,后端返回错误:Cannot deserialize instance of `java.util.Lin ...

  10. Visual Studio Code启动时总是提示“Code安装似乎损坏。请重新安装。”、标题栏显示“不受支持”等信息的解决办法

    我的VSCode一直提示"Code安装似乎损坏.请重新安装."同时标题栏显示"不受支持"就像这样: 反思了一下,应该是我安装的background插件,把vsc ...