2012-06-28 120 views
1

我正在编写一个使用php来包装网站功能并在json \ xml中返回所有内容的API。我一直在使用卷曲,到目前为止效果很好。 该网站有一个标准的文件上传帖子,接受文件高达1GB。PHP重定向文件发布流

所以问题是如何将文件上传流重定向到通讯网站?

我可以下载文件,然后上传它,但我的服务器仅限于20MG。这似乎是一个糟糕的解决方案。

它甚至可以控制流并将其直接重定向到网站?

回答

2

我preserverd底部为后人原始,但事实证明,是有办法做到这一点

你需要使用什么是HTTP PUT方法的组合(这不幸的是,不以原生浏览器形式提供),PHP php://input包装器和流式PHP Socket。这会产生一些限制 - PHP不允许php://input用于发布数据,但它对于PUT filedata没有任何帮助 - 聪明!

如果你打算用apache来尝试这个,你将需要安装一个激活的mod_actions。您还需要在虚拟主机/ .htaccess中指定PUT脚本和Script指令。

http://blog.haraldkraft.de/2009/08/invalid-command-script-in-apache-configuration/

这使得put方法只对一个URL端点。这是打开套接字并将数据转发到别处的文件。在我的示例下面,这只是index.php

我已经准备了使用python requests模块作为发送放置请求与图像文件的客户端的样板示例。如果您运行remote_server.py它将打开一个服务,只监听端口并等待来自php的转发消息。 put.py将实际放入请求发送给PHP。根据您的设置,您需要将主机put.pyindex.php设置为您在虚拟主机中定义的主机。

运行put.py将打开包含的图像文件,将其发送到您的PHP虚拟主机,它将打开一个套接字并将接收到的数据流式传输到python伪服务并将其打印到终端中的stdout。流式PHP转发器!

没有什么能够阻止你使用任何远程服务,在另一种语言中以同样的方式监听TCP端口。客户端可以用相同的方式重写,只要它可以发送PUT请求即可。

完整的例子是在这里:

https://github.com/DeaconDesperado/php-streamer

其实我有很多的乐趣与这个问题。请让我知道它是如何工作的,我们可以将它修补到一起。

开始原来的答案

PHP中没有原生的方法,可以异步传递一个文件,因为它与请求主体进来,而无需关闭保存其状态到光盘上以某种方式。这意味着你很难受到服务器内存限制(20MB)的限制。在其上接收该请求后的$_FILES超全局初始化的方式取决于此,因为它会尝试在multipart数据迁移到tmp目录。

类似的东西可以使用套接字来实现,因为它至少会绕过HTTP协议,但如果文件在HTTP请求中传递,php仍然会尝试在它之前将其有状态地保存在内存中用它做任何事情。如果没有切实可行的办法,你就会设置这个过程的最后一步。

有一个Stream库接近,但仍然依赖于在服务器端读取内存不足 - 它必须在那里是

你所描述的是一点点的HTTP协议之外,特别是因为请求体太大了。 HTTP是基于请求/响应的机制,一个依赖于另一个......在中间点完成就地流式上传非常困难,因为这意味着某些协议会上传,而这些协议会在

有人可能会认为这比HTTP更受限于HTTP,并且由于PHP是根据HTTP协议设计的,因此您正在其舒适区之外移动。

像这样的部署经常会尝试使用其他脚本语言取得高成功(例如,Python中的Twisted,很多人在NodeJS中使用其并发设计模式,在Ruby或Java中还有其他选择,约。)

+0

好吧,但我有点限于PHP。使用流,可以使用php://输入吗?资料来源:http://php.net/manual/en/wrappers.php.php – LuisFonseca

+0

其实,你可能已经得到了我;)。 'php:// temp'看起来很有前途,如果它允许在超全局初始化之前执行逻辑。可以将它与'exec()'结合起来使之成为可能。我现在要做一个概念验证。 – DeaconDesperado

+0

'php:// input'不可用于''multipart/form-data'的enctype。也许'临时'是? – DeaconDesperado