[AWS SDK for PHP] Xử lý upload multiple files đồng thời lên S3 Storage hiệu quả

Việc lưu trữ và quản lý file trên đám mây đã trở thành một phần quan trọng trong quá trình phát triển ứng dụng. Việc upload nhiều files đồng thời không chỉ giúp tiết kiệm thời gian mà còn tối ưu hiệu suất, đặc biệt quan trọng đối với các ứng dụng yêu cầu xử lý lượng lớn dữ liệu.

Giả sử chúng ta có 1000 files cần upload lên S3 Storage.

Thông thường, chúng ta sẽ làm như sau:

PHP
foreach ($uploadFiles as $uploadFile) {
    $response = $this->s3StorageClient->putObject([
        'Bucket'       => ****,
        'Key'          => $uploadFile['filename'],
        'SourceFile'   => $uploadFile['content'],
        'ACL'          => 'public-read'
//        ....
   ]);
}

Theo cách trên, nếu chúng ta upload 10 files thì sẽ mất 10 lần để xử lý putObject, nếu upload 1000 files thì sẽ lần lượt xử lý putObject 1000 lần.

Để giải quyết việc này, AWS PHP SDK có cung cấp một class CommandPool, class này có thể thực thi nhiều lệnh AWS cùng lúc.

PHP
$commands = [];
foreach ($uploadFiles as $uploadFile) {
    $commands[] = $this->s3StorageClient->getCommand('PutObject', [
        'Bucket'       => ****,
        'Key'          => $uploadFile['filename'],
        'SourceFile'   => $uploadFile['content'],
        'ACL'          => 'public-read'
    ]);
}

Đầu tiên, không thực thi lệnh putObject trong vòng lặp mà hãy sử dụng getCommand để tạo lệnh cho putObject và lưu trữ nó trong một mảng.

Sau đó, bạn có thể dễ dàng thực thi các lệnh đồng thời bằng cách đưa s3 instance và mảng commands được vào phương thức CommandPool::batch.

PHP
CommandPool::batch($this->s3StorageClient, $commands);

Ở đây chúng ta có thể lấy files đồng thời sau khi gọi hàm CommandPool::batch

PHP
$responses = CommandPool::batch($this->s3StorageClient, $commands);

foreach ($responses as $response) {
  // code here
}

Em cũng đã triển khai cách trên áp dụng vào dự án và cũng khá hiệu quả về performance.

Đối với những bài toán upload số lượng files lên đến hàng trăm nghìn, hàng triệu, chúng ta có thể zip từng nhóm files rồi thực hiện upload đồng thời theo cách trên, nhưng cần sử dụng thêm một service để giải nén file zip sau khi upload (AWS Lambda chẳng hạn).


Tài liệu tham khảo:

0 Shares:
Leave a Reply

Your email address will not be published. Required fields are marked *

You May Also Like
Read More

Có gì mới ở PHP 8.3?

Table of Contents Hide 1. Typed Class Constants2. Dynamic class constant fetch3. json_validate() function4. #[\Override] attribute5. Deep Cloning of readonly Properties6. Randomizer::getBytesFromString() method7. Randomizer::getFloat() and…
Read More

SOLID Principles

Table of Contents Hide Single-responsibility PrincipleOpen/Closed Principle (OCP)Liskov Substitution Principle (LSP)Interface Segregation Principle (ISP)Dependency Inversion Principle (DIP)Advantages of…
Read More

20 Laravel Eloquent Tips and Tricks (P1)

Eloquent ORM được sủ dụng rất nhiều trong 1 project Laravel, tuy nhiên để sử dụng được tối đa những gì Laravel cung cấp thì không phải ai cũng biết. Trong bài viết này mình sẽ chỉ cho các bạn một vài thủ thuật, hi vọng sẽ giúp ích cho các bạn trong một vài trường hợp cụ thể.