Symfony - изображение в ответ - скорость, оптимизация - PullRequest
5 голосов
/ 05 февраля 2012

Я динамически генерирую графику в моем контроллере:

  1. , если файл не существует (уникальное имя файла), затем генерирую графику и сохраняю ее

  2. returnRedirectResponse ($ url)

(3. Я также пробовал:

    $fp = fopen($url, "rb");
    $str = stream_get_contents($fp);
    fclose($fp);

    $response = new Response($str, 200);
    $response->headers->set('Content-Type', 'image/png');
    return $response;

)

Мне нужно, чтобы он генерировал динамическое изображение дляпользователи [на этом рисунке часть текста будет автоматически обновляться, если на моих сайтах будут сделаны некоторые изменения].

Так что для меня важно, чтобы этот скрипт работал быстро и не убивал мой сервер / полосу переключения.Для этого я создал кеш, где хранится вся сгенерированная графика.Но у меня есть проблема со скоростью, решения, которые я описал выше, довольно медленные, когда я тестировал их в Chrome с помощью инструмента разработчика (F12), то это показывает, что оба решения (2. и 3.) принимаютоколо ~ 1 с (когда одна и та же графика [без контроллеров и т. д., просто прямая ссылка на .png] загружает 44 мс).

Так что, если только у меня это занимает около 1 с на графике, то если, например, 1000 пользователей одновременно сгенерируют эту графику, это может замедлить мой сайт.

Пожалуйста, помогите, сделайтеВы знаете более быстрые способы сделать это?

PS.Перенаправление не является для меня самой желанной вещью, потому что я предпочел бы оставить URL таким, какой он есть, например, smth / username / userbar / insted из smth / img / юзербары / cache / blabla.png.Но если это будет намного быстрее, тогда я смогу это выдержать:).

РЕДАКТИРОВАТЬ: Для ясности: я не ищу решение для кэширования изображений, моя проблема в том, что возврат изображений через контроллер (уже сгенерированные изображения, только из ftp) занимает около 1 с, когда обычно, если вы, например,

           <img src="direct_url_to_png"> 

, это занимает около 44 мс.

1 Ответ

3 голосов
/ 05 февраля 2012

Вы можете использовать Varnish для кэширования изображений. Varnish - это HTTP-прокси, который находится перед веб-сервером. На его настройку уходит некоторое время и знания, но это очень хорошее программное обеспечение.

Кроме того, вы можете кэшировать изображения в памяти, используя разделяемую память , memcache или redis . Вероятно, это будет менее эффективно, чем Varnish, но это сохранит файловую систему ввода-вывода.

Вы должны проверить, где тратится больше всего времени, я ожидаю, что это комбинация времени ввода-вывода файлов и времени разбора PHP, но, как мы говорим на нидерландском языке, «Измерение - это знание»;)

Вот простой пример, который должен дать вам общее представление о том, как это сделать:

<?php
class MyClass
{
  function __construct()
  {
     $this->timer = array(
       'start' => microtime(True);
     );
   }

  function myAction()
  {
    $this->timer['startaction'] = microtime(True);

    $fp = fopen($url, "rb");
    $this->timer['startstream'] = microtime(True);
    $str = stream_get_contents($fp);
    fclose($fp);
    $this->timer['endstream'] = microtime(True);

    $response = new Response($str, 200);
    $response->headers->set('Content-Type', 'image/png');

    $this->timer['endaction'] = microtime(True);
    print_r($this->timer)
    return $response;
  }
}

Еще одна вещь, которая может быть опцией, - это использовать HTML / CSS для отображения графиков. Это может или не может работать в зависимости от того, как выглядят ваши графики, но я использовал это в прошлом, и это работало довольно хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...