进度跟踪 - 适用于 PHP 的 Amazon SDK
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

进度跟踪

S3 传输管理器提供内置的进度跟踪功能。

跟踪所有操作

您可以通过在S3TransferManager实例上设置为来启用对所有操作(文件和目录)track_progresstrue的跟踪。

<?php use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [ 'track_progress' => true, ] );

通过此设置,SDK 使用内置文件SingleProgressTracker<add link>进行文件操作,并使用内置MultiProgressTracker<add link>进行目录操作。

跟踪单个文件操作

如果您未在转账管理器上启用进度跟踪,则可以通过两种方式启用对单个方法的跟踪。

$config数组true中设置为track_progress,用于特定的文件操作。

<?php use Aws\S3\S3Transfer\Models\UploadDirectoryRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [] ); $uploadDirPromise = $transferManager->uploadDirectory( new UploadDirectoryRequest( '/path/to/directory', 'amzn-s3-demo-bucket', [], [ // $config array 'track_progress' => true, ], [] ) );
创建新SingleProgressTracker实例或提供的自定义实现AbstractTransferListener。将您的跟踪器作为$progressTracker参数传递给文件操作。
<?php use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\SingleProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [] ); $uploadPromise = $transferManager->upload( new UploadRequest( '/path/to/Myfile.txt', // Or an instance of StreamInterface. [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'file.txt', ], [], [], new SingleProgressTracker() // Or custom implementation of the TransferLister interface. ) );

以下示例显示了名SingleProgressTracker为的文件的上传进度的内置控制台输出示例MyFile.txt

控制台输出显示上传 MyFile .txt 的进度条,其中包含完成百分比和传输速度

跟踪单个目录操作

如果您没有在转移管理器上启用进度跟踪,则可以通过两种方式为目录操作启用该功能。

在方法的$config数组参数true中将 “track_progress” 设置为。
<?php use Aws\S3\S3Transfer\Models\UploadDirectoryRequest; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [] ); $uploadDirPromise = $transferManager->uploadDirectory( new UploadDirectoryRequest( '/path/to/directory', 'amzn-s3-demo-bucket', [], [ // $config array 'track_progress' => true, ], [] ) );
创建一个新MultiProgressTracker实例并将其作为$progressTracker参数传递给目录操作。
<?php use Aws\S3\S3Transfer\Models\UploadDirectoryRequest; use Aws\S3\S3Transfer\Progress\MultiProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $transferManager = new S3TransferManager( null, [] ); $uploadDirPromise = $transferManager->uploadDirectory( new UploadDirectoryRequest( '/path/to/directory', 'amzn-s3-demo-bucket', [], [], [], new MultiProgressTracker() ) );

以下示例显示了目录上传进MultiProgressTracker度的内置控制台输出示例:

控制台输出显示用于上传多个文件的多个进度条,底部有一个摘要进度条

最后一行列出了每个文件的进度以及摘要进度。

自定义进度跟踪

您可以实现自己的文件操作进度跟踪。创建一个扩展AbstractTransferListener接口的类,然后根据请求将其传递给方法。

以下实现以文本格式显示单个文件操作的进度信息:

<?php use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\AbstractTransferListener; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; class MyProgressTracker extends AbstractTransferListener { public function transferInitiated(array $context): void { $key = $context['request_args']['Key'] ?? 'unknown'; echo "Starting transfer of {$key}...\n"; } public function bytesTransferred(array $context): bool { $snapshot = $context['progress_snapshot']; $percent = round($snapshot->ratioTransferred() * 100, 2); $transferred = round($snapshot->getTransferredBytes() / 1024 / 1024, 2); $total = round($snapshot->getTotalBytes() / 1024 / 1024, 2); echo "Progress: {$percent}% ({$transferred}MB of {$total}MB)\n"; } public function transferComplete(array $context): void { $key = $context['request_args']['Key'] ?? 'unknown'; echo "Transfer complete for {$key}!\n"; } public function transferFail(array $context): void { $key = $context['request_args']['Key'] ?? 'unknown'; $reason = $context['reason']->getMessage(); echo "Transfer failed for {$key}: {$reason}\n"; } } $transferManager = new S3TransferManager( null, [] ); // Use your custom tracker. $uploadPromise = $transferManager->upload( new UploadRequest( '/path/to/file.txt', // Or an instance of StreamInterface. [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'file.txt', ], [], [], new MyProgressTracker() ) );

以下示例显示了正在进行的文件上传到控制台的示例输出:

Starting transfer of file.txt... Progress: 42% (16.8MB of 40MB)

自定义内置的进度跟踪器

您可以通过以下几种方式自定义进度跟踪:

  • 通过扩展AbstractTransferListener和实现来创建自定义实现ProgressTrackerInterface<add link>

  • 通过配置传递给内置跟踪器ConsoleProgressBar<add link>的,自定义现有实现。

  • 实现自定义ProgressBar<add link>并将其传递给内置跟踪器。

以下示例说明如何自定义进度跟踪。请参阅类图,了解 SDK 中进度跟踪组件之间的关系。

自定义 ConsoleProgressBar

自定义默认条形格式

以下示例自定义了默认的进度条格式,即ColoredTransferProgressBarFormat<add link>。此格式根据传输状态以不同的颜色显示进度。

示例发生了变化:

  • 从默认 “#” 到 “=” 的字符

  • 条形宽度从默认值 50 到 100

<?php use Aws\S3\S3Client; use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\ConsoleProgressBar; use Aws\S3\S3Transfer\Progress\SingleProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $progressBar = new ConsoleProgressBar( progressBarChar: '=', progressBarWidth: 100, // Default `ColoredTransferProgressBarFormat` is used. ); $progressTracker = new SingleProgressTracker( progressBar: $progressBar, ); $s3Client = new S3Client([ 'region' => 'us-east-2', ]); $s3TransferManager = new S3TransferManager($s3Client); $source = "/path/file.txt"; $result = $s3TransferManager->upload( new UploadRequest( source: $source, uploadRequestArgs: [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'key', ], progressTracker: $progressTracker, ) )->wait(); print_r($result);

下图显示了宽度为 100、字符为 “=” 的自定义内置ConsoleProgressBar组件的控制台输出:

控制台输出显示了使用等号的自定义进度条,宽度为 100 个字符

使用普通进度条格式进行自定义

以下示例使用PlainProgressBarFormat<add link>带有自定义字符和宽度的内置进度条来自定义默认进度条。PlainProgressBarFormat显示屏仅为黑色。颜色不会根据传输状态而改变。

示例发生了变化:

  • 从默认 “#” 到 “*” 的字符

  • 条形宽度从默认值 50 到 25

  • 默认progressBarFormat实例从ColoredTransferProgressBarFormatPlainProgressBarFormat

<?php use Aws\S3\S3Client; use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\ConsoleProgressBar; use Aws\S3\S3Transfer\Progress\PlainProgressBarFormat; use Aws\S3\S3Transfer\Progress\SingleProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; $progressBar = new ConsoleProgressBar( progressBarChar: '*', progressBarWidth: 25, progressBarFormat: new PlainProgressBarFormat(), ); $progressTracker = new SingleProgressTracker( progressBar: $progressBar, ); $s3Client = new S3Client([ 'region' => 'us-east-2', ]); $s3TransferManager = new S3TransferManager($s3Client); $source = "/path/file.txt"; $result = $s3TransferManager->upload( new UploadRequest( source: $source, uploadRequestArgs: [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'key', ], progressTracker: $progressTracker, ) )->wait(); print_r($result);

下图显示了ConsoleProgressBar使用宽度为 25、字符为 “*” 的纯进度条格式的自定义内置组件的控制台输出:

控制台输出显示一个使用星号的纯黑色进度条,宽度为 25 个字符

通过创建新的条形格式进行自定义

以下示例使用新的进度条格式(扩展 ProgressBarFormat<add link>)而不是自定义内置格式来自定义默认进度条。

<?php use Aws\S3\S3Client; use Aws\S3\S3Transfer\Models\UploadRequest; use Aws\S3\S3Transfer\Progress\ConsoleProgressBar; use Aws\S3\S3Transfer\Progress\ProgressBarFormat; use Aws\S3\S3Transfer\Progress\SingleProgressTracker; use Aws\S3\S3Transfer\S3TransferManager; require __DIR__ . '/../vendor/autoload.php'; // Implement a custom bar format. class PercentBarFormat extends ProgressBarFormat { public const FORMAT_TEMPLATE = "|object_name| - |percent|% [|transferred| |unit|ytes]"; public const FORMAT_PARAMETERS = [ 'object_name', // `uploadRequestArgs` Key parameter. 'percent', // Percent transferred. // 'progress_bar', Optional, if used, default is a `ConsoleProgressBar`. // 'to_be_transferred', Optional. 'transferred', // Default is bytes transferred. 'unit', // Default is 'B'. ]; public function getFormatTemplate(): string { return self::FORMAT_TEMPLATE; } public function getFormatParameters(): array { return self::FORMAT_PARAMETERS; } protected function getFormatDefaultParameterValues(): array { return []; } } // Create an instance of the custom implemention $progressBarFormat = new PercentBarFormat(); $progressBar = new ConsoleProgressBar( progressBarFormat: $progressBarFormat, ); $progressTracker = new SingleProgressTracker( progressBar: $progressBar, ); $s3Client = new S3Client([ 'region' => 'us-east-2', ]); $s3TransferManager = new S3TransferManager($s3Client); $source = "/path/file"; $result = $s3TransferManager->upload( new UploadRequest( source: $source, uploadRequestArgs: [ 'Bucket' => 'amzn-s3-demo-bucket', 'Key' => 'key', ], progressTracker: $progressTracker, ) )->wait(); print_r($result);

下图显示了ConsoleProgressBar使用自定义进度条格式的自定义内置组件的控制台输出:

控制台输出显示基于百分比的自定义进度格式,显示对象名称和传输的字节数

自定义条形格式接受多个参数:

  • object_name

  • 百分比

  • 进度条

  • 待转移

  • 已转移

  • unit

您可以组合分隔的(竖线字符)参数名称来自定义输出。该示例使用以下模板。该PercentBarFormat类的getFormatTemplate方法返回以下模板:

"|object_name| - |percent|% [|transferred| |unit|ytes]"