Symfony - 响应中的图像 - 速度,优化

Woj*_*lik 5 php optimization symfony1 image response

我在我的控制器中生成动态图形:

  1. 如果不存在文件(唯一文件名),则生成图形并保存

  2. return RedirectResponse($ 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;
Run Code Online (Sandbox Code Playgroud)

)

我需要它为用户动态生成用户栏[在此图形上,如果在我的网站上进行一些更改,一些文本将自动更新].

所以对我来说这个脚本运行速度很快并且不会杀死我的服务器/ bandwitch对我很重要.为了实现这一点,我已经制作了缓存,其中存储了所有生成的图形.但是我的速度有问题,我上面描述的解决方案非常慢,当我使用开发人员工具(F12)在chrome中测试它然后它告诉我两个解决方案(2.和3.)需要大约〜1s(当相同的图形[没有控制器等只是直接url到.png]加载44毫秒).

因此,如果仅对我而言,每个图形大约需要1个,那么如果例如1000个用户将同时生成此图形,那么我认为它可能会减慢我的网站速度.

请帮忙,你知道更快的方法吗?

PS.重定向不是我最想要的东西,因为我更喜欢保留url,例如smth/username/userbar/insted of smth/img/userbars/cache/blabla.png.但如果它会快得多,那么我可以忍受它:).

编辑:要明确:我不是在寻找缓存图像的解决方案,我的问题是通过控制器返回图像(已生成的图像,仅来自ftp)需要大约1秒,通常情况下,如果您这样做

           <img src="direct_url_to_png"> 
Run Code Online (Sandbox Code Playgroud)

它需要大约44毫秒.

Mar*_*oij 3

您可以使用Varnish来缓存图像,Varnish 是位于网络服务器前面的 HTTP 代理。配置它需要一些时间和知识,但它是一个非常好的软件。

或者,您可以使用共享内存memcacheredis将图像缓存在内存中。这可能不如 Varnish 有效,但它会节省文件系统 IO。

您应该测试花费最多时间的地方,我希望它是文件 I/O 和 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

另一种可能的选择是使用 HTML/CSS 来显示图表。这可能有效也可能无效,具体取决于您的图表的外观,但我过去使用过它并且效果很好。