Mount GCP storage as filesystem, and access with php
主要是使用 gcsfuse 這個工具,還有就是使用 Google\Cloud\Storage\StorageClient 這個套件
mount as filesystem
Google cloud plateform 提供了 gcsfuse 這個工具可以 mount bucket storage 到檔案系統中,方法如下;
$ export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s` $ echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list $ curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add - $ sudo apt-get update $ sudo apt-get install gcsfuse $ sudo mkdir /photovideo $ sudo gcsfuse photovideo /photovideo/ $ sudo ls -al /photovideo-ulsee
要unmount 也很簡單
$ fusermount -u /home/shared/local_folder/
access with php
要透過 php 存取的話,需要使用 google api,可以在這邊找到,透過composer就可以安裝完成。
比較繁瑣的是在 access authentication 部分,雖然在機器上安裝 cloud sdk 後,便可如同 alibabacloud oss 一樣,mount 上去之後就可以當成跟一般檔案存取一樣直接讀寫。但是 Google 並不建議這樣使用,主要是怕被破台後整個storage被看光光,所以建議透過api來進行(可以參考Authentication Guide)。
遵照 Authentication Guide 產生 json 格式的 key 之後存檔,比方說存在呼叫 php 檔的上層路徑,為 ../service_api_key.json ,然後就可以引用 google cloud storage library,透過這個 keyfile 存取儲存空間了。
<?php require '../vendor/autoload.php'; use Google\Cloud\Storage\StorageClient; use Google\Cloud\Core\ServiceBuilder; .... .... class UploadsController extends ControllerBase { public function test() { //.... //.... $storage = new StorageClient([ 'keyFilePath' => '../service_api_key.json' ]); $storage->registerStreamWrapper(); $files[0]->moveTo($this->storageconfig->tmp . $upload->upload1); exec("sudo mv " . $this->storageconfig->tmp . $upload->upload1 . " " . $this->storageconfig->upload . $upload->upload1); //.... //.... // read file $target_file_gs = "gs://gcp-test-storage/source/". $upload->upload1; readfile($target_file_gs); } }
主要透過 new StorageClient 並給予 key file,然後呼叫 registerStreamWrapper() 取得存取權限。比較奇妙的是,當作檔案上傳時,必須先存到 local file 後再搬到 gcp storage 去,所以同時也要記得打開 www server 的 sudo mv 權限。
Original link: Phanix's Blog