Google Cloud Storage - 迁移到新版本,每个前缀获取'maxResults'对象



因此,我们正在从旧版本的GCS PHP库(const LIBVER="1.0.5-beta"(迁移到新版本(v1.22?v0.122.0?(。旧方法使用GoogleClient对象和派生的Google_Service_Storage对象,并在bucket中列出具有指定前缀的对象:

self::$client = new Google_Client();
self::$service = new Google_Service_Storage(self::$client);
$page_token = null;
$prefix = 'AR0001/file_manager/Images/';
$objects = self::$service->objects->listObjects(<bucket name>,
[ 'prefix' => $prefix,
'maxResults' =>10,
'pageToken' => $page_token
]);
printf("GOT %d objectsn", count($objects['items']) );

虽然较新的API直接调用bucket来检索对象:

self::$client = new StorageClient( [
'projectId' => <my project id>,
'keyFile'  => <key file stuff>
]
);
$bucket = self::$client->bucket( <bucket name> );
$page_token = null;
$prefix = 'AR0001/file_manager/Images/';
$objects = $my_bucket->objects( [ 'prefix'     => $prefix,
'maxResults' => 10,
'pageToken'  => $page_token
] );
printf("GOT %d objectsn", count($objects) );

我发现了最初的问题,但这导致了下一个问题——"maxResults"似乎不起作用。我已经设置了";maxResults";在params中为10。在";旧的";在这种情况下,我每次调用都会得到10个结果,page_token可以让我在进行时获得所有对象。但在新的情况下,maxResults似乎不起作用——我一次就得到了所有66个对象。我将其设置为10以测试我的分页,但不确定为什么它不适用于bucket->objects((大小写?

根据官方文档,这是使用前缀的列表对象的推荐解决方案:

function list_objects_with_prefix($bucketName, $prefix)
{
$storage = new StorageClient();
$bucket = $storage->bucket($bucketName);
$options = ['prefix' => $prefix,'resultLimit'=>2];
foreach ($bucket->objects($options) as $object) {
printf('Object: %s' . PHP_EOL, $object->name());
}
}

此文档中有一个选项用于测试前缀。

客户端库将在您迭代时自动对您的请求进行分页。因此,正如您所提到的,如果您在整个集合上迭代,那么在没有自定义maxResults设置的情况下,12000个对象的存储桶将导致12个API调用。

如果您需要在bucked中列出几个对象,客户端库将在迭代时自动对您的请求进行分页。例如,如果您的存储中有4000个对象,并且您没有设置maxResults,则需要执行4个API调用来迭代entireset,因为官方文档指出maxResults的默认值为1000

您可以使用maxResult和resultLimit设置从bucket中检索对象的分页列表。

例如:

use GoogleAuthHttpHandlerGuzzle6HttpHandler;
use GoogleCloudStorageStorageClient;
use GuzzleHttpClient;
use GuzzleHttpHandlerCurlHandler;
use GuzzleHttpHandlerStack;
use PsrHttpMessageRequestInterface;
$handler = new CurlHandler();
$stack = HandlerStack::create($handler);
$stack->push(function (callable $handler) {
return function (RequestInterface $request, array $options) use ($handler) {
// only write the log for calls to list objects.
$uri = $request->getUri()->getPath();
if (substr_compare($uri, '/o', -2) === 0) {
echo "Requesting page" . PHP_EOL;
}
return $handler($request, $options);
};
});
$client = new Client(['handler' => $stack]);
$storage = new StorageClient([
'httpHandler' => new Guzzle6HttpHandler($client)
]);
$bucket = $storage->bucket('my-bucket');
$i = 0;
foreach ($bucket->objects(['maxResults' => 1, 'resultLimit' => 5]) as $obj) {
$i++;
echo $i . ': ' . $obj->name() . PHP_EOL;
}

输出将是这样的:

Requesting page
1: object-a
Requesting page
2: object-b
Requesting page
3: object-c
Requesting page
4: object-d
Requesting page
5: object-e

如果您想了解此库的选项,请查看此文档。

最新更新