swoole--异步http服务器

2021-05-21

Http\Server继承自Server,Server提供的所有API和配置项都可以使用,进程模型也是一致的


use Swoole\Http\Server;

// 配置服务ip和端口
$http = new Server('0.0.0.0', 9501);

// 配置服务参数
$http->set([
	'upload_tmp_dir'     => '/data/uploadfiles/', // 设置上传文件的临时目录。目录最大长度不得超过220字节
	'http_parse_post'    => false, // 设置POST消息解析开关,默认开启,true自动将Content-Type为x-www-form-urlencoded的请求包体解析到POST数组。
	'http_parse_cookie'  => false, // 关闭Cookie解析,将在header中保留未经处理的原始的Cookies信息。默认开启
	'http_parse_files'   => false, // 设置上传文件解析开关。默认开启
	'open_http2_protocol'      => false, // 启用HTTP2协议解析
	
	'http_compression'   => false, // 针对Response对象的配置,启用压缩。默认为开启。使用write方法,将会强制关闭压缩,目前支持gzip、br、deflate三种压缩格式,底层会根据浏览器客户端传入的 Accept-Encoding 头自动选择压缩方式
	'http_compression_level' => 1, // 压缩级别,1-9
	'compression_min_length' => 128, // 设置开启压缩的最小字节,超过该选项值才开启压缩

	'enable_static_handler'  => true, // 开启静态文件请求处理功能,默认false;
	'document_root'          => '/data/webroot/example.com', // 静态文件根目录,必须为绝对路径,与enable_static_handler配合使用。底层收到Http请求会先判断document_root路径下是否存在此文件,如果存在会直接发送文件内容给客户端,不再触发 onRequest 回调。
	'static_handler_locations' => ['/static', '/app/images'], // 设置静态处理器的路径。类型为数组,默认不启用。类似于Nginx的location指令,可以指定一个或多个路径为静态路径。只有URL在指定路径下才会启用静态文件处理器,否则会视为动态请求。必须以/开头
]);

// 监听请求接口
$http->on('request', function (\Swoole\Http\Request $request, \Swoole\Http\Response $response) use ($http) {

	// $_SERVER
	$request->server;

	// 请求头
	$request->header;
	
	// $_GET,参数最大不允许超过128个
	$request->get;

	// $_POST,参数最大不允许超过128个,与header加起来不能超过package_max_length的设置
	$request->post;

	// $_COOKIE
	$request->cookie;

	// $_FILES,最大文件尺寸不得超过package_max_length设置的值
	$request->files;

	// 获取原始的POST包体,用于非application/x-www-form-urlencoded格式的HTTP POST请求
	$request->getContent();

	// 获取完整的原始Http请求报文。包括Http Header和Http Body
	$request->getData();

	// 获取当前的HTTP请求的请求方式
	$request->getMethod();

	// 发送异步任务
	$http->task(strval($response->fd));


	// 设置HTTP响应的Header信息$key=>$value,$format为true将对Key进行HTTP约定格式化
	$response->header($key, $value, $format = true);

	// 将Header信息$key=>$value附加到HTTP响应的末尾,$format为true将对Key进行HTTP约定格式化;仅在HTTP2中可用,用于消息完整性检查,数字签名等。
	$response->trailer($key, $value, $ucwords = true);

	// 设置HTTP响应的cookie信息$key=>$value。与setcookie方法一致。Swoole会自动会对$value进行urlencode编码,可使用rawCookie()方法关闭对$value的编码处理
	$response->cookie($key, $value = '', $expire = 0 , $path = '/', $domain  = '', $secure = false , $httponly = false, $samesite = '', $priority = '');

	// 设置HTTP响应的cookie信息,与cookie方法相同,只不过不进行编码处理
	$response->rawCookie($key, $value = '', $expire = 0 , $path = '/', $domain  = '', $secure = false , $httponly = false, $samesite = '', $priority = '');

	// 发送Http状态码;未传递$reason时$http_status_code必须为合法HttpCode,传递时$http_status_code不限制
	$response->status($http_status_code, $reason);

	// 发送Http重定向。调用此方法会自动end发送并结束响应。
	$response->redirect($url, $http_code = 302);

	//发送文件到浏览器,需要在header中指定Content-Type,调用sendfile前不得使用write方法发送Http-Chunk,调用sendfile后底层会自动执行end,
	// sendfile不支持gzip压缩
	// 可以指定文件的起始偏移量$offset和长度$length
	$response->sendfile($filename, $offset = 0, $length = 0);

	// 启用Http Chunk分段向浏览器发送相应内容,$data长度不得超过2M,受buffer_output_size配置项控制
	// 使用write分段发送数据后,end方法将不接受任何参数,调用end只是会发送一个长度为0的Chunk表示数据传输完毕。
	$response->write($data);

    // 发送Http 响应体,并结束请求处理,end只能调用一次,如果需要分多次向客户端发送数据,请使用write方法
    $response->end(string $html);
});

// 异步任务
$http->on('task', function ($serv, $task_id, $worker_id, $data) {
	// 判断Swoole\Http\Response对象是否已结束 (end) 或已分离 (detach)。
	$response->isWritable();

    //分离响应对象。使用此方法后,$response对象销毁时不会自动end,与Http\Response::create和Server->send配合使用。
	$response->detach();

	// 以客户端连接$fd创建一个新的Swoole\Http\Response对象
	$resq = Swoole\Http\Response::create($fd);

	$resq->send($resp->fd, "HTTP/1.1 200 OK\r\nServer: server\r\n\r\nHello World\n");
});


$http->start();

 

{/if}