记忆对通过HTTP发送二进制文件的记忆影响,将PHP放入没有多部分/表单数据的情况下



我最近编写了一个代码,我发送了一个普通的put请求,该请求在请求正文中具有二进制文件的内容,并将Content-Type标头设置为MIME类型的所述文件。在服务器中,我只需在变量中读取原始请求主体即可使用一些验证:大小(使用strlen)和MIME类型(使用finfo->buffer),然后将内容复制到文件(使用file_put_contents)。

上传文件的通常(或流行)的方法是使用multipart/form-data编码,该编码将通过PHP自动处理。在这种情况下,PHP会在临时文件中写入内容,我相信该文件存在于存储设备而不是内存中。

现在,我在https://github.com/php/php/php-src/blob/master/maint/main/rfc1867.c中浏览了代码,它似乎还是将请求主体放在记忆中。

我的问题是:

0)php是否将完整的请求主体存储在内存中(至少一次),无论 enctype是否得到?

1)与使用PHP的内部multipart/form-data处理机制上传文件相比,将所有原始主体并将其写入文件(使用file_put_contents)使用更多的内存?

1a)PHP的复制机制在这里对我有帮助吗?也就是说,当我将原始身体内容存储在某些变量(而不是文件)中时,我是否会分配新的内存块?或者我只是指向内存上已经存在的请求数据(如果有)?

2)如果我在做什么影响记忆,您是否有任何不涉及使用multipart/form-data的改进建议?

ps:我不需要用文件发送其他任何内容(例如,元数据),也不需要在一个请求中发送多个文件。

pps:对不起,如果我的帖子难以理解,我很乐意提供其他详细信息,如果有任何东西似乎令人困惑或不完整。

编辑

  • 添加了问题0。
  • 稍微修改的问题,希望使它变得不那么混乱。

1)是否获取所有原始主体并将其写入文件(使用file_put_contents会让我使用更多的内存,而不是让PHP处理它?

是的,吨。仅使用file_put_contents(),您就需要在编写它之前内存完整的数据。它是为了更多地用于小文件等实用程序。

1a)PHP的复制机制在这里对我有帮助吗?也就是说,当我将原始身体内容存储在某些变量(而不是文件)中时,我是在分配新的内存块吗?

我不熟悉您所指的内容,但是,是的,如果您将身体内容存储在变量中,则它的副本坐在内存中。

2)如果我要做的事情会影响内存,您是否有任何不涉及使用Multipart/form-data的改进建议?

是!查看php://input流。这将允许您访问原始的帖子主体。

http://php.net/manual/en/wrappers.php.php.php#wrappers.php.input

最新更新