2015-10-20 33 views
2

我的情况是一个比较简单的情况:我想生成一个图像(从现有的原始图像),它的裁剪数据从mysql数据库中检索(它会在运行中创建图像;我可以将它保存到服务器稍后,取决于生成的图像大小的数量),并且我希望MySQL查询和imagick(imagemagick)在同一个php脚本中。php/mysql查询生成imagemagick图像 - 不好的做法?

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

在此先感谢您的任何见解。

+1

究竟需要多久进行一次?对每个用户的每个请求?告诉你的服务器再见。一天一?一个星期一次?没什么大不了。 “ –

+0

_”...对于每个用户的每个请求?说再见到您的服务器。“_ 每个请求。那么不好?请你详细说明一下吗? –

+1

假设你有100个并发用户。他们都在同一时间点击服务器,这启动了这个图像处理。 3000x2000像素的“平均”.jpg需要18兆内存来保存原始位图,这意味着您需要1.8 ** GIGABYTES **来保存** JUST **原始原始图像。加上额外的RAM为处理副本,操作系统等... –

回答

1

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

为了使这项工作顺利,您应该打开您的MySQL连接,执行查询,然后关闭连接,然后执行图像处理。这样,你的MySQL连接池就不会被闲置的连接所占用,而这些连接在进程紧缩图像时处于空闲状态。

编辑保留已经生成的图像缓存是一个很好的主意。如果我是你,我会把它当作一个正式的缓存。当缓存变满时,明智地放弃最近最少的参考元素的缓存,而不是最近的生成的之一。这样你的经常使用的图像将不需要重新生成。

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

我提出了关于添加服务器的观点,因为如果您将系统设计为提前完成,它会更容易。

+0

谢谢你的洞察力。我已经养成了在查询后关闭连接的习惯(但你指出这点很好),buuuut ...我想我宁愿选择更多的HD空间(只有在图像不存在时才生成图像高清,然后写在那里)比'额外的服务器'。 我曾怀疑它会是负载密集型的,但是_much _...嗯,谢谢。 –

+0

再次感谢! 是的,我可以看到设置“负载均衡”服务器的逻辑,这些服务器负责处理诸如图像生成等CPU密集型工作......并且为什么不在它们之间分配HD空间(将它们作为独特目录)。 –