這篇文章主要介紹了關於PHP使用Azure Storage Blob上傳檔案,有著一定的參考價值,現在分享給大家,有需要的朋友可以參考一下
前言
分配到一個項目,一個需要內容管理的小站,前端頁面展示與特效由前端同事完成。我負責搭建內容管理後台以及提供資料介面。這個項目裡需要管理端能夠上傳視頻,但是甲方提供的伺服器頻寬非常迷你,而且同一個伺服器上還有其他項目並行。
為了防止突發升級帶來的後續影響,組長建議我學習使用Azure Storage Blob,並隨時做好升級準備。
PHP版本限制
在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。
升級WAMP 2.5-3.1
為了開發需要,決定將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命名為其他名字以作備份
安裝儲存模擬器
由於公司內沒有用於測試的azure帳號,幸好azure有用於測試開發的儲存模擬器。Windows系統可以直接下載安裝,Linux系統可以使用開源儲存模擬器Azurite。
下載模擬器,此處有下載連結。
安裝完成後運行StartStorageEmulator.cmd
發現提示需要安裝SQL Server Express Local DB
,在此處有下載連結。選擇Express Edition,進入後選擇LocalDB下載並安裝。
再次運行cmd發現錯誤
C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe startWindows Azure Storage Emulator 5.3.0.0 command line tool 未處理的例外狀況: System.TimeoutException: Unable to open wait handle.在 Microsoft.WindowsAzure.Storage.Emulator.Controller.EmulatorProcessController.InternalWaitForStorageEmulator(Int32 timeoutInMilliseconds)在 Microsoft.WindowsAzure.Storage.Emulator.Controller.EmulatorProcessController.EnsureRunning(Int32 timeoutInMilliseconds)在 Microsoft.WindowsAzure.Storage.Emulator.Commands.StartCommand.RunCommand() 在 Microsoft.WindowsAzure.Storage.Emulator.Program.Main(String[] args)
經過查詢後發現這是因為有進程佔用了10000號連接埠。
#運行:>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 startWindows Azure Storage Emulator 5.3.0.0 command line toolThe storage emulator was successfully started. >C:\Program Files (x86)\Microsoft SDKs\Azure\Storage Emulator>AzureStorageEmulator.exe statusWindows Azure Storage Emulator 5.3.0.0 command line toolIsRunning: TrueBlobEndpoint: 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
、NONE
,預設是NONE
。
若資源需要外部能夠訪問則設定為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地址
自用輔助類地址
註:強制結束前先明確這個進程的作用
以上就是本文的全部內容,希望對大家的學習有所協助,更多相關內容請關注topic.alibabacloud.com!