我正在构建一个基于Slim framework 3.8.1的简单API。我遇到的问题是响应需要大约10秒才能渲染。我已经通过消除过程验证了这是响应的实际渲染时间大约需要10秒---这不是数据库查询,应用程序引导程序等。
我正在登录我从端点获取的数据,它会或多或少地立即检索和呈现它。该路由实际上甚至在浏览器中立即呈现JSON输出,但随后继续旋转~10,000ms。
不确定这里发生了什么,特别是因为它是一个非常小的数据集。已经证实这种情况发生在各种浏览器中,并且还在像Postman这样的REST客户端中进行测试。
我确认中间件早在执行此等待时已经执行了,所以看起来不是这样。
这是我正在做的最小版本。
$results = $wpdb->get_results($sql);
$colname=array();
foreach($results as $result){
$colname[] = $result;}
如果我使用<?php
$api = new Slim();
$api->any('/{plant}/{noun}', function ($request, $response, $args) {
return $response->withStatus($status)->withJson(
$my_json
);
}
而只是发送一个短文本字符串,那就没关系了。如果我将JSON传递给->write()
,它会挂起相同的,持续约10秒。
奇怪的是,如果我做一些像->write()
那样简单的事情,它会立即返回一个回复,但需要注意的是响应正文被截断并只显示return $response->withStatus(404)->withJson(['foo'=>'bar']);
而不是完整的{"
响应我我期待着。
这是我正在成功传递的JSON主体,但渲染时间约为10秒:
{"foo":"bar"}
最初由于响应的大小,我认为它很慢,但是这也需要大约10秒才能完成加载(再一次它立即渲染然后旋转持续时间:
{
"data": {
"id": "14",
"user_id": "1",
"name": "foozzz",
"description": "1q234567u12349",
"sku": "",
"price": "123.00",
"shipping": {
"r1-1": "123.00",
"r1-1+": "123.00",
"r2-1": "123.00",
"r2-1+": "123.00"
},
"flexible_price": "1",
"digital_fulfillment": "1",
"physical_fulfillment": "1",
"physical_weight": "0",
"physical_width": "0",
"physical_height": "0",
"physical_depth": "0",
"available_units": "-1",
"variable_pricing": "0",
"fulfillment_asset": "9",
"descriptive_asset": "64",
"creation_date": "1499186300",
"modification_date": "1499707715",
"variants": {
"attributes": [],
"quantities": [
{
"id": "13",
"key": "\"{\\\"123\\\":\\\"PURPLE\\\",\\\"2442\\\":\\\"djdoos\\\"}\"",
"formatted_name": "",
"value": "13"
},
{
"id": "14",
"key": "\"{\\\"123\\\":\\\"PURPLE\\\",\\\"2442\\\":\\\"dskmkdjjd\\\"}\"",
"formatted_name": "",
"value": "10"
},
{
"id": "15",
"key": "\"{\\\"123\\\":\\\"dappsajd\\\",\\\"2442\\\":\\\"djdoos\\\"}\"",
"formatted_name": "",
"value": "123"
},
{
"id": "16",
"key": "\"{\\\"123\\\":\\\"dappsajd\\\",\\\"2442\\\":\\\"dskmkdjjd\\\"}\"",
"formatted_name": "",
"value": "81"
}
]
}
},
"status": 200,
"status_uid": "commerce_item_200"
}
在Apache / 2.2.15上的PHP 5.6.30上运行它,没有其他类似的问题。对于为什么会发生这种情况的任何想法?
回顾一下:它需要大约10秒才能加载,但验证它不是数据库或中间件。如果我拿出返回$响应,页面立即加载。
有什么想法?谢谢!
答案 0 :(得分:2)
知道了 - 显然Slim正在为$ response添加一个超长的Content-Length标头大小,这使得请求需要花费更长的时间来加载。
我将初始化更改为此并修复了问题:
$api = new Slim(['settings' => [
'addContentLengthHeader' => false,
]]);
确认完整的渲染+加载时间现在是113毫秒而不是10,000毫秒。
谢谢!