PHP实现基于Swoole简单的HTTP服务器

引用Swoole官方定义:

PHP语言的异步、并行、高性能网络通信框架,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网、车联网、智能家居等领域。使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。

在这里简述swoole两种API编写简单HTTP服务器。

swoole_server

使用swoole_server API,构建HTTP服务器,4个步骤:

  1. 构建Server对象
  2. 设置运行时参数
  3. 注册事件回调函数
  4. 启动服务器

直接代码体现,新建server.php

<?php

//1.构建Server对象
$serv = new swoole_server("0.0.0.0", 9501); //2.设置运行时参数
$serv->set(array(
'worker_num' => 8,
'daemonize' => 0,
'max_request' => 10000,
'dispatch_mode' => 2,
'debug_mode'=> 1,
)); //3.注册事件回调函数
$serv->on('Receive', function($serv, $fd, $from_id, $data){
$respData='<h1>Hello Swoole.</h1>';
response($serv,$fd,$respData);//封装并发送HTTP响应报文
}); //4.启动服务器
$serv->start();

如何封装HTTP响应报文?首先你得知道HTTP响应报文的组成结构,如下图

知道了响应报文的组成结构,那我的响应报文应该是这样的:

HTTP/1.1 200
Server:SwooleServer
Content-Type:text/html;charset=utf8
Content-Length:13 <h1>Hello Swoole.</h1>

代码实现。


/**
* 发送内容
* @param \swoole_server $serv
* @param int $fd
* @param string $respData
* @return void
*/
function response($serv,$fd,$respData){
//响应行
$response = array(
'HTTP/1.1 200',
);
//响应头
$headers = array(
'Server'=>'SwooleServer',
'Content-Type'=>'text/html;charset=utf8',
'Content-Length'=>strlen($respData),
);
foreach($headers as $key=>$val){
$response[] = $key.':'.$val;
}
//空行
$response[] = '';
//响应体
$response[] = $respData;
$send_data = join("\r\n",$response);
$serv->send($fd, $send_data);
}

到此,一个简单响应Hello Swoole.的HTTP服务器就完成了。完整代码:
(访问不了gist?配置本地hosts文件: 192.30.252.141 gist.github.com )

运行 php server.php,浏览器访问http://127.0.0.1:9501/,当然我们常常使用Nginx作为前端代理,设一个测试域名www.server.com,本地设置hosts映射,就能通过域名来访问了。Nginx配置
注意:当响应报文格式不正确时,浏览器页面会一直转菊花,等待请求返回...

再后来,有了swoole_http_server,HTTP服务器代码就变得更加简单了!

swoole_http_server

<?php

$http = new swoole_http_server("127.0.0.1", 9501);
$http->on('request', function ($request, $response) {
$html = "<h1>Hello Swoole.</h1>";
$response->end($html);
});

没错,就这几行代码就实现了。不再需要封装响应报文。swoole_http_server 继承于 swoole_server,是swoole内置Http服务器的支持,通过几行代码即可写出一个异步非阻塞多进程的Http服务器。

Notice:swoole_http_server对Http协议的支持并不完整,建议仅作为应用服务器。并且在前端增加Nginx作为代理

swoole的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. php超全局数组 为什么swoole的http服务不能用

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

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

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

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

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

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

随机推荐

  1. JAVA学习第十四课(接口:implements及其基本应用)

    接口: 我们知道抽象类中能够定义抽象方法,也能够定义非抽象方法.当一个抽象类中的方法都是抽象方法的时候,我们就能够定义还有一种表现方式:接口(interface),所以接口是一种特殊的抽象类 接口的出 ...

  2. Realm多线程中的那些坑...

    个人在开发中遇到的一些小坑... 可能会持续更新... 1.RealmObject自带线程保护功能.仅仅能在创建它的线程中訪问.在子线程中不能訪问. 也就是说.假设你在主线程中new了一个RealmO ...

  3. IP地址 网段的划分

    IP和子网掩码我们都知道,IP是由四段数字组成,在此,我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.255.255.255  B类IP段 128.0.0.0 到191.255. ...

  4. Hibernate学习六----------CRUD

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  5. HTML5 手机网页制作笔记

    http://top.css88.com/archives/546 http://www.w3cfuns.com/blog-5470280-5406828.html 最近在卓手机网页,第一次入手.把要 ...

  6. 现在有一张半径为r的圆桌,其中心位于(x,y),现在他想把圆桌的中心移到(x1,y1)。每次移动一步,都必须在圆桌边缘固定一个点然后将圆桌绕这个点旋转。问最少需要移动几步。

    // ConsoleApplication5.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include<vector> ...

  7. 【Python + Selenium】初次用IE浏览器之报错:selenium.common.exceptions.WebDriverException: Message: Unexpected error launching Internet Explorer. Protected Mode settings are not the same for all zones.

    初次用IE浏览器运行自动化程序时,报错:selenium.common.exceptions.WebDriverException: Message: Unexpected error launchi ...

  8. Unix环境高级编程—进程控制(三)

    一.解释器文件 解释器文件属于文本文件,起始行形式为: #! pathname[optional-argument] 我们创建一个只有一行的文件如下: #!/home/webber/test/echo ...

  9. EasyDSS流媒体视频实时回传与录像管理解决方案

    一.背景 1.1 方案背景 随着互联网基础设施建设的不断完善和发展,带宽的不断提速,尤其是光纤入户,4G/5G/NB-IoT各种技术的大规模商用,视频在各行各业越来越受到重视,无论是传统的视频媒体转向 ...

  10. MANIFEST.MF 文件内容完全详解(转)

    打开Java的JAR文件我们经常可以看到文件中包含着一个META-INF目录, 这个目录下会有一些文件,其中必有一个MANIFEST.MF,这个文件描述了该Jar文件的很多信息,下面将详细介绍MANI ...