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 權限