S3で複数のS3オブジェクトを指定して一括で削除できるようになりましたので、早速PHPのSDKで試してみました。

delete_objectsというメソッドが追加されていますので、これを利用します。
また、対象のバケットには以下のようにファイルがあります。

ここで、以下のようなプログラムでvp_sample.csvとwelcome.txtを削除するコードを書きます。

$ vi bulk_delete.php
-------------------------------------------
#!/usr/bin/php -q
set_region(AmazonS3::REGION_APAC_NE1);

$response = $s3->delete_objects ($bucket, array(
        'objects' => array(
                array('key' => 'vp_sample.csv'),
                array('key' => 'welcome.txt')
        )
));
echo "done."
?>

これをを実行します。

$ php bulk_delete.php
PHP Notice:  Undefined property: AmazonS3::$multi_object_delete_xml in /opt/aws/php/sdk-1.4.8/services/s3.class.php on line 1406
PHP Fatal error:  Uncaught exception 'Exception' with message 'String could not be parsed as XML' in /opt/aws/php/sdk-1.4.8/services/s3.class.php:1406
Stack trace:
#0 /opt/aws/php/sdk-1.4.8/services/s3.class.php(1406): SimpleXMLElement->__construct('')
#1 /opt/cloudpack/test/bulk_delete.php(21): AmazonS3->delete_objects('hoge-bucket', Array)
#2 {main}
  thrown in /opt/aws/php/sdk-1.4.8/services/s3.class.php on line 1406

そうすると、上記のようなエラーになりました。

/sdk-1.4.8/services/s3.class.php を調べてみると、delete_objectsメソッド内で
SimpleXMLObjectの初期化に失敗しているようです。

1406行目の

$xml = new SimpleXMLElement($this->multi_object_delete_xml);

ここで、初期化の引数に渡している下記のファイルがどこにも存在していないことが原因のようです。
SDKのバグのようなので、これを直してみます。

$this->multi_object_delete_xml

ここで、まず238行目あたりに、下記のようにクラスのプロパティを追加します

public $multi_object_delete_xml;

さらに238行目あたりの__construct内で、他のXMLのタグ文字列の初期化と同じく、以下のように初期化します。

$this->multi_object_delete_xml = '';

これで、再度実行してみます。

$ php bulk_delete.php
done.

無事、成功しましたので、実際削除されたのか確認します。

削除されていました。

この修正パッチをAWSのフォーラムにアップしましたので、必要な方は自己責任でご利用ください。
またパッチ内容に問題があればご一報いただけると助かります。

Bug: PHP SDK 1.4.8 Multi Object Delete (patch)

こちらの記事はなかの人(memorycraft)監修のもと掲載しています。
元記事は、