Woj*_*lik 5 php optimization symfony1 image response
我在我的控制器中生成动态图形:
如果不存在文件(唯一文件名),则生成图形并保存
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毫秒.
您可以使用Varnish来缓存图像,Varnish 是位于网络服务器前面的 HTTP 代理。配置它需要一些时间和知识,但它是一个非常好的软件。
或者,您可以使用共享内存、memcache或redis将图像缓存在内存中。这可能不如 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 来显示图表。这可能有效也可能无效,具体取决于您的图表的外观,但我过去使用过它并且效果很好。
| 归档时间: |
|
| 查看次数: |
6802 次 |
| 最近记录: |