问题标签 [stream-wrapper]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1391 浏览

php - 使用自定义流包装器作为 PHP 的 http:// 流包装器的测试存根

我正在编写一个自定义流包装器,以用作使用内置http://流包装器的 HTTP 客户端类的单元测试中的存根。

具体来说,我需要'wrapper_data'通过调用stream_get_meta_data自定义流包装器创建的流来控制键中返回的值。不幸的是,关于自定义流包装器的文档很糟糕,而且 API 似乎不直观。

自定义包装器中的什么方法控制元wrapper_data响应?

var_dump(stream_get_meta_data($stream));使用底部的类,当我在使用自定义包装器创建的流上时,我只能得到以下结果......

但是我需要诱使包装器在元数据检索中产生类似以下内容,以便我可以测试客户端类对真实http://流包装器返回的数据的解析......

这是我目前用于自定义包装器的代码:

0 投票
2 回答
1600 浏览

php - 带有包含或评估的自定义流包装器?

概述

我目前正在编写模板引擎。它甚至支持多种“格式”。目前它可以解析.php文件和.tpl(特定于这个引擎)。

我会给你一个两者的小例子,只是为了给你一个想法。

模板.php:

这基本上只是一个标准的 PHP。

模板.tpl

这种模板“语言”简单地被翻译成上面的 PHP。

比较

评估()

目前这些模板是使用eval().

  • 我不必更改任何代码

魂斗罗

  • 当模板中发生错误时,您只会收到一条无用的错误消息,它不会告诉您错误发生在哪个文件中,有时行号甚至是错误的。
  • 安全?模板文件只需要可读吗?
  • 很难调试代码。
  • 代码更难理解
  • 更多的 .. ?

流包装器和 include()

我最近阅读了 php 中的流包装器。你甚至可以创建自己的。另一个解决方案eval是为每个模板“格式”创建自定义流包装器并使用 include 来解析模板。

这有以下(潜在的)缺陷:

  • 可以解决在错误消息中显示错误文件/行号的问题(有没有人遇到过这个问题?)
  • 您可以完全按照希望处理的方式处理模板文件。完全控制。

魂斗罗

  • allow_url_(fopen|include)必须开启?
  • 它很慢吗?(也很eval()慢?)
  • 在安全方面没有收获。include 与 eval 的作用基本相同。
  • 更多的 ... ?

编辑:缓存的解析文件和 include()

第三种选择是将模板解析为 PHP 代码并缓存它们(如 @Jen-YaKovalev 所建议的那样)。

  • 包括缓存

魂斗罗

  • 如果在包含渲染模板时发生错误并且发生错误,则错误消息不会将您指向正确的文件/最终会显示错误的行号。
  • 您需要一个额外的tmp/目录来保存已解析的文件。您需要 PHP/webserver 的写入权限。会更不安全,因为黑客会更容易附加一些恶意代码。

编辑:流过滤器和包含('php://filter')

最近发现了以下 php.net 页面:

这将是解决此问题的另一种可能性。使用include('php://filter/read=filtername/resource=file.php'),我可以包含一个filtername在执行之前首先通过过滤器的文件。

  • 不需要像流包装器那么多的代码

魂斗罗

  • 不像流包装器(缓存?)
  • 安全?
  • 速度?

问题

  • 有使用流包装器解析模板文件或类似文件的经验吗?
  • 还有其他解决方案吗?
  • 有更多的专业人士和反对者吗?
  • 你会推荐哪一个?
0 投票
0 回答
415 浏览

php - PHP Stream Wrapper 元数据

Hello, world!

我需要能够将信息从自定义流包装器传递到使用它的代码,但我一直遇到一些麻烦。最好的选择似乎是使用stream_get_meta_data(),但我无法在文档中找到允许我设置包装器特定wrapper_data数据的方法。

解决这个问题的最佳方法是什么?

0 投票
1 回答
1991 浏览

php - 使用流包装器遍历 S3 存储桶

我正在尝试列出我的 Amazon S3 存储桶中的所有项目。我有几个嵌套目录。

  • 目录1/
  • 目录1/子目录1/
  • 目录1/子目录2/
  • 目录1/子目录3/
  • 目录2/
  • 目录2/子目录1/
  • 目录2/子目录2/
  • ...

每个子目录包含几个文件。我需要用这个文件结构得到一个嵌套数组。

我正在使用适用于 PHP 2.4.2 的 Amazon AWS 开发工具包

这是我的代码:

但是,结果仅列出存储桶中的文件,而不列出目录/子目录(带前缀的文件)或目录本身中的文件。

如果我遍历,($dir.'/folder')则根本没有结果。

IIRecursiveIteratorIterator::SELF_FIRST作为第二个参数传递给迭代器的构造函数,我只得到第一级目录——没有子目录。

如何使用 AWS 流包装器和 PHP RecursiveIterator 列出存储桶中所有目录中的所有文件?

我希望有一个人可以帮助我。

谢谢!

0 投票
1 回答
686 浏览

php - PHP中的Amazon S3 StreamWrapper fread问题

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

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

0 投票
1 回答
1083 浏览

php - PHPUnit stream_wrapper_register(): 协议 var:// 已经定义

我有一个曾经运行良好的测试套件。它基于 FWOpenCartTest,它是 PHPUnit_Framework_TestCase 的一个大后代,实现了一个 MVC 框架(基于 OpenCart)。

今天我不得不向这样的后代添加一个实例化另一个类的调用,该类在内部分配一个 var 流,如下所示:

从那以后,我无法运行任何测试,因为我不断收到 PHPUnit 转储,例如:

这是导致错误的小测试:

我要问的是:这是 PHPUnit 和测试用例类 FWOpenCartTest 之间的交互吗?

完成的应用程序可以工作,如果我不使用 PHPUnit 而只是创建一个包装器来实例化测试它也可以工作。

如果有交互,有没有办法隐藏 stream_wrapper_register() 以便 FWOpenCartTest 的构造函数不会发现它已经分配?

0 投票
1 回答
1244 浏览

c# - Composite Stream Wrapper 提供部分 MemoryStream 和完整的原始 Stream

有谁知道一种复合流解决方案,它将预加载 Stream 的第一部分到 MemoryStream 中,并将其余部分保留为原始 Stream ,当需要后续部分时将访问该原始 Stream ?

我应该想象一些包装类将实现 Stream 接口,并根据访问的部分透明地处理两个流之间的访问。

我希望这是以前有人可能已经解决的解决方案,也许是为了优化读取大型 FileStream 的性能。

就我而言,我正在尝试解决从 SD 卡读取大文件的 Windows Phone 8 错误。此答案中提供了我试图解决的问题的更多详细信息: https ://stackoverflow.com/a/17355068/250254

0 投票
0 回答
166 浏览

php - stream wrapper and writing to php://memory results in internal server error 500

I'm trying to write a custom wrapper in PHP using the Stream Wrapper class. What I have now is pretty much simple and straight forward.

In the beginning of my code I open the stream by calling: Stream::wrap().

Then it basically reads any file that is require'ed or include'ed throughout my application. The code is then put into php://memory and that's it. Nothing special yet.

Bottom line is, is that this piece of code should work. But it throws an Internal Server Error when I try to run my application. I have a Linux hosting provider (PHP 5.4.21) where my code is currently hosted.

But when I move my code from my current hoster to some other Linux hosting company (PHP 5.5.x), then everything works fine.

When I even move the code to my local computer (PHP 5.4.6) and run it, then everything works fine as well.

So obviously the problem lies at the hosting company that I currently have. I know I have to mail them. But I have no clue what is causing the problem exactly. It would be good if I could at least point them in a certain direction. All I have now is

my code isn't working on your servers which is working fine on some other server

I'm afraind that that isn't enough information for them.

I have checked the php://memory limit which is set to 256M. That should be more than enough. So I have no clue what else to look for. The Apache log didn't had any information either.

So I was hoping anyone here had an idea of what could be causing this problem. Perhaps some permission issue somewhere or something?

0 投票
0 回答
392 浏览

amazon-s3 - 流式 mPDF 输出以供下载

这更像是一个概念性问题,但我想知道是否可以在下载时将 mPDF 的输出直接流式传输给用户(例如,无需保存在服务器上的临时文件夹中或加载到用户的浏览器中)。

我正在使用类似的方法成功地使用ZipStreamAWS PHP S3 Stream Wrapper下载 S3 照片的 zip 文件,效果非常好,所以我想为我的 PDF 生成采用类似的方法。

我使用mPDF库在 Heroku 上生成具有 S3 图像的报告。mPDF 文档显示了四个输出选项,包括inlinedownload; inline将其直接加载到用户的浏览器中并download强制下载提示(期望的行为)。

我已经在每个 mPDF Image() 文档的 PDF 中启用了 S3 Stream Wrapper 和嵌入图像,如下所示:

我还添加了header('X-Accel-Buffering: no');使 ZipStream 在 Heroku 环境中工作所需的内容,但如果有多个图像,脚本总是会超时。

是否可以立即提示下载并将数据流直接提供给用户?我希望这种方法不仅可以用于 zip 下载,而且还不能用于这个特定的应用程序。