我正在编写一个使用php来包装网站功能并在json \ xml中返回所有内容的API。我一直在使用卷曲,到目前为止效果很好。 该网站有一个标准的文件上传帖子,接受文件高达1GB。PHP重定向文件发布流
所以问题是如何将文件上传流重定向到通讯网站?
我可以下载文件,然后上传它,但我的服务器仅限于20MG。这似乎是一个糟糕的解决方案。
它甚至可以控制流并将其直接重定向到网站?
我正在编写一个使用php来包装网站功能并在json \ xml中返回所有内容的API。我一直在使用卷曲,到目前为止效果很好。 该网站有一个标准的文件上传帖子,接受文件高达1GB。PHP重定向文件发布流
所以问题是如何将文件上传流重定向到通讯网站?
我可以下载文件,然后上传它,但我的服务器仅限于20MG。这似乎是一个糟糕的解决方案。
它甚至可以控制流并将其直接重定向到网站?
我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.py
和index.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中还有其他选择,约。)
好吧,但我有点限于PHP。使用流,可以使用php://输入吗?资料来源:http://php.net/manual/en/wrappers.php.php – LuisFonseca
其实,你可能已经得到了我;)。 'php:// temp'看起来很有前途,如果它允许在超全局初始化之前执行逻辑。可以将它与'exec()'结合起来使之成为可能。我现在要做一个概念验证。 – DeaconDesperado
'php:// input'不可用于''multipart/form-data'的enctype。也许'临时'是? – DeaconDesperado