【问题标题】:Amazon S3 StreamWrapper fread Issue In PHPPHP中的Amazon S3 StreamWrapper fread问题
【发布时间】:2013-11-10 16:51:24
【问题描述】:

我正在使用 amazon s3 API 并将客户端设置为流式读取。使用 file_get_contents("s3://{bucket}/{key}") 对我来说工作正常,它读取文件的完整数据(我在本地系统上使用视频文件和测试)。但是,我正在尝试优化脚本使用的内存,因此尝试按块读取和返回数据,如下所示:

$stream = @fopen("s3://{bucket}/{key}", 'r');
$buffer = 1024;
while(!feof($stream)) {
            echo  @fread($stream, $buffer);
            flush();
        }

这不适用于我的本地系统。我只是想知道使用这种技术可能会出现什么问题。通过搜索,我发现这也是一个非常广泛使用的技术。因此,如果有人可以就此处可能出现的问题或任何其他方法提出任何建议,我应该尝试一下,这将非常有帮助。谢谢。

【问题讨论】:

  • 首先去掉@,这样你就会看到显示的任何错误
  • 但是如果您对文件所做的所有操作都是将其直接后台打印到浏览器,那么readfile() 可能是一个更好的功能
  • 是的,我知道。但是,我也必须将缓冲区写入其他地方。这就是为什么我使用手动阅读而不是使用“readfile”
  • 只是为了检查一下,我尝试使用 readfile,有趣的是,它也不起作用。但是,如果我为文件的本地版本提供路径,所有三种方式都可以正常工作。但是当它试图从 s3 中检索时,只有 'file_get_contents' 有效,其他两种方式无效。只是想知道,这是否与我正在从本地系统尝试的事实有关。如果我尝试使用 ec2 服务器实例,它可能会起作用吗?你觉得是吗?
  • 如果您看到删除了标头的二进制数据,则表明问题出在您的标头上,而不是来自 S3 的文件访问

标签: php amazon-web-services amazon-s3 stream-wrapper


【解决方案1】:

好的,终于找到解决方案了。不知何故,一些其他输出被添加到缓冲区。我不得不说:

ob_get_clean();
header('Content-Type: video/quicktime');

以这种方式清除任何添加的东西。现在它工作正常。

感谢 Mark Ba​​ker 在调试过程中提供的宝贵支持。

【讨论】:

猜你喜欢
  • 2016-09-04
  • 1970-01-01
  • 2017-04-20
  • 2017-12-30
  • 1970-01-01
  • 2012-02-28
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
相关资源
最近更新 更多