我正在使用适用于 PHP 的 AWS 2.3.2 SDK 尝试使用他们的流包装器从 S3 拉下一个大文件(~4g),这应该允许我使用 fopen / fwrite 将文件写入磁盘而不是缓冲到记忆。
这是参考:
http://docs.aws.amazon.com/aws-sdk-php-2/guide/latest/service-s3.html#downloading-data
这是我的代码:
public function download()
{
$client = S3Client::factory(array(
'key' => getenv('S3_KEY'),
'secret' => getenv('S3_SECRET')
));
$bucket = getenv('S3_BUCKET');
$client->registerStreamWrapper();
try {
error_log("calling download");
// Open a stream in read-only mode
if ($stream = fopen('s3://'.$bucket.'/tmp/'.$this->getOwner()->filename, 'r')) {
// While the stream is still open
if (($fp = @fopen($this->getOwner()->path . '/' . $this->getOwner()->filename, 'w')) !== false){
while (!feof($stream)) {
// Read 1024 bytes from the stream
fwrite($fp, fread($stream, 1024));
}
fclose($fp);
}
// Be sure to close the stream resource when you're done with it
fclose($stream);
}
文件下载,但我不断从 Heroku 收到错误消息:
2013-08-22T19:57:59.537740+00:00 heroku[run.9336]: 进程运行 mem=515M(100.6%) 2013-08-22T19:57:59.537972+00:00 heroku[run.9336]: 错误R14(超出内存配额)
这让我相信这仍然以某种方式缓冲到内存中。我尝试使用https://github.com/arnaud-lb/php-memory-profiler,但出现 Seg Fault。
我还尝试使用带有 CURLOPT_FILE 选项的 cURL 下载文件以直接写入磁盘,但我仍然内存不足。奇怪的是,根据top
我的 php 实例正在使用 223m 的内存,所以甚至没有允许的 512 的一半。
有人有什么想法吗?我从 php 5.4.17 cli 运行它来测试。