【问题标题】:php/mysql query to generate imagemagick image - bad practice?php/mysql 查询生成 imagemagick 图像 - 不好的做法?
【发布时间】:2015-10-20 20:27:15
【问题描述】:

我的情况是一个相对简单的情况:我想生成一个图像(从现有的原始图像),其裁剪数据是从 mysql 数据库中检索的(它将即时创建图像;我可以将其保存到服务器稍后,取决于生成的图像大小的数量),我希望 mysql 查询和 imagick (imagemagick) 在同一个 php 脚本中。

我的问题是:这是一种不好的做法吗?我在服务器负载(等)方面不是那么“专业”,并且想知道在同一脚本中生成 mysql 查询和 imagemagick 图像是否会太慢或负载密集。

提前感谢您的任何见解。

【问题讨论】:

  • 这需要多久执行一次?每个用户的每个请求?和你的服务器说再见。一天一?每星期一次?没什么大不了的。
  • "...对于每个用户的每个请求?向您的服务器说再见。" 每个请求。那么不好?请详细说明一下好吗?
  • 假设您有 100 个并发用户。它们都同时访问服务器,这将启动此图像处理。 3000x2000 像素的“平均”.jpg 需要 18 兆内存来保存原始位图,这意味着您需要 1.8 GIGABYTES 来保存 JUST 原始原始图像。加上处理后的副本、操作系统等的额外内存......

标签: php mysql imagemagick imagick


【解决方案1】:

图像处理是 CPU 和 RAM 密集型的。您当然可以按照您提到的方式使用图像处理,但如果您的流量增长很快,您需要能够轻松添加 Web/PHP 服务器以让您的系统扩展。

为了使这项工作顺利进行,您应该打开 MySQL 连接,执行查询,然后关闭连接,然后进行图像处理。这样一来,您的 MySQL 连接池就不会被进程处理图像时处于空闲状态的连接填满。

编辑 保留已生成图像的缓存是一个绝妙的主意。如果我是你,我会将其构建为正式的缓存。当缓存变满时,明智的做法是删除缓存中最近引用的元素,而不是最近生成的元素。这样就不需要重新生成您经常使用的图像。

裁剪图像的过程在 CPU 上并不昂贵;要做到这一点,ImageMagick 必须解压缩图像,裁剪它,然后重新压缩它。您的大部分计算成本将出现在解压缩/重新压缩操作中(裁剪非常便宜)。 RAM 成本将与图像的大小成正比。 ImageMagick 可以从源代码编译以利用多核 CPU。您需要对此进行试验以确保其有效。

我之所以提出添加服务器的观点,是因为如果您将系统设计为预先执行此操作会更容易。

【讨论】:

  • 感谢您的洞察力。我已经养成了在查询后关闭连接的习惯(但你指出这一点很好),buuuut ...我想我宁愿选择更多的高清空间(只有在图像不存在时才生成图像HD,然后把它写在那里)而不是“额外的服务器”。我曾怀疑这会是负载密集型的,但是多少...嗯,谢谢。
  • 再次感谢!是的,我可以看到设置“负载平衡”服务器的逻辑,这些服务器负责处理图像生成等 CPU 密集型工作......以及为什么不在它们之间分配 HD 空间(让它们作为唯一目录访问) .
猜你喜欢
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 2012-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
相关资源
最近更新 更多