我有以下PHP文件:PHP POST和执行大文件上传
- fileUploadForm.php
- handleUpload.php
fileUploadForm包含以下的输出:
- 输出$ _SESSION ['errorMessage'](如果有的话)
- Ou tput的一个文件上传表单职位,以handleUpload.php
handleUpload.php执行以下操作:
- void验证会话(login的重新定位,如果验证失败)
- void验证文件(设置$ _SESSION [ '的errorMessage']如果验证失败)
- 为病毒
- MoveFile
- 更新数据库 01扫描文件
该脚本在大文件上传时遇到问题。为了测试目的,我已将所有关于文件上传的php.ini设置设置得非常大。所以我不认为这个问题是一个配置问题。
以下行为是混淆了我:
当我看文件tmp中成长,文件上传继续以及过去所设定的max_input_time设置。我的理解是,一旦超过max_input_time,脚本将终止,反过来,文件上传也是如此。任何想法为什么这不会发生?
如果我停止中间文件上传并刷新fileUploadForm(不重新提交它),脚本将输出与在handleUpload中设置的文件验证相关的错误消息。这似乎表明即使文件上传没有完成,handleUpload中的代码行也正在执行。 php是否执行脚本并异步接收表单数据?我会认为脚本会在执行任何代码之前等待所有表单数据被接收。但是这个假设与我所看到的行为相矛盾。数据POST /脚本执行的顺序是什么?
当max_input_time与其余配置值一起被设置为测试的可笑程度很大时,将会完成非常大的上载。然而,脚本的其余部分似乎死了。即病毒扫描和文件移动永远不会发生,数据库更新也不会发生。我为脚本中的每个操作设置了错误处理,但不会引发错误。该页面似乎已经死亡。任何想法为什么这可能发生/如何捕捉这样的错误?
在此先感谢。 凯特
我只刷新fileUploadForm.php,而不是实际重新提交它。但它现在包含在handleUpload中设置的会话信息。所以,一些代码正在执行。并且在整个文件上传到tmp之前执行。 – user480029
PHP文档似乎不一致的如何发生这种情况。它定义了max_input_time,就像在答案的第一部分中所做的那样:“允许脚本解析输入数据的最长时间(以秒为单位),如POST和GET,它是从服务器上的所有数据接收开始到启动脚本执行“(即计数在上传完成后开始)。但在故障排除部分,它表明如果max_input_time不够高,某些文件上传将无法完成。但无论哪种方式,我都会看到文件上传继续,发生一些脚本执行,然后失败。 – user480029
问题在于你的意思是“只刷新” - 你是否进入浏览器的地址栏并按Enter键或者是否按F5(或点击刷新)?如果第二个是你所做的,那么浏览器会问你是否要重新提交表单数据,除非你确认,否则不允许你继续。如果你做的第一件事,那么......只有会话数据存在是很正常的。 – Narf