我們使用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