Привет, я создал сценарий, который должен сделать набор файлов изображений общедоступным для чтения в корзине хранилища Google. Позже другой скрипт снова сделает их приватными.
Скрипты выполняются на GCE (вычислительном движке Google). Он начинает работать нормально и устанавливает файлы общедоступными, но прежде, чем он закончит со всеми файлами, он обнаруживает следующее фатальное исключение
Uncaught exception 'DomainException' with message 'Could not load the default credentials. in (...)/vendor/google/auth/src/ApplicationDefaultCredentials.php:148
Stack trace:
#0 (...)/vendor/google/apiclient/src/Google/Client.php(1053): Google\Auth\ApplicationDefaultCredentials::getCredentials('https://www.goo...')
#1 (...)/vendor/google/apiclient/src/Google/Client.php(354): Google_Client->createApplicationDefaultCredentials()
#2 (...)/vendor/google/apiclient/src/Google/Client.php(777): Google_Client->authorize()
#3 (...)/vendor/google/apiclient/src/Google/Service/Resource.php(232): Google_Client->execute(Object(GuzzleHttp\Psr7\Request), 'Google_Service_...')
#4 (...)/vendor/google/auth/src/ApplicationDefaultCredentials.php on line 148
Я использую следующий код.
require "../vendor/autoload.php";
$client = new Google_Client();
$client->useApplicationDefaultCredentials();
$client->addScope(Google_Service_Storage::DEVSTORAGE_READ_WRITE);
$storage = new Google_Service_Storage($client);
$acl = new Google_Service_Storage_ObjectAccessControl();
$acl->setEntity('allUsers');
$acl->setRole('READER');
foreach($objects as $object){
$files = $storage->objects->listObjects($GLOBALS["bucket"],array("prefix"=>$object->name()));
$thumbs = $storage->objects->listObjects($GLOBALS["bucket"],array("prefix"=>"thumb/".$object->thumb()));
$files = array_merge($files["items"],$thumbs["items"]);
foreach($files as $file){
if(strpos($file["name"],".pdf")===false)
$storage->objectAccessControls->insert($GLOBALS["bucket"], $file["name"], $acl);
}
}
Кто-нибудь с любыми предложениями, почему учетные данные по умолчанию иногда не могут быть найдены?
Я изменил свой код, чтобы использовать команду «gsutil acl ch» с помощью команды php «exec». Это работает без проблем и немного быстрее, потому что я могу запустить gsutil как mulitprocess с параметром -m.
Но иногда остается вопрос, почему другой сценарий не может получить учетные данные по умолчанию. Я попытался заключить функцию в блок try / catch, заставив ее повторить попытку несколько раз, когда она обнаружила исключение. При этих повторных попытках учетные данные по умолчанию можно было снова найти, и сценарий продолжал гудеть при установке ACL для файлов, пока снова не завершился ошибкой.
Кажется, что никогда не использовавшиеся версии API не имеют таких проблем.
Более новая версия немного отличается от старой. Вместо того, чтобы создавать объект Google_Client, я использовал их ServiceBuilder. Теперь код выглядит так.
$builder = new ServiceBuilder([
'projectId' => "[projectID]",
'keyFilePath' => "[keyFilePath]",
]);
$bucket = $builder->storage()->bucket("[bucketName]");
$objects = $this->bucket->objects(["prefix"=>"[PathPrefix]"]);
foreach($objects as $object)
$object->acl()->add("allUsers","READER");