Swoole学习笔记三:HttpServer

1.SW的HttpServer
HttpServer的本质仍然是swoole_server,其协议加些部分固定使用Http协议解析,支持同步和异步2种模式

Swoole学习笔记(三):HttpServer

完整的HTTP协议请求会被封装在swoole_http_request对象内,所有HTTP响应都会通过swoole_http_response对象进行封装和发送
无论是同步模式还是异步模式,HttpServer都可以维持大量TCP客户端连接。同步/异步仅仅体现在对请求的处理方式上。
示例:

use Swoole\Http\Server;
$http = new Server("127.0.0.1", 9501);
$http->on('request', function ($request, $response) {
    $response->end("<h1>Hello Swoole. #".rand(1000, 9999)."</h1>");
});
$http->start();

2.回调函数onRequest事件
函数原型:function(swoole_http_request $request, swoole_http_response $response)
示例:

$http_server->on('request', function(swoole_http_request $request, swoole_http_response $response) {
     $response->end("<h1>hello swoole</h1>");
})

在收到一个完整的Http请求后,会回调此函数。回调函数共有2个参数:
$request,Http请求信息对象,包含了header/get/post/cookie等相关信息
$response,Http响应对象,支持cookie/header/status等Http操作
在onRequest回调函数返回时底层会销毁$request和$response对象,如果未执行$response->end()操作,底层会自动执行一次$response->end("")
需要注意的是,将$request/$response传递给其他函数时,不要采用引用的方式。在正常情况下,在一个请求流程结束后,这两个对象的引用次数会被置为0,对象能正常被销毁。如果有额外的引用的话,那么对象便不能被销毁,会造成OOM。当需要传递引用时,一定要在请求的最后unset掉这两个变量。

3.Request
Http请求对象,保存了Http客户端请求的相关信息,包括GET、POST、COOKIE、Header等;
1)Http\Request->$header
请求的头部信息。类型为数组,所有key均为小写。

echo $request->header['host'];
echo $request->header['accept-language'];

2)Http\Request->$server
Http请求相关的服务器信息,相当于PHP的$_SERVER数组。包含了Http请求的方法,URL路径,客户端IP等信息。
数组的key全部为小写,并且与PHP的$_SERVER数组保持一致
echo $request-&gt;server['request_time'];
3)Http\Request->$get
请求的GET参数,相当于PHP中的$_GET,格式为数组。
echo $request-&gt;get['hello'];
注意:为防止HASH***,GET参数最大不允许超过128个
4)Http\Request->$post
POST参数,格式为数组。
echo $request-&gt;post['hello'];
注意:POST与Header加起来的尺寸不得超过package_max_length的设置,否则会认为是恶意请求;同样的,POST参数的个数最大不超过128个
5)Http\Request->$cookie
HTTP请求携带的COOKIE信息,格式为键值对数组。
echo $request-&gt;cookie['username'];
6)Http\Request->$files
文件上传信息。类型为以form名称为key的二维数组。与PHP的$_FILES相同。最大文件尺寸不得超过package_max_length设置的值。
示例:
[
[name] => facepalm.jpg, //浏览器上传时传入的文件名称
[type] => image/jpeg, //MIME类型
[tmp_name] => /tmp/swoole.upfile.n3FmFr,//上传的临时文件,文件名以/tmp/swoole.upfile开头
[error] => 0,//文件尺寸
[size] => 15476
]
7)Http\Request->rawContent
获取原始的POST包体,用于非application/x-www-form-urlencoded格式的Http POST请求,如application/json。
8)Http\Request->getData
获取完整的原始Http请求报文。包括Http Header和Http Body
function swoole_http_request-&gt;getData() : string

4.Response
Http响应对象,通过调用此对象的方法,实现Http响应发送。
当Response对象销毁时,如果未调用end发送Http响应,底层会自动执行end
1)Http\Response->header
设置HTTP响应的Header信息。
function Http\Response->header(string $key, string $value, bool $ucwords = true);
$key,Http头的Key;$value,Http头的Value;$ucwords 是否需要对Key进行Http约定格式化,默认true会自动格式化
注意事项:
header设置必须在end方法之前
$key必须完全符合Http的约定,每个单词首字母大写,不得包含中文,下划线或者其他特殊字符
$value必须填写
$ucwords 设为true,swoole底层会自动对$key进行约定格式化
2)Http\Response->cookie
设置HTTP响应的cookie信息。此方法参数与PHP的setcookie完全一致。
function Http\Response-&gt;cookie(string $key, string $value = '', int $expire = 0 , string $path = '/', string $domain = '', bool $secure = false , bool $httponly = false);
注意事项:
底层自动会对$value进行urlencode编码,可使用rawCookie关闭对$value的编码处理;底层允许设置多个相同$key的COOKIE
3)Http\Response->status
发送Http状态码。
swoole_http_response-&gt;status(int $http_status_code);
注意事项:
$http_status_code必须为合法的HttpCode,如200, 502, 301, 404等,否则会报错
4)Http\Response->redirect
发送Http跳转。调用此方法会自动end发送并结束响应。参数$http_code:状态码,默认为302临时跳转,传入301表示永久跳转
function Http\Response-&gt;redirect(string $url, int $http_code = 302);
5)Http\Response->sendfile
发送文件到浏览器。
function Http\Response-&gt;sendfile(string $filename, int $offset = 0, int $length = 0);
$filename 要发送的文件名称,文件不存在或没有访问权限sendfile会失败
底层无法推断要发送文件的MIME格式因此需要应用代码指定Content-Type
调用sendfile前不得使用write方法发送Http-Chunk
调用sendfile后底层会自动执行end
sendfile不支持gzip压缩
$offset 上传文件的偏移量,可以指定从文件的中间部分开始传输数据。此特性可用于支持断点续传。
$length 发送数据的尺寸,默认为整个文件的尺寸
6)Http\Response->write
启用Http Chunk分段向浏览器发送相应内容。关于Http Chunk可以参考Http协议标准文档。
bool Http\Response->write(string $data);
$data要发送的数据内容,最大长度不得超过2M,受buffer_output_size配置项控制
使用write分段发送数据后,end方法将不接受任何参数
调用end方法后会发送一个长度为0的Chunk表示数据传输完毕
7)Http\Response->end
发送Http响应体,并结束请求处理。
function Http\Response->end(string $html);
end操作后将向客户端浏览器发送HTML内容
end只能调用一次,如果需要分多次向客户端发送数据,请使用write方法
客户端开启了KeepAlive,连接将会保持,服务器会等待下一次请求
客户端未开启KeepAlive,服务器将会切断连接

8)nginx反向代理
可以用swoole处理php请求,nginx处理静态资源,css,图片等等

server {
    listen 80;
    server_name swoole.test;
    index index.html index.htm index.php
    root /path/to/project

    location / {
        if (!-e $request_filename) {
            rewrite ^/(.*)$ /index.php/$1 last;
            break;
        }
    }

    location /Public {
        root /path/to/project
    }

    location ~ \.ico {
        root /path/to/project
    }

    location ~ \.php {
        proxy_pass http://127.0.0.1:9501;
    }
}

原文地址:https://blog.51cto.com/9443450/2382168

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.SW的HttpServerHttpServer的本质仍然是swoole_server,其协议加些部分固定使用Http协议解析,支持同步和异步2种模式完整的HTTP协议请求会被封装在swoole_http_request对象内,所有HTTP响应都会通过swoole_http_response对象进行封装和发送无论是同步模式还是异步模式,HttpServer都可
1、Swoole依赖安装hiredissudowgethttps://github.comedis/hiredis/archive/v0.14.0.tar.gzsudotarxfv0.14.0.tar.gzcdhiredis-0.14.0/sudomakesudomakeinstallsudoldconfig需要在编译时增加--enable-async-redis来开启此功能nghttp2sudowgethttps://gith
直接安装会提示找不到openssl/ssl.h文件即便通过Brew安装了OpenSSLbrewinstallopenssl他自己找不到我们手动让他找到就行了呗…当然OpenSSL一定是要安装的,命令就在上方…然后brewinfoopenssl可以看到:Forcompilerstofindopensslyoumayneedtoset:
1.安装依赖yum install -y php php-pear php-devel httpd gcc gcc-c++2.编译安装swoole上传并解压swoole 源码包至服务器 swoole-src-4.3.1.tar.gzcd  /usr/local/swoole-src-4.3.1输入  phpize执行 ./configure执行 make && make install3.配置PHP支持该
下载swoole地址:https://pan.baidu.com/s/1_N3RiFtT3iHLA5xt6oElqA下载后解压tar-zxvf......执行phpize(去php的安装目录执行这个)如果报以下错误:Cannotfindconfig.m4.Makesurethatyourun'/srv/php/bin/phpize'inthetoplevelsourcedirectoryofthem
昨晚我躺在床上,百无聊赖地翻阅 阿兰·德波顿《身份的焦虑》这本书,看到这么一段话,让我想起网络上做墙头草的键盘侠,他们喜欢贴标签,然后去简单粗暴地批评或讨好一类人,那么可以说公众的眼睛是雪亮的吗?我一直不喜欢太绝对太肯定的观点,对此我也保留怀疑,包括那些道听途说来的道理。  
本着开源为原则,为这个世界更美好作出一份共享,我就给大家做个指路人,如果实用,记得给提供开源的朋友一些鼓励。简单介绍一下实现思路,使用swoole扩展接管php运行,由于swoole只能在类UNIX上运行,所以win朋友需要安装cygwin运行的类UNIX模拟环境。为了照顾大多数用户,这里就以win为例:首先
1.文件锁子进程回复制父进程的IO句柄,但是不能让所有的子进程同时对同一个文件进行操作,所以需要文件锁。2.进程间的通讯方式--管道管道是一组(2个)特殊的描述符管道需要在fork函数调用前创建如果某一段主动关闭管道,另一端读取操作会直接返回0,之后会关闭管道在父进程中创建管道的时候
环境:gccyuminstallgcc第一步:下载swoole包wgethttp://pecl.php.net/package/swoole第二步:解压,并进入执行:/usr/local/php/bin/phpize可能会报错Cannotfindautoconf.Pleasecheckyourautoconfinstallationandthe?$PHP_AUTOCONF?environmentvariableissetcorrectly
1、安装swoolewgethttps://github.com/swoole/swoole-src/archive/v1.9.1-stable.tar.gztarzxvfv1.9.1-stable.tar.gzcdswoole-src-1.9.1-stable/usr/local/php/bin/phpize./configure--with-php-config=/usr/local/php/bin/php-configmakemakeinstall2、配置php支持swoolevi
由来环境:PHP7、Swoole、linux对聊天室有点感兴趣,对于网络协议有一点一知半解,所以决定借助swoole实现个简单的聊天室,来简单剖析下原理,知道原理以后就可以考虑用其他语言或者自己造轮子写个,当然这是后话。源码我放置github(https://github.com/WalkingSun/SwooleServer),有兴趣可
检查环境是否满足Swoole的环境依赖#查看linux内核uname-a#查看gcc版本gcc--versiong++--version升级gcc到4.8以上cd/usr/local/srcwgetwgethttp://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.bz2tar-jxvfgcc-4.8.5.tar.bz2cdgcc-4.8.5/usr/local/sr
卸载现有phpapt-getautoremovephp7*find/etc-name"*php*"|xargsrm-rfaptpurge`dpkg-l|grepphp|awk'{print$2}'|tr"\n"""`编译安装phpaptinstallgccmakelibxml2libxml2-devwgethttp://cn2.php.net/distrib
目录概述代码小结扩展参考文档概述Swoole异步Task,主要实现调用异步任务的执行。常用的场景:异步支付处理、异步订单处理、异步日志处理、异步发送邮件/短信等。Swoole的实现方式是worker进程处理数据请求,分配给task进程执行。官方介绍:task底层使用UnixSoc
上一篇写到了如何在windows系统上面利用docker快速搭建swoole开发环境,接下来体验下swoole的使用使用swoole实现tcp服务<?php$serv=newSwoole\Server("0.0.0.0",9501);$serv->on('connect',function($serv,$fd){echo"客户端".$fd."连接成功\n";});$serv-&
一、同步与异步的区别:1、同步模式:后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的、同步的.2、异步模式:则完全不同,每一个任务有一个或多个回调函数(callback),前一个任务结束后,不是执行后一个任务,而是执行回调函数,后一个任务则是不等前一个
1.什么是RPCRPC是一种进程间的通讯方式,全称是“远程调用过程”。当客户端向服务器发出请求时,并不是至直接发送给目标服务器,而是发送给RPCServer,由RPCServer进行调度。RPC提供与调用本地方法无差别的远程调用方法。2.Hprose简介Hprose是一个轻量级的高性能跨语言RPC服务框架;提供
swoole中,接受数据流处理时,需要将数据流切分成小包才能进行功能的实现,以下为常见的几个协议1.EOF协议EOF协议是用一组固定的,不会出现在数据内的字符作为数据分割的标记,简称EOF协议EOF协议的格式如下:DATA|EOF|DATA|EOF|......2.固定包头协议在数
环境依赖:swoole-1.x需要php-5.3.10或更高版本,swoole-2.x需要php-7.0.0或更高版本。安装步骤:[root@dev~]#cd/usr/local/src[root@devsrc]#wgethttp://pecl.php.net//get/swoole-4.3.5.tgz[root@devsrc]#tar-zxvfswoole-4.3.5.tgz[root@devsrc]#cdsw
Swoole:面向生产环境的PHP异步网络通信引擎    使PHP开发人员可以编写高性能的异步并发TCP、UDP、UnixSocket、HTTP,WebSocket服务。Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。使用PHP+Swoole作