【问题标题】:Symfony - image in response - speed, optimizationSymfony - 图像响应 - 速度,优化
【发布时间】:2026-01-20 20:55:01
【问题描述】:

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

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

  2. 返回重定向响应($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;

)

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

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

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

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

附言。重定向对我来说不是最渴望的事情,因为我更愿意保留 url 原样,例如 smth/username/userbar/ insted 或 smth/img/userbars/cache/blabla.png。但如果它会更快,那么我可以忍受:)。

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

           <img src="direct_url_to_png"> 

大约需要 44 毫秒。

【问题讨论】:

    标签: php image optimization symfony1 response


    【解决方案1】:

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

    或者,您可以使用shared memorymemcacheredis 将图像缓存在内存中。这可能不如 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;
      }
    }
    

    另一个可能的选择是使用 HTML/CSS 来显示图表。这可能会或可能不会起作用,具体取决于您的图表的外观,但我过去曾使用过它并且效果很好。

    【讨论】:

    • "是使用 HTML/CSS 来显示图表"你是什么意思?我没有看到它,因为我需要首先从数据库中获取一些统计信息,所以我更愿意通过 Controller 传递它。我认为问题在于返回此图像(使用 stream_get_contents 或重定向大约需要 800 毫秒)。顺便说一句,也许我完全错了,我的解决方案还不错?如果它只影响为用户加载图像并且它不会减慢服务器的速度,而不是我认为的那样?正如我所见,您专注于存储生成的图像,但真正的问题是返回此图像:)。
    • 我上面写的这个时间是指从缓存中加载图像。通过控制器从 ftp 加载已经生成的图像大约需要 1 秒,我想改进它。
    • 感谢您的建议,我已经对其进行了测试,总的来说还不错。当我单独生成图形时,它只加载大约 150 毫秒(不管是通过重定向还是 stream_get_contents),所以我认为这还不错。直接加载大约需要32ms,但是我检查文件是否存在,从数据库中获取信息并获取图形,所以看起来不错。