Выполненный скрипт PHP не может получить доступ к подключенному диску GCS на GCE

Мне удалось смонтировать свое облачное хранилище Google с помощью командной строки ниже:

gcsfuse -o allow_other -file-mode=660 -dir-mode=770 --uid=<uid> --gid=<gid> testbucket /path/to/domain/folder

В группу входит пользователь apache. Apache может писать на смонтированный диск следующим образом:

sudo -u apache echo 'Some Test Text' > /path/to/domain/folder/hello.txt

hello.txt появится в корзине, как и ожидалось. Однако, когда я выполняю приведенный ниже скрипт php, я получаю сообщение об ошибке:

<?php file_put_contents('/path/to/domain/folder/hello.txt', 'Some Test Text');

Ошибка PHP: не удалось открыть поток: отказано в разрешении

echo exec('whoami'); Возвращает apache

Я предположил, что это обычное использование для установки с помощью gcsfuse или чего-то подобного, но, похоже, я единственный в Интернете с этой проблемой. Я не знаю, проблема в том, как я его смонтировал, или в безопасности службы httpd.


person Syclone    schedule 26.07.2016    source источник
comment
Здесь много движущихся частей. Сможете ли вы воспроизвести проблему без PHP или даже Apache? Это очень поможет. В противном случае, возможно, вы могли бы использовать strace, чтобы точно узнать, какие системные вызовы PHP вызывают сбой.   -  person jacobsa    schedule 27.07.2016


Ответы (1)


Я столкнулся с подобной проблемой.

Используйте флаг --implicit-dirs при монтировании корзины Google Storage с помощью gcsfuse. Подробнее об этом здесь.

Установка корзины как папки заставляет ОС рассматривать ее как обычную папку, которая может содержать файлы и папки. Но в корзине Google Cloud Storage нет структуры каталогов. Например, когда вы создаете файл с именем hello.txt в папке с именем files внутри корзины Google Storage, вы на самом деле не создаете папку и не помещаете в нее файл. Объект создается в корзине с именем files/hello.txt. Подробнее об этом здесь и здесь.

Чтобы операционная система воспринимала ведро GCS как иерархическую структуру, вы должны указать флаг --implicit-dirs для gcsfuse.

Примечание. Я бы не рекомендовал использовать gcsfuse в производственных системах, поскольку это программное обеспечение бета-версии.

person Baranitharan Selvasundaram    schedule 27.07.2016
comment
Я вижу разницу в поведении папок, но, к сожалению, это не помогло мне решить проблему. Я все еще не могу сохранять файлы с помощью PHP. Вместо этого я буду использовать API. Спасибо за вашу помощь! - person Syclone; 30.07.2016