您好,登錄后才能下訂單哦!
這篇文章主要講解了“云盤上使用aws_s3_sdk for php的方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“云盤上使用aws_s3_sdk for php的方法”吧!
aws s3 全名是 Simple Storage Service,是對象存儲服務(oss),對象存儲服務作為網盤的優點這里就不細說了,其提供的統一接口sdk幾乎涵蓋了所有語言。除了通用性以外,其以上傳下載為核心的接口幾乎可以滿足所有的業務需求。本人在幾年的工作中對接過不同sdk的接口,可以說aws s3的接口,只有你想不到,沒有他做不到,雖然前提是你能從他那天書一樣的接口文檔中找到你想要的內容。下文是記錄下對接過程中s3幾個比較重要的接口,對象存儲是私有化部署,下文代碼是以php為開發語言(哪個開發語言不重要,只要語言底層支持io多路復用性能上都不會有太大區別)。
連接
access_key和secret_key是每個對象存儲都會提供的信息,在endpoint填寫自己私有化部署或者其它云服務商的對象存儲地址
use Aws\S3\S3Client; use Aws\Credentials\Credentials; use Aws\Exception\AwsException; use Aws\Exception\MultipartUploadException; use Aws\S3\ObjectUploader; use Aws\S3\MultipartUploader; $this->client = new S3Client([ 'endpoint' => $endpoint, 'region' => 'us-east-1', //需要隨便一個region 'service_name' => 's3', 'verify' => 'False', 'credentials' => new Credentials($aws_access_key_id, $aws_secret_access_key);, 'version' => 'latest' ]);
上傳
1、實現簡單的文件上傳
$uploader = new ObjectUploader( $this->client, $bucket, $key, $source ); $result = $uploader->upload();
2、分片上傳
如果文件較大,上傳時間會變慢,而且代碼會堵塞在upload部分,
所以可以通過接口提供分片上傳:
$source = '/path/to/large/file.zip'; $uploader = new MultipartUploader($s3Client, $source, [ 'bucket' => 'your-bucket', 'key' => 'my-file.zip', 'before_initiate' => function (\Aws\Command $command) { $command['CacheControl'] = 'max-age=3600'; } ]);
大致原理是對一個文件進行切割,然后并發上傳,該方法有多個參數,可控制每個分片的大小,同時上傳的分片數量或者每個分片上傳前、上傳后、上傳失敗等回調操作,十分靈活。
3、異步分片上傳
雖然上面的分片上傳操作可減少大文件上傳時間,但是像一些上傳文件的操作,從web端上傳到服務端,需要先上傳整個文件到服務端,然后服務端再上傳文件到oss端。這樣的話如果服務端使用oss做文件存儲,就算web端使用了分片上傳到服務端,服務端也得等待所有分片上傳完畢,合成最終文件,再將文件上傳到oss端,這樣上傳時間會變多。所以要優化分片上傳的操作,可以使用s3提供的異步分片上傳功能:
$res = $this->client->createMultipartUpload(array_merge([ 'Bucket' => $bucket, // REQUIRED 'Key' => $key, // REQUIRED 'Expires' => $expire, ], $args)); return $res;
上面代碼提供了一個分片上傳任務,并返回一個upload_id,這樣當web端上傳了一個文件的分片,可根據upload_id先上傳到oss端,oss端將分片暫時保存到內存中(需要根據分片順序填寫PartNumber):
$res = $this->client->uploadPart([ 'Body' => $source, 'Bucket' => $bucket, // REQUIRED 'Key' => $key, // REQUIRED 'PartNumber' => $PartNumber, // REQUIRED 'UploadId' => $UploadId, // REQUIRED ]); return $res;
當web端所有分片都上傳完畢,同時所有分片也上傳到oss端后,調用完成上傳接口:
$res = $this->client->completeMultipartUpload([ 'Bucket' => $bucket, // REQUIRED 'Key' => $key, // REQUIRED 'MultipartUpload' => $MultipartUpload, 'UploadId' => $UploadId, // REQUIRED ]); return $res;
這樣就能實現web端上傳與服務端上傳oss的并發進行,可節省大量的上傳時間。
上面是上傳的主要功能,每個接口還提供了大量的參數和回調方法,主要很多參數和回調現在也沒有需求用得上,在此就不一一列舉
下載
php sdk的下載功能比起python來說功能比較簡陋,但也可以實現分片下載功能,涉及到下載文件的只有一個接口:
$res = $this->client->getObject(array_merge([ 'Bucket' => $bucket, 'Key' => $key, 'Range' => 'bytes=0-9', 'SaveAs' => '/path/to/save/file' ], $args)); return $res;
其中比較重要的是range參數,它實現了瀏覽器的斷點續傳功能,當瀏覽器請求文件下載時,如果文件存儲在oss,普通情況下需要把文件先下載下來,然后再讓瀏覽器分片下載,但是通過傳遞range參數,把文件對應的分片從oss下載下來,然后再發送給web端,實現了持續從oss端下載到web端,中間無阻隔
分頁查詢
普通的分頁查詢可使用listObjects:
$result = $this->client->listObjects([ 'Bucket' => '<string>', // REQUIRED 'Delimiter' => '<string>', 'EncodingType' => 'url', 'ExpectedBucketOwner' => '<string>', 'Marker' => '<string>', 'MaxKeys' => <integer>, 'Prefix' => '<string>', ]);
使用MaxKeys作為每頁數量,Marker作為每次請求一頁中的最后一個文件,作為key傳給下一頁請求的marker,類似offset的作用。
實際上由于oss沒有分頁功能,普通這樣的請求只能從第一頁開始查詢直到想查詢的頁數,浪費大量的資源。所以可以通過oss提供的分頁迭代器來實現:
$args['Bucket'] = $bucket; $args['MaxKeys'] = $limit; $results = $this->client->getPaginator('ListObjects', $args); $total_results = []; for ($i = 0; $i < $offset; $i++) { if ($results->valid()) { $results->next(); } else { break; } } if ($results->valid()) { array_push($total_results, $results->current()); $results->next(); } return $total_results;
迭代器是幾乎所有語言都有實現的功能,他的作用是保存代碼上下文狀態,例如上面的代碼,通過迭代器形成一個分頁工具,當使用next進行翻頁,底層代碼不需要請求接口,而是通過指針指向下一頁,這樣就能實現快速翻頁,獲取對應頁數的文件。
感謝各位的閱讀,以上就是“云盤上使用aws_s3_sdk for php的方法”的內容了,經過本文的學習后,相信大家對云盤上使用aws_s3_sdk for php的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。