Проблемы с загрузкой изображений с помощью Amazon S3 и плагина jqueryfileupload


У меня есть еще одна проблема, связанная с amazon, и она связана с загрузкой файлов. Я использую jqueryFileUpload и API Amazon для загрузки файлов на amazon S3. Мне удалось загрузить его, но это связано с хитростью.
Я должен был сохранить изображение на моем сервере, а затем переместить его на S3 с помощью putObjectFile Метод S3. Теперь плагин поставляется с отличными функциями для обрезки / изменения размера изображений, и я использую их с давних пор. Теперь, когда я интегрирую плагин с AWS, у меня возникают проблемы с производительностью при загрузке. Время, необходимое для загрузки, превышает нормально, и это вызывает вопросы о том, что мы используем AWS S3 по сравнению с традиционным способом
Мне пришлось внести изменения в мой файл UploadHandler.php, чтобы он заработал. Эти изменения сделаны. Я добавил часть кода загрузки AWS в файл со строки 735 до 750

     $bucket = "elasticbeanstalk-2-66938761981";
     $s3 = new S3(awsAccessKey, awsSecretKey);
     $response = $s3->putObjectFile($file_path,$bucket,$file->name,S3::ACL_PUBLIC_READ);
     $thumbResponse = $s3->putObjectFile('files/thumbnail/'.$file->name,$bucket,'images/'.$file->name,S3::ACL_PUBLIC_READ);
     //echo $response;
     //echo $thumbResponse;
     if ($response==1) {
        //echo 'HERER enter!!';
     } else {
          $file->error = "<strong>Something went wrong while uploading your file... sorry.</strong>";
     }
     return $file; 

Вот ссылка на класс S3 на GIT. Обычная загрузка на мой текущий сервер (не amazon), загрузка тех же изображений за 15 секунд, но на amazon S3 это занимает около 23 секунд, и я не могу найти лучшего решения. Я должен сохранить изображение на своем сервере до загрузка на S3, так как я не уверен, смогу ли я обработать их на лету и загрузить непосредственно на S3.
Кто-нибудь может предложить правильный способ решения проблемы? Можно ли изменить размеры изображений до различных размеров в памяти и загрузить их непосредственно на S3, избегая лишних затрат при сохранении их на нашем сервере? Если да, может кто-нибудь направить меня в правильном направлении?
Спасибо за внимание.

1 ответ

Я полагаю, что приблизительные 8 секунд - это издержки для создания версий изображения в разных размерах. Вы можете использовать различные подходы, чтобы избавиться от накладных расходов на изменение размера во время загрузки. Основная идея заключается в том, чтобы позволить загружающему сценарию завершить выполнение и вернуть ответ, а также выполнить процесс изменения размера в виде отдельного сценария.

Я хотел бы предложить следующие подходы: Подход 1. Не меняйте размер при загрузке! Создавайте версии с измененным размером на лету, только когда они запрашиваются в первый раз, и сохраняйте в кэше сгенерированные изображения, чтобы использовать их непосредственно для последующих запросов. Я видел несколько упоминаний об Amazon CloudFront в качестве решения в некоторых других потоках в Stackru.

Подход 2. Вызвать код для создания измененных версий в виде отдельного асинхронного запроса после загрузки исходного изображения. Будет иметь место задержка в доступности масштабированных версий. Поэтому напишите необходимый код, чтобы показывать на сайте изображения местозаполнителей, пока не станут доступны уменьшенные версии. Вам нужно будет найти какой-то способ определить, доступна ли масштабированная версия или нет (например, проверьте, существует ли файл или установите какой-либо флаг в базе данных). Некоторые способы создания асинхронных запросов cURL предлагаются здесь, если вы хотите попробовать это.

Я думаю, что оба подхода будут иметь одинаковый уровень сложности.

Некоторые другие подходы предлагаются в качестве ответов на этот другой вопрос.

Другие вопросы по тегам