Windows下基础PHP文件上传脚本无限挂起且$_FILES为空求助
这种Windows独有的上传异常真的挺闹心的,我之前帮朋友排查过类似情况,结合你已经做过的检查,给你几个针对性的方向试试:
Windows临时目录的深层权限/路径问题
你已经检查了tmp权限,但要注意:PHP在Windows下默认可能用系统临时目录(比如C:\Windows\Temp),得确认PHP进程的运行用户(比如IIS的IIS_IUSRS组、Apache的运行账户)对这个目录有写入+修改+删除的完整权限。另外,建议把php.ini里的upload_tmp_dir改成明确的绝对路径,比如upload_tmp_dir = "C:\PHP\UploadTemp",手动创建这个目录并给运行用户完全控制权限——相对路径在Windows环境下偶尔会有解析异常。IIS环境的POST请求拦截(CGI/FastCGI模式)
如果是IIS搭配PHP,光改PHP的upload_max_filesize和post_max_size还不够,IIS本身有maxAllowedContentLength限制(默认约30MB),超过这个值的请求会被IIS直接拦截,PHP根本接收不到,表现就是挂起+$_FILES为空。可以在站点的web.config里添加:<system.webServer> <security> <requestFiltering> <requestLimits maxAllowedContentLength="1073741824" /> <!-- 这里设为1GB,按需调整 --> </requestFiltering> </security> </system.webServer>同时要保证
php.ini里的post_max_size必须大于upload_max_filesize,比如前者设为1024M,后者设为900M。杀毒软件/防火墙的实时扫描拦截
Windows下的杀毒软件(比如Windows Defender、360安全卫士)经常会扫描上传生成的临时文件,导致PHP读取临时文件时被阻塞,进而出现挂起。可以临时关闭实时防护试试,或者把PHP的临时目录加入杀毒软件的白名单。FastCGI超时设置过短
如果用IIS+FastCGI运行PHP,FastCGI的默认超时时间可能不足以支撑大文件上传。可以在IIS管理器的「FastCGI设置」里,找到对应的PHP项,把「活动超时」和「请求超时」调大(比如设为300秒/5分钟)。最后再确认一遍表单属性
虽然你说Linux下正常,但还是要检查HTML表单标签里有没有enctype="multipart/form-data"——这是文件上传的必填属性,少了的话$_FILES必然为空,只是Linux和Windows的异常表现可能不同。
快速测试方法
先上传一个1KB以内的极小文本文件:
- 如果小文件正常,说明问题大概率是文件大小相关的限制(IIS或PHP的参数);
- 如果小文件也挂起,那基本是临时目录权限或杀毒软件拦截的问题。
内容的提问来源于stack exchange,提问作者sjw0525

