返回JSON时,Slim Framework响应速度极慢

时间:2017-07-24 23:17:51

标签: php json slim slim-3

我正在构建一个基于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秒才能加载,但验证它不是数据库或中间件。如果我拿出返回$响应,页面立即加载。

有什么想法?谢谢!

1 个答案:

答案 0 :(得分:2)

知道了 - 显然Slim正在为$ response添加一个超长的Content-Length标头大小,这使得请求需要花费更长的时间来加载。

我将初始化更改为此并修复了问题:

$api = new Slim(['settings' => [
    'addContentLengthHeader' => false,
]]);

确认完整的渲染+加载时间现在是113毫秒而不是10,000毫秒。

谢谢!