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 Bodyfunction 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;
}
}
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网页题目:Swoole学习笔记(三):HttpServer-创新互联
文章转载:http://scjbc.cn/article/egsgi.html