http
Http服务 模块
概述
ripple提供了一个易用的HttpServer组件,可以用于快速构建一个Http服务,使用方法如下
其中Request和Response继承并实现了Symfony
的RequestInterface
和ResponseInterface
接口规范
可以像使用Symfony / Laravel中的 HttpFoundation 组件一样使用他们
用例
use Co\IO;
use Ripple\Store\Net\HttCo\Server\Request;
use Ripple\Store\Net\HttCo\Server\Response;
use function Co\await;
use function Co\run;
$server = Co\Net::Http()->server('http://127.0.0.1:8008');
$handler = function (Request $request, Response $response) {
if ($request->getMethod() === 'POST') {
$files = $request->files->get('file');
$data = [];
foreach ($files as $file) {
$data[] = [
'name' => $file->getClientOriginalName(),
'path' => $file->getPathname(),
];
}
$response->headers->set('Content-Type', 'application/json');
$response->setContent(json_encode($data));
$response->respond();
}
if ($request->getMethod() === 'GET') {
if ($request->getPathInfo() === '/') {
$response->setContent('Hello World!');
$response->respond();
}
if ($request->getPathInfo() === '/download') {
$response->setContent(
IO::File()->open(__FILE__, 'r')
);
$response->respond();
}
if ($request->getPathInfo() === '/upload') {
$template = '<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>Upload</title></head><body><form action="/upload" method="post" enctype="multipart/form-data"><input type="file" name="file"><button type="submit">Upload</button></form></body>';
$response->setContent($template);
$response->respond();
}
if ($request->getPathInfo() === '/qq') {
$qq = await(Co\Net::Http()->Guzzle()->getAsync(
'https://www.qq.com/'
));
$response->setContent($qq->getBody()->getContents());
$response->respond();
}
}
};
$server->onRequest($handler);
$server->listen();
run();
端口复用
ripple支持配合Parallel的模块实现端口多路复用
# 如上创建好HttpServer后,可以替代监听方式实现端口多路复用
$task = Co\System::Process()->task( fn() => $server->listen() );
$task->run(); //runtime1
$task->run(); //runtime2
$task->run(); //runtime3
$task->run(); //runtime4
$task->run(); //runtime5
# 守护模式启动例子
$guardRun = function($task) use (&$guardRun){
$task->run()->except(function() use ($task, &$guardRun){
$guardRun($task);
});
};
$guardRun($task);
Co\run();