多くの画像を S3 バケットにアップロードしようとしています。速度を念頭に置いて、データをメモリに保持することで、ディスクの読み取りと書き込みの回数を減らしたいと考えています。この目的のために、次のスキームを考え出しました。
//fetch binary image data from remote URL
$contents = file_get_contents("http://somesite.com/image.jpg");
//trim the image as per: http://stackoverflow.com/a/15104071/568884
$out = shell_exec('echo ' . base64_encode($contents) . " | base64 -d | convert - -fuzz 10% -trim jpeg:-");
//create a temporary resource to pass to S3's inputResource() method.
$resource = fopen('php://temp', 'r+');
//write the binary data into the empty resource.
fwrite($resource, $out);
//pass the resource and length of binary data into inputResource()
$ir = $this->s3->inputResource($resource, strlen($out));
//finally transfer the resource from machine to S3.
$this->s3->putObject($ir, $bucket, $s3_path, S3::ACL_PUBLIC_READ);
エラーは次のとおりです: S3::putObject(): [RequestTimeout] サーバーへのソケット接続は、タイムアウト期間内に読み書きされませんでした。アイドル状態の接続は閉じられ、データは S3 に書き込まれません。
$out の割り当てを単に空の文字列に置き換えると$out = "";
、ライブラリは期待どおりに 0 バイトのファイルを S3 に正常に書き込みます。
私はCodeIgniter S3ライブラリを使用しています...これはAWS S3 API afaikの単なるラッパーです。