简介:

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. RabbitMQ, Windows Server 上服务总线的替代品

    RabbitMQ, Windows Server 上服务总线的替代品 https://www.robfox.io/2017/04/17/rabbitmq-alternative-service-bus ...

  2. 中电金信:GienTech动态| 获奖、合作、与伙伴共谋数字化转型…

    ​ ​ -- -- GienTech动态 -- -- 中电金信携"源启"亮相第十二届中国电子信息博览会 ​ 4月11日,为期三天的"第十二届中国电子信息博览会" ...

  3. 【微软】微软程序注册(zfile自建API)

    Zfile支持设置自己的回调地址,怎么设置呢? 参考:https://docs.zfile.vip/advanced/onedrive-api/ 上面文档写的很清楚了,我提醒两点 1.进入 https ...

  4. Powercat 无文件落地执行技巧,你确定不进来看看?

    声明:本文主要用作技术分享,所有内容仅供参考.任何使用或依赖于本文信息所造成的法律后果均与本人无关.请读者自行判断风险,并遵循相关法律法规. 目录 完整示例 注意事项 演示 无文件落地执行(filel ...

  5. Qt编写安防视频监控系统63-子模块7悬浮地图

    一.前言 悬浮地图子模块,使用的百度地图,支持在线和离线,用于显示对应设备的位置,支持鼠标直接拖动和缩放.本系统将各个地方需要的地图模块+浏览器模块都合并到一个地图内核模块,这样需要使用的时候只需要n ...

  6. uniapp同城社区交友 仿小红书 APP小程序源码 含后台管理和网页端

    注意(预防被骗) 本程序仅在 破晓店铺(https://shop.abyssdawn.com/).破晓一代网络科技淘宝店 出售其余地方均为骗子. 关于本程序 本程序适用于各种同城社区交友类产品,例如同 ...

  7. UML之关联

    关联指两个类之间的各种联系.UML使用各种单实线表示关联,这个单实线可以是直线(垂直的.水平的或者倾斜的).折线甚至曲线. 事实上,关联也是展示类的属性的另一外的一种形式.例如在下图中,我们通过一条实 ...

  8. 重温CSS

    入门 圆角 border-radius 阴影 box-shadow 元素边界 text-shadow 文字阴影 渐变 background-image属性新增的参数 linear-gradient 纵 ...

  9. 隐藏zsh前面用户名或者主机名

    1. zshrc 修改 vim ~/.zshrc文件,在文件底部增加: prompt_context() {} 只保留用户名,隐藏主机名 prompt_context() { if [[ " ...

  10. make学习

    make学习,参考「Makefile 20分钟入门,简简单单,展示如何使用Makefile管理和编译C++代码」 程序见:https://github.com/ShiqiYu/CPP/tree/mai ...