Во второй версии AWS PHP SDK я смог настроить ведение журнала информации о запросах и ответах, просто выполнив следующие действия:
<?php
use Monolog\Logger;
use Guzzle\Log\MonologLogAdapter;
use Guzzle\Plugin\Log\LogPlugin;
use Aws\S3\S3Client;
$monolog = new Logger('main');
$monolog_adapter = new MonologLogAdapter($monolog);
$log_plugin = new LogPlugin($monolog_adapter);
$s3_client = S3Client::factory(['region' => 'us-east-1']);
$s3_client->addSubscriber($log_plugin);
var_dump($s3_client->doesObjectExist('my-bucket', 'object-that-doesnt-exist'));
# This is the log entry I want in the v3 version:
# [2015-10-30 14:47:20] main.ERROR: myhostname aws-sdk-php2/2.8.20 Guzzle/3.9.3 curl/7.43.0 PHP/5.5.23 - [2015-10-30T14:47:20+00:00] "HEAD /my-bucket/object-that-doesnt-exist HTTP/1.1" 404 ...
# bool(false)
В v3 я не могу найти решение. Промежуточные программы не кажутся полезными, поскольку они срабатывают только до отправки запроса, и поэтому я не могу получить доступ к HTTP-коду ответа.
В Guzzle v6 эта функция встроена в ПО промежуточного слоя, но я не знаю, как заставить ее работать с aws-php-sdk. https://github.com/guzzle/guzzle/blob/master/src/Middleware.php#L180
Самое близкое, что я получил, было это:
<?php
use Monolog\Logger;
use GuzzleHttp\MessageFormatter;
use GuzzleHttp\Middleware;
use GuzzleHttp\HandlerStack;
use Aws\S3\S3Client;
$monolog = new Logger('main');
$guzzle_formatter = new MessageFormatter(MessageFormatter::CLF);
$guzzle_log_middleware = Middleware::log($monolog, $guzzle_formatter);
$guzzle_stack = HandlerStack::create();
$guzzle_stack->push($guzzle_log_middleware);
$s3_client = new S3Client([
'region' => 'us-east-1',
'version' => '2006-03-01',
'http_handler' => $guzzle_stack,
]);
var_dump($s3_client->doesObjectExist('my-bucket', 'object-that-doesnt-exist'));
# [2015-10-30 15:10:12] main.INFO: myhostname aws-sdk-php/3.9.2 - [30/Oct/2015:15:10:12 +0000] "HEAD /my-bucket/object-that-doesnt-exist HTTP/1.1" 404 [] []
# bool(true)
Однако, несмотря на то, что ведение журнала работает, функция doObjectExist() теперь возвращает неверное значение, поскольку этот обработчик не генерирует исключение для 404, которое ожидает aws-php-sdk. Некоторые другие простые запросы, такие как загрузка на S3, на первый взгляд, работали. Не уверен, где еще могут быть проблемы с этим методом.