marmelab / silex-multifetch
Silex Provider 为您的应用程序添加多获取功能
Requires
- silex/silex: ~1.2
Requires (Dev)
- phpunit/phpunit: ~4.2.0
- symfony/browser-kit: ~2.3
- symfony/css-selector: ~2.3
- tiagobutzke/phparallel: ~0.1
Suggests
- tiagobutzke/phparallel: Allows parallelize requests fetching
This package is not auto-updated.
Last update: 2020-03-06 16:28:19 UTC
README
存档仓库 此代码已不再维护。请随意分支,但请自行承担风险。 |
Marmelab Silex Multifetch
Multifetch 是一个 Silex Provider,它为任何 Silex 项目添加多获取功能。基于 Facebook 的批量请求哲学。
安装
使用 Composer 在您的项目中安装此包
composer require marmelab/silex-multifetch "~1.0@dev"
在您的应用程序中启用 HttpFragmentServiceProvider
$app->register(new Silex\Provider\HttpFragmentServiceProvider()); $app->register(new Marmelab\Multifetch\MultifetchServiceProvider(), array( 'multifetch.url' => 'multi', // this is the default value 'multifetch.methods' => array('POST'), // this is the default value 'multifetch.parallel' => false, // this is the default value 'multifetch.headers' => true, // this is the default value ));
使用
向 Provider 监听的路由(默认为 '/multi')发送请求,并将要获取的请求作为 JSON 对象传递到请求体中。例如,要使用单个 HTTP 请求获取 /products/1
和 /users
,请发出以下请求
POST /multi HTTP/1.1
Content-Type: application/json
{
"product": "/products/1",
"all_users": "/users"
}
Provider 将调用两个 HTTP 资源,并在所有请求获取完毕后返回一个复合响应体
{ "product": { "code": 200, "headers": [ { "name": "Content-Type", "value": "application/json" } ], "body": "{ id: 1, name: \"ipad2\", stock: 34 }" }, "all_users": { "code": 200, "headers": [ { "name": "Content-Type", "value": "application/json" } ], "body": "[{ id: 2459, login: \"paul\" }, { id: 7473, login: \"joe\" }]" }, }
多获取请求中存在的任何标题将自动添加到所有子请求中。
请求方法
默认情况下,'/multi' 路由只监听 POST 请求。但是,您可以配置 Provider 接受 GET
请求。要启用它,只需将 Provider 配置 multifetch.methods
设置为 array('GET')
。
Provider 将读取查询参数以确定要获取的请求
GET /multi?product=/product/1&all_users=/users HTTP/1.1
如果您想同时启用 POST
和 GET
路由,请将 multifetch.methods
的值设置为 array('POST', 'GET')
。
并行请求
为了能够使用并行获取功能,您必须安装 Parallel.php
库。使用 Composer 安装它
composer require tiagobutzke/phparallel "~0.1"
如果添加了 _parallel
参数,多获取请求可以并行获取子请求
POST /multi HTTP/1.1
Content-Type: application/json
{
"product": "/products/1",
"all_users": "/users",
"_parallel": true
}
您还可以,如果需要,通过将 Provider 参数 'mutltifetch.parallel'
设置为 true
来为所有查询启用并行获取。在这种情况下,如果您只想禁用单个查询的并行获取,您可以这样做
POST /multi HTTP/1.1
Content-Type: application/json
{
"product": "/products/1",
"all_users": "/users",
"_parallel": false
}
警告:parallel
选项为每个子请求创建一个新线程,这可能在某些使用场景中比顺序执行所有请求更快,具体取决于您的使用场景和子请求中的 I/O 操作量。
从响应中移除标题
您可能希望为了提高效率而从响应中移除 headers
。在您的查询中将 _headers
参数设置为 false
。
POST /multi HTTP/1.1
Content-Type: application/json
{
"product": "/products/1",
"all_users": "/users",
"_headers": false
}
您还可以通过在 Provider 配置中将 multifetch.headers
设置为 false
来为您所有的查询从响应中移除 headers
。
错误
可能您的请求操作之一会抛出错误。将返回类似的响应,但带有自定义的状态和正文。成功的请求将按正常方式返回,状态码为200。
以下是一个响应示例
POST /multi HTTP/1.1
Content-Type: application/json
{
"product": "/products/1",
"all_users": "/non_existing_route",
"single_user": "/users/brian" // will trigger a 500 error
}
{ "product": { "code": 200, "headers": [ { "name": "Content-Type", "value": "application/json" } ], "body": "{ id: 1, name: \"ipad2\", stock: 34 }" }, "all_users": { "code": 404, "headers": [], "body": "{ error: \"No route found for \\\"GET \\\/non_existing_route\\\"\", type: \"NotFoundHttpException\" }" }, "single_user": { "code": 500, "headers": [], "body": "{ error: \"Oops! Something went wrong.\", type: \"InternalServerError\" }" }, }
测试
使用以下命令运行测试套件
make install
make test