我正在使用Amazon S3的PHP SDK将巨大的压缩文件上传到存储桶中。
$s3 = S3Client::factory(array(
...
));
$uploader = new MultipartUploader($s3, $file, array(
'bucket' => $bucket,
'key' => $filebase
));
$result = $uploader->upload();
但是,这会占用很高的CPU,导致我的网站在这些时候变慢。
我有什么方法可以使用某种" ionice"或控制上传速率,这样它对用户的性能没有影响?
答案 0 :(得分:0)
AWS提供流包装器,您可以使用S3 Client注册它。流包装器以块的形式发送数据,您还可以控制块大小。
// Register the stream wrapper from an S3Client object
$client->registerStreamWrapper();
您可以使用fopen()和“w”,“x”或“a”流访问模式通过流数据上传较大的文件。 Amazon S3流包装器不支持同时读取和写入流(例如“r +”,“w +”等)。这是因为HTTP协议不允许同时读写。
$read = fopen('<YOUR FILE>', 'r');
$stream = fopen('s3://bucket/key', 'w');
while (!feof($read)) {
// Read 1024 bytes from the stream
$content = fread($read, 1024);
fwrite($stream, $content);
}
fclose($read);
fclose($stream);
可能还有一些其他预先构建的PHP程序包可以上传到S3。我只能想到Flysystem。
提供了AWS Stream Wrapper的完整文档Here.
答案 1 :(得分:0)
看起来MultipartUploader做了大量工作并消耗了大量资源(CPU,网络)。如果需要/期望上传功能,我会考虑将其移至 spot实例。它们很便宜,专为这类工作而设计(旋转,做一些繁重的工作,终止)。
答案 2 :(得分:-1)
您可以尝试在sleep($seconds);
中使用上传脚本。然后将其设置为间隔睡眠。这样,脚本将需要更长的时间。特别是大文件。