Ответ Slim Framework невероятно медленный при возврате JSON

Я создаю простой API на основе Slim framework 3.8.1. У меня проблема, когда ответ занимает ~ 10 секунд для рендеринга. Методом исключения я подтвердил, что фактический рендеринг ответа занимает ~ 10 секунд --- это не запрос к базе данных, загрузка приложения и т. д.

Я регистрирую данные, которые я получаю от конечной точки, и она извлекает и отображает их более или менее мгновенно. На самом деле маршрут даже сразу отображает вывод JSON в браузере, но затем продолжает вращаться в течение ~ 10 000 мс.

Не уверен, что здесь происходит, тем более что это довольно небольшой набор данных. Проверено, что это происходит в различных браузерах, а также тестируется в клиентах REST, таких как Postman.

Я убедился, что промежуточное программное обеспечение уже давно выполнено, когда это ожидание произошло, так что это не похоже на это.

Вот минимальная версия того, что я делаю.

<?php
$api = new Slim();

    $api->any('/{plant}/{noun}', function ($request, $response, $args) {

        return $response->withStatus($status)->withJson(
                            $my_json
                        );
    }

Если я использую ->write() и вместо этого просто отправлю короткую текстовую строку, все в порядке. Если я передам JSON в ->write(), он зависнет примерно на 10 секунд.

Как ни странно, если я делаю что-то простое, например return $response->withStatus(404)->withJson(['foo'=>'bar']);, он возвращает ответ мгновенно, с оговоркой, что тело ответа усекается и просто показывает {" вместо полного ответа {"foo":"bar"}, который я ожидаю.

Вот тело JSON, которое я успешно передаю, но оно отображается примерно 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"
}

Первоначально я думал, что это медленно из-за размера ответа, но это также занимает ~ 10 секунд, чтобы завершить загрузку (еще раз он отображается мгновенно, а затем вращается в течение продолжительности:

{
  "status": 404,
  "status_uid": "general_404",
  "status_message": "Route not found, or server error",
  "error_name": "There was an error while getting a response",
  "error_message": "The request failed."
}

Выполнение этого на PHP 5.6.30 на Apache/2.2.15 без каких-либо других проблем, подобных этой. Любые мысли о том, почему это может происходить?

Напомним: загрузка занимает около 10 секунд, но проверено, что это не база данных или промежуточное ПО. Если я уберу ответ $response, страница сразу же загрузится.

Какие-нибудь мысли? Спасибо!


person tom f    schedule 24.07.2017    source источник


Ответы (1)


Понятно --- очевидно, Слим добавлял сверхдлинный размер заголовка Content-Length в $response, из-за чего загрузка запроса занимала намного больше времени.

Я изменил инициализацию на это, и это устранило проблему:

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

Подтверждено, что время полного рендеринга + загрузки теперь составляет 113 мс вместо 10 000 мс.

Спасибо!

person tom f    schedule 25.07.2017