這篇文章主要講解了“云盤上使用aws_s3_sdk for php的方法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“云盤上使用aws_s3_sdk for php的方法”吧!
創(chuàng)新互聯(lián)專業(yè)為企業(yè)提供北碚網(wǎng)站建設(shè)、北碚做網(wǎng)站、北碚網(wǎng)站設(shè)計、北碚網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁設(shè)計與制作、北碚企業(yè)網(wǎng)站模板建站服務(wù),10余年北碚做網(wǎng)站經(jīng)驗,不只是建網(wǎng)站,更提供有價值的思路和整體網(wǎng)絡(luò)服務(wù)。
aws s3 全名是 Simple Storage Service,是對象存儲服務(wù)(oss),對象存儲服務(wù)作為網(wǎng)盤的優(yōu)點這里就不細(xì)說了,其提供的統(tǒng)一接口sdk幾乎涵蓋了所有語言。除了通用性以外,其以上傳下載為核心的接口幾乎可以滿足所有的業(yè)務(wù)需求。本人在幾年的工作中對接過不同sdk的接口,可以說aws s3的接口,只有你想不到,沒有他做不到,雖然前提是你能從他那天書一樣的接口文檔中找到你想要的內(nèi)容。下文是記錄下對接過程中s3幾個比較重要的接口,對象存儲是私有化部署,下文代碼是以php為開發(fā)語言(哪個開發(fā)語言不重要,只要語言底層支持io多路復(fù)用性能上都不會有太大區(qū)別)。
連接
access_key和secret_key是每個對象存儲都會提供的信息,在endpoint填寫自己私有化部署或者其它云服務(wù)商的對象存儲地址
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、實現(xiàn)簡單的文件上傳
$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'; } ]);
大致原理是對一個文件進(jìn)行切割,然后并發(fā)上傳,該方法有多個參數(shù),可控制每個分片的大小,同時上傳的分片數(shù)量或者每個分片上傳前、上傳后、上傳失敗等回調(diào)操作,十分靈活。
3、異步分片上傳
雖然上面的分片上傳操作可減少大文件上傳時間,但是像一些上傳文件的操作,從web端上傳到服務(wù)端,需要先上傳整個文件到服務(wù)端,然后服務(wù)端再上傳文件到oss端。這樣的話如果服務(wù)端使用oss做文件存儲,就算web端使用了分片上傳到服務(wù)端,服務(wù)端也得等待所有分片上傳完畢,合成最終文件,再將文件上傳到oss端,這樣上傳時間會變多。所以要優(yōu)化分片上傳的操作,可以使用s3提供的異步分片上傳功能:
$res = $this->client->createMultipartUpload(array_merge([ 'Bucket' => $bucket, // REQUIRED 'Key' => $key, // REQUIRED 'Expires' => $expire, ], $args)); return $res;
上面代碼提供了一個分片上傳任務(wù),并返回一個upload_id,這樣當(dāng)web端上傳了一個文件的分片,可根據(jù)upload_id先上傳到oss端,oss端將分片暫時保存到內(nèi)存中(需要根據(jù)分片順序填寫PartNumber):
$res = $this->client->uploadPart([ 'Body' => $source, 'Bucket' => $bucket, // REQUIRED 'Key' => $key, // REQUIRED 'PartNumber' => $PartNumber, // REQUIRED 'UploadId' => $UploadId, // REQUIRED ]); return $res;
當(dāng)web端所有分片都上傳完畢,同時所有分片也上傳到oss端后,調(diào)用完成上傳接口:
$res = $this->client->completeMultipartUpload([ 'Bucket' => $bucket, // REQUIRED 'Key' => $key, // REQUIRED 'MultipartUpload' => $MultipartUpload, 'UploadId' => $UploadId, // REQUIRED ]); return $res;
這樣就能實現(xiàn)web端上傳與服務(wù)端上傳oss的并發(fā)進(jìn)行,可節(jié)省大量的上傳時間。
上面是上傳的主要功能,每個接口還提供了大量的參數(shù)和回調(diào)方法,主要很多參數(shù)和回調(diào)現(xiàn)在也沒有需求用得上,在此就不一一列舉
下載
php sdk的下載功能比起python來說功能比較簡陋,但也可以實現(xiàn)分片下載功能,涉及到下載文件的只有一個接口:
$res = $this->client->getObject(array_merge([ 'Bucket' => $bucket, 'Key' => $key, 'Range' => 'bytes=0-9', 'SaveAs' => '/path/to/save/file' ], $args)); return $res;
其中比較重要的是range參數(shù),它實現(xiàn)了瀏覽器的斷點續(xù)傳功能,當(dāng)瀏覽器請求文件下載時,如果文件存儲在oss,普通情況下需要把文件先下載下來,然后再讓瀏覽器分片下載,但是通過傳遞range參數(shù),把文件對應(yīng)的分片從oss下載下來,然后再發(fā)送給web端,實現(xiàn)了持續(xù)從oss端下載到web端,中間無阻隔
分頁查詢
普通的分頁查詢可使用listObjects:
$result = $this->client->listObjects([ 'Bucket' => '<string>', // REQUIRED 'Delimiter' => '<string>', 'EncodingType' => 'url', 'ExpectedBucketOwner' => '<string>', 'Marker' => '<string>', 'MaxKeys' => <integer>, 'Prefix' => '<string>', ]);
使用MaxKeys作為每頁數(shù)量,Marker作為每次請求一頁中的最后一個文件,作為key傳給下一頁請求的marker,類似offset的作用。
實際上由于oss沒有分頁功能,普通這樣的請求只能從第一頁開始查詢直到想查詢的頁數(shù),浪費大量的資源。所以可以通過oss提供的分頁迭代器來實現(xiàn):
$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;
迭代器是幾乎所有語言都有實現(xiàn)的功能,他的作用是保存代碼上下文狀態(tài),例如上面的代碼,通過迭代器形成一個分頁工具,當(dāng)使用next進(jìn)行翻頁,底層代碼不需要請求接口,而是通過指針指向下一頁,這樣就能實現(xiàn)快速翻頁,獲取對應(yīng)頁數(shù)的文件。
感謝各位的閱讀,以上就是“云盤上使用aws_s3_sdk for php的方法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對云盤上使用aws_s3_sdk for php的方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
網(wǎng)頁名稱:云盤上使用aws_s3_sdkforphp的方法
地址分享:http://aaarwkj.com/article38/pesjsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站策劃、企業(yè)建站、小程序開發(fā)、Google、品牌網(wǎng)站建設(shè)、網(wǎng)站改版
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)