這篇文章主要介紹了關於PHP使用Azure Storage Blob上傳文件,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
分配到一個項目,一個需要內容管理的小站,前端頁面展示與特效由前端同事完成。我負責建置內容管理後台以及提供資料介面。這個專案裡需要管理端能夠上傳視頻,但是甲方提供的伺服器頻寬非常迷你,而且同一個伺服器上還有其他專案並行。
為了防止突發升級帶來的後續影響,組長建議我學習使用Azure Storage Blob,並隨時做好升級準備。
在Github裡找到了官方提供的sdk。
Minimum Requirements
PHP 5.6 or above
由於本地配置的PHP環境是5.5.12,而sdk需要的最低php版本為5.6,composer阻止了更新
於是使用composer update --ignore-platform-reqs
繞過需求監控強升。
然而類別BlobResources.php
中將const設為數組,在5.5中會報錯
Fatal error: Arrays are not allowed in class constants in E:\webroot\tp5cms\vendor\microsoft\azure-storage-blob\src\Blob\Internal\BlobResources.php on line 103
沒辦法只能升級PHP。
為了開發需要,決定將wampserver提升至最新版本。
升級wamp有個技巧:不能直接覆蓋安裝,要先去掉舊版再安裝新版本。
仔細閱讀升級提示。
總結一下需要做的大概是如下兩件事:
移除服務
Start WampServer
【重要】登入MySQL備份所有資料庫資料
wampmanager -> Stop all Services
wampmanager -> MySQL -> Service -> Remove service 移除MySQL服務
wampmanager -> Apache -> Service -> Remove service 移除Apache服務
stop wampmanager
右鍵wampmanager -> Exit
#將wamp命名為其他名字以作備份
StartStorageEmulator.cmd#發現提示需要安裝
SQL Server Express Local DB,這裡有下載連結。選擇Express Edition,進入後選擇LocalDB下載並安裝。
C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulato r.exe start Windows Azure Storage Emulator 5.3.0.0 command line tool 未经处理的异常: System.TimeoutException: Unable to open wait handle. 在 Microsoft.WindowsAzure.Storage.Emulator.Controller.EmulatorProcessControll er.InternalWaitForStorageEmulator(Int32 timeoutInMilliseconds) 在 Microsoft.WindowsAzure.Storage.Emulator.Controller.EmulatorProcessControll er.EnsureRunning(Int32 timeoutInMilliseconds) 在 Microsoft.WindowsAzure.Storage.Emulator.Commands.StartCommand.RunCommand() 在 Microsoft.WindowsAzure.Storage.Emulator.Program.Main(String[] args)
#运行:>C:\Users\Walter>netstat -p tcp -ano | findstr :10000> TCP 127.0.0.1:10000 0.0.0.0:0 LISTENING 2664 #根据PID 2664查询对应的进程>C:\Users\Walter>tasklist | findstr "2664">YunDetectService.exe 2664 Console 1 9,944 K #只是一个不重要的进程,去掉后继续开发>C:\Users\Walter>taskkill /pid 2664 /f>成功: 已终止 PID 为 2664 的进程。 #以下是模拟器成功运行的范例>C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe start Windows Azure Storage Emulator 5.3.0.0 command line tool The storage emulator was successfully started. >C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe status Windows Azure Storage Emulator 5.3.0.0 command line tool IsRunning: True BlobEndpoint: http://127.0.0.1:10000/QueueEndpoint: http://127.0.0.1:10001/TableEndpoint: http://127.0.0.1:10002/
開始開發
透過官方的例子可以嘗試新增container,blob及刪除功能。成功上傳blob後,卻無法對儲存模擬器中的資源進行尋址。
eg.使用的帳號名稱
devstoreaccount1,建立的容器名稱
mycontainerudfpbk,blob名稱
5ac1a5c82021d.png。
根據文件中的規則,資源位址應為
http://127.0.0.1:10000/devstoreaccount1/mycontainerudfpbk/5ac1a5c82021d.png但是傳回資料一直是
<Error> <Code>ResourceNotFound</Code> <Message> The specified resource does not exist. RequestId:9d2d1b08-12b1-4feb-8636-4325eb71b838 Time:2018-04-08T09:14:14.3007800Z </Message> </Error>根據閱讀相關文章後發現原來在建立容器時,若沒有設定過存取權限(container-level access policies),則預設為禁止外部存取。 ACL(PublicAccessType)權限分為三等
CONTAINER_AND_BLOBS、
BLOBS_ONLY、
NONENONE
。
若資源需要外部能夠存取則設定為BLOBS_ONLY
即可。
附上自己封裝的azure輔助類別
這中間還遇到一個小問題,在設權限時,ACLBase報了個錯誤Static function MicrosoftAzure\Storage\Common\ Internal\ACLBase::createAccessPolicy() should not be abstract
經過查詢後發現,在PHP5.2以後不允許abstract和static同時使用在方法上。
#只要将ACLBase中的abstract protected static function createAccessPolicy();abstract protected static function validateResourceType($resourceType);#改为protected static function createAccessPolicy(){}protected static function validateResourceType($resourceType){}#即可
總結
利用pid結束進程taskkill / pid PID /f
利用pid結束進程ntsd -c q -p PID
利用進程名稱結束進程ntsd -c q -pn NAME.exe
官方提供的sdk位址
自用輔助類別位址
註:強制結束前先明確這個進程的作用
以上就是本文的全部內容,希望對大家的學習有幫助,更多相關內容請關注PHP中文網!
相關推薦:
以上是PHP使用Azure Storage Blob上傳文件的詳細內容。更多資訊請關注PHP中文網其他相關文章!