草庐IT

php - Symfony - 图像响应 - 速度,优化

coder 2024-04-07 原文

我在我的 Controller 中生成动态图形:

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

  2. 返回 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;

)

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

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

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

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

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

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

           <img src="direct_url_to_png"> 

大约需要 44 毫秒。

最佳答案

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

或者,您可以使用 shared memory 在内存中缓存图像, 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;
  }
}

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

关于php - Symfony - 图像响应 - 速度,优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9149418/

有关php - Symfony - 图像响应 - 速度,优化的更多相关文章

  1. ruby-on-rails - 每次我尝试部署时,我都会得到 - (gcloud.preview.app.deploy) 错误响应 : [4] DEADLINE_EXCEEDED - 2

    我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie

  2. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  3. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  4. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  5. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  6. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  7. ruby-on-rails - 使用 Dragonfly 从 URL 分配图像 - 2

    我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ

  8. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  9. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  10. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

随机推荐