问题标签 [php-stream-wrappers]

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 回答
2123 浏览

php - Twitter 不记名访问令牌请求在两台服务器上的行为不同

我必须为 twitter 提要实现 oAuth2 不记名访问令牌方法。我正确遵循了 twitter 开发者网站上的详细信息,但我不断收到“无法验证您的凭据 twitter”...

如果我将凭据复制到我的开发服务器(5.3.10 机器),我实际上可以登录、获取令牌、检索推文,但在另一个客户端的服务器(5.2.17 机器)上,我无法让它与完全相同的代码。

下面的代码中有什么让您印象深刻的关于 PHP 差异的地方吗?我相信它一定与 file_get_content https 流包装器选项有关,但我在文档中找不到任何关于它的内容。(Openssl 支持安装在客户端服务器上)

编辑#1

我事先确认两台服务器上的所有变量都是相同的,我已经输出并比较了它们。只有 file_get_contents 返回不同的结果。

另外,我尝试将在 5.3 服务器上获得的不记名访问令牌复制到 5.2 服务器,并且值仍然匹配,但我不断收到有关无效身份验证的错误...

编辑#2

更多信息,它似乎与我发送的标头没有任何关系,我几乎添加了所有标头,除了那些与我不相关的标头,例如代理标头。它与 PHP 是 5.2 或 5.3 没有任何关系,在我们的登台服务器主机上测试并切换到 5.2 并且仍然可以工作......

0 投票
1 回答
221 浏览

php - 找不到什么样的 CURL 发布请求

我收到了以下需要发布到服务器的数据 在此处输入图像描述

而且我不知道我到底需要如何在 PHP 中做到这一点。我需要发送数字,但我看不到他们要求我发送它的任何参数。有什么想法可以发送这些数据吗?

0 投票
2 回答
10004 浏览

php - php stream_get_contents 挂在流的末尾

问题结束时的解决方案

我正在编写一个 PHP 应用程序,它向服务器发送消息,然后使用stream_get_contents. 我以相同的方式与 android 应用程序中的同一台服务器通信。android 应用程序工作正常并且响应迅速,但是当从服务器读取响应时 PHP 挂起。

在下面的代码示例中,我设置了一个 5 字节的微小缓冲区大小来测试一个理论。如果我删除此缓冲区大小,它会挂起,但是对于 5 字节大小,它只会在最后一次通过循环时挂起:

输出如下:

如您所见,最后两行之间有 10 秒的延迟,但其他行之间没有明显的延迟。

另外,为了您的信息,我使用 ETX 标记 (3) 来表示消息的结束,所以如果我点击它,我也会停止,而不仅仅是流的结束。

难道我做错了什么?有没有更好的方法来做到这一点?

提前致谢...

编辑:为了清楚起见,上面的代码只需要一个消息响应。它不关心收到 ETX 字节后返回的任何数据。

Edit2:现在已经看到挂起长达 40 秒。它似乎没有固定为 10 秒,但奇怪的是,每次似乎都是不错的整数。

解决方案(感谢chathux)

stream_get_contents($stream, $bytes)将阻塞,直到它接收到$bytes字节或超时到期。这意味着我的代码即将结束并尝试读取 5 个字节(不存在),因此它在放弃之前等待了 10 秒。

我知道返回给我的消息的最小大小是 49 个字节,我首先读取这 49 个字节(阻塞直到我得到它们或 10s 过期)以填充stream_get_meta_data'sunread_bytes字段。一旦我有了这个,我会动态调整缓冲区大小,min(16*1024, unread_bytes)以便我一次读取 16k 或所有剩余字节,以较小者为准。在我的情况下,这通常只意味着两个通过循环,因为消息通常很小(49 字节 + 有效负载)。

系统现在挂起大约 3 秒而不是 10 秒,但它挂起等待最初的几个字节到达(而不是最后),这可以归结为网络延迟和其他正常因素。

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 回答
377 浏览

php - 将视频流字节字节发送到客户端

我有一个问题。

想象一下,视频文件位于名为A的服务器中。

使用 php 脚本(位于名为“B”的服务器中)我们可以获得视频流(从服务器“A”到服务器“B”)。重要的是只有B服务器无法获取视频流。禁止其他服务器使用。

问题:有很多客户端,他们想从名为“A”的服务器下载视频。

只有一种解决方案: 视频文件必须通过服务器“B”下载。你能告诉我,我该怎么做?

例如,让我们获取 youtube 视频。我将他的脚本上传到我的服务器“B”。此脚本将视频下载到服务器,但是如何通过服务器(通过服务器 B)将视频流发送到客户端?我需要将视频逐字节发送到客户端,我不想将视频保存到服务器,我想逐字节发送到客户端。当服务器下载100字节时,它应该将它保存在内存中,并发送给客户端,然后再次下载并保存到服务器内存并发送给客户端......像这样......

对于“发送到客户端”,我的意思是 - 打开客户端浏览器的“另存为对话框”

0 投票
2 回答
1135 浏览

php - PHP fread catch 流超时发生

我使用 PHP 函数 fread 从打开的流中读取数据

我设置了流的超时时间

如果在 fread 执行期间发生超时,那么我能以某种方式知道这一点吗?

如果发生超时,那么 $contents 将等于空字符串还是 FALSE ?如何知道发生了超时?有办法吗?

0 投票
2 回答
1876 浏览

php - 如何在 PHP 中限制文件系统访问?

有人知道让 PHP 脚本自我限制访问文件系统(等)的技巧fopenfile_get_contents

除了少数选定的文件名(日志文件、访问权限等)外,应阻止此类调用/tmp

不是安全问题,而是迫使开发团队直接访问文件系统的一种手段(并检测现有代码中的点,这已经是这种情况了)。我们希望在这种情况下看到异常(被捕获并报告),因为必须通过其他方式访问此类文件的内容。

我正在考虑为协议实现我自己的streamWrapperfile://,但显然没有办法扩展内置的 filewrapper 类。

0 投票
2 回答
3308 浏览

php - 什么是水桶旅?

我真的很想实现一个php_user_filter::filter(). 但是因此我必须知道什么是水桶旅。这似乎是我可以使用这些stream_bucket_*功能操作的资源。但是文档并没有真正的帮助。我能找到的最好的例子是stream_filter_register().

我特别好奇这些stream_bucket_new()stream_bucket_make_writeable()能做什么。


更新:似乎 PHP 暴露了Apache 的内部数据结构

0 投票
1 回答
449 浏览

php - 如何获取和管理 DB 的流资源?PHP-DB2

我用 DB2、PHP 和 Yii 框架管理 CLOB 和 BLOB 类型(虽然我只使用 php)。我要上传文件到 DB2。具有 CLOB 和 BLOB 类型。但是我有一个问题,我无法下载文件。我使用以下代码获取资源流类型:

我需要将此流转换为文件以在网络中下载。

我试过了:print_r( stream_get_contents($model->file_content));

并使用fread()

是否有任何 php 函数来获取流类型?

编辑:类型是“ibm PDO Lob流”,它得到stream_get_meta_data($model->file_content);

另外,我试过:

但结果是我的页面的 html 文件。

你能帮助我吗?谢谢

0 投票
1 回答
726 浏览

php - PHP fopen() 和 php://memory 未按预期工作(数据丢失)

我目前正在尝试集成一个使用fopen()php://memory来捕获 Curl 标头的类。总是有更好的方法来捕获 Curl 标头,但我现在没有足够的时间编写自己的类。

问题是没有捕获标头信息。代码如下:

此时,Curl 请求后,$ch->raw_response_headers属性为空。但是,如果我指定一个文件路径:

属性$ch->raw_response_headers设置正确...

我们的 PHP 版本是:

有点懵...