微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么PHP将上传的文件存储在临时位置,有什么好处?

好吧,我在这个领域是全新的,并通过一些教程,我发现在PHP上传文件时,它将它们存储在一个临时位置.

$file_temp=$_FILES['file']['tmp_name'];
$file_loc="Upload".$file_name;
move_uploaded_files($file_temp,$file_loc);

现在为什么PHP不允许直接将文件上传到所需的位置?为什么它们存储在扩展名为.tmp的临时位置,我们从这个策略中获得了什么好处?

解决方法:

好问题.简短的回答是,在控制脚本之前,PHP必须处理整个HTTP请求 – 用数据填写$_POST,并根据需要填写$_FILES.由于您的脚本在处理之后才获得控制权,因此无法告诉PHP文件数据放在何处.

但是为什么PHP这样做呢?好吧,让我们来看看HTTP POST with file data

POST /upload?upload_progress_id=12344 HTTP/1.1
Host: localhost:3000
Content-Length: 1325
Origin: http://localhost:3000
... other headers ...
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryePkpFF7tjBAqx29L

------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-disposition: form-data; name="MAX_FILE_SIZE"

100000
------WebKitFormBoundaryePkpFF7tjBAqx29L
Content-disposition: form-data; name="uploadedfile"; filename="hello.o"
Content-Type: application/x-object

... contents of file goes here ...
------WebKitFormBoundaryePkpFF7tjBAqx29L--

请注意,请求的内容是多部分编码文档,表单字段散布在文件数据中.在此特定示例中,表单字段出现在文件数据之前.但是,有可能 – 实际上可能 – 表单数据发生在文件数据之后.

因此,为了保证PHP可以为您提供所有$_POST数据,PHP必须处理整个请求.因此它可以完成$_FILES超级全局,而它就在那里.

现在,PHP可以将这些文件数据保存在内存中,但这可能是一个坏主意.想想如果PHP需要存储用户上传的100 MiB文件会发生什么.突然之间,你的Apache进程的RSS增加了100 MiB,这实际上并不太好 – Apache可能会因为没有那么大的空间而被限制,或者Apache可能会被交换:给你的用户带来痛苦.因此,PHP做了下一个最好的事情:将这个接收的文件放在一个临时文件中.

您可能会问为什么PHP不能被告知首先放入传入文件数据的文件,因此您不必移动它.好吧,这是一个引导问题:PHP尚未将控制权交给脚本,因此脚本无法告诉PHP文件放在何处.因此,PHP尽其所能:将文件数据放入临时文件中.

现在,您可以将此文件数据保存在RAM磁盘中,以便在需要时提高速度.如果您不介意基础架构成本(例如,维护RAM磁盘设置),这是一种很好的方法.但是请注意,这不像PHP在RAM本身中持有它:在那种情况下,PHP容器进程(通常是Apache或其他一些Web服务器)必须有堆来保存文件(它可能不会).在这种情况下,RAM磁盘由内核管理.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐