Swoole学习笔记(三):HttpServer

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

完整的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("

Hello Swoole. #".rand(1000, 9999)."

"); }); $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("

hello swoole

"); })

在收到一个完整的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->server['request_time'];
3)Http\Request->$get
请求的GET参数,相当于PHP中的$_GET,格式为数组。
echo $request->get['hello'];
注意:为防止HASH***,GET参数最大不允许超过128个
4)Http\Request->$post
POST参数,格式为数组。
echo $request->post['hello'];
注意:POST与Header加起来的尺寸不得超过package_max_length的设置,否则会认为是恶意请求;同样的,POST参数的个数最大不超过128个
5)Http\Request->$cookie
HTTP请求携带的COOKIE信息,格式为键值对数组。
echo $request->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->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->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->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->redirect(string $url, int $http_code = 302);
5)Http\Response->sendfile
发送文件到浏览器。
function Http\Response->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

你可能感兴趣的:(Swoole学习笔记(三):HttpServer)