我们使用PHP和CodeIgniter从数百个源中导入数百万个图像,在本地调整大小,然后将大小调整后的版本上传到Amazon S3。然而,这个过程需要比预期更长的时间,我们正在寻找替代品来加快速度。欲了解更多详情:将数百万张图像导入,调整大小并上传到Amazon S3
- 查找是在我们的MySQL数据库表中对尚未调整大小的图像进行的。结果是一组图像。
- 每个图像都使用cURL单独导入,并在处理期间临时托管在我们的服务器上。它们是本地导入的,因为该库不允许调整大小/裁剪外部图像。根据一些测试,从不同外部输入源输入时的速度差异一直在80-140秒之间(对于整个过程,每次测试使用200个图像),所以外部源可以明显减慢速度。
- 当前的图像是使用image_moo library,它可以创建一个CodeIgniter S3 library
- 的S3网址为新调整大小图像的图像
- 调整后的图像上传到Amazon S3的副本,然后保存在数据库调整表,之后开始下一个图像
该过程每个图像需要0.5-1秒,这意味着所有当前图像将需要一个月的时间来调整大小并上传到S3。这个问题的主要问题是我们不断增加图像的新来源,并预计在2011年底之前至少有3000万到5000万的图像,而目前的5月初的400万。
我注意到了StackOverflow中的一个答案,它可能是我们的解决方案的一个很好的补充,其中图像是resized and uploaded on the fly,但由于我们不希望人们访问页面时出现任何不必要的延迟,因此我们需要确保尽可能多的图像尽可能已经上传。除此之外,我们需要多种尺寸的图像格式,目前只能上传最重要的格式,因为这个速度问题。理想情况下,每个导入的图像至少要有三种尺寸格式(例如,一个缩略图,一个正常尺寸和一个大尺寸)。
有人建议几天前批量上传到S3--任何这种节省的经验都会有帮助。
如果您有类似流程的经验,回答问题的任何部分将会有所帮助。部分代码(简体)
$newpic=$picloc.'-'.$width.'x'.$height.'.jpg';
$pic = $this->image_moo
->load($picloc.'.jpg')
->resize($width,$height,TRUE)
->save($newpic,'jpg');
if ($this->image_moo->errors) {
// Do stuff if something goes wrong, for example if image no longer exists - this doesn't happen very often so is not a great concern
}
else {
if (S3::putObject(
S3::inputFile($newpic),
'someplace',
str_replace('./upload/','', $newpic),
S3::ACL_PUBLIC_READ,
array(),
array(
"Content-Type" => "image/jpeg",
)))
{ // save URL to resized image in database, unlink files etc, then start next image
您可以通过Etsy在批量处理数百万张图像方面的经验来学习。请参阅:https://codeascraft.com/2010/07/09/batch-processing-millions-of-images/ – EdgeCaseBerg 2015-07-01 15:53:14