Php 当用户反复尝试上载无效的文件类型时,网站崩溃
我试图理解一个错误 我有一个允许用户上传CSV的web应用程序。如果文件类型不是CSV,则不会发生任何事情,页面只显示“无效文件类型” 如果用户尝试上载无效的文件类型,并反复单击触发处理上载的PHP文件的按钮,则PHP文件最终会变得无响应,并且站点崩溃,出现以下错误:Php 当用户反复尝试上载无效的文件类型时,网站崩溃,php,http,tcp,Php,Http,Tcp,我试图理解一个错误 我有一个允许用户上传CSV的web应用程序。如果文件类型不是CSV,则不会发生任何事情,页面只显示“无效文件类型” 如果用户尝试上载无效的文件类型,并反复单击触发处理上载的PHP文件的按钮,则PHP文件最终会变得无响应,并且站点崩溃,出现以下错误: "tcp_error: The Web Server may be down, too busy, or experiencing other problems preventing it from responding to r
"tcp_error: The Web Server may be down, too busy, or experiencing other problems preventing it from responding to requests. You may wish to try again at a later time"
我想这是因为它是一个持久的HTTP连接,并且被请求淹没了
我想知道这个问题的确切来源,如果用户反复尝试上传无效的文件类型,最好的修复方法是避免崩溃
HTML摘录:
<script type="text/javascript">
function stopUpload(success){
console.log(success);
var csv1 = success['csv1'];
var csv2 = success['csv2'];
var csv3 = success['csv3'];
var csv4 = success['csv4'];
var csvError = success['error'];
var id = success['id'];
$('.js-wf-error').text(csvError);
if (!csvError) {
runWF(id, csv1, csv2, csv3, csv4);
}
}
</script>
<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid
<form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
<input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<a href="#" onclick="$(this).closest('form').submit(); return false;" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
</form>
函数stopUpload(成功){
console.log(成功);
var csv1=成功['csv1'];
var csv2=success['csv2'];
var csv3=success['csv3'];
var csv4=success['csv4'];
var csvError=success['error'];
var id=成功['id'];
$('.js wf error').text(csvError);
如果(!csvError){
runWF(id、csv1、csv2、csv3、csv4);
}
}
尝试试一试。它可能有效,但不能保证:
当通过html表单上传文件时,可能需要几秒钟才能成功上传表单并显示响应页面(PHP)。人们可能会变得不耐烦,并多次单击上载按钮,这可能会导致重复的表单提交或上载。通常情况下,这确实是一个问题&您可能希望防止这种情况发生。
您可以使用javascript这样处理它:
第一步是为submit按钮提供一个唯一的id,例如id=“myButton”:
然后,您的表单标签将类似于:
<form action="wf/cs-vupload.php" method="post"
onsubmit="document.getElementById('myButton').disabled=true;
document.getElementById('myButton').value='Uploading to server,please wait...';"
>
就这样。这个技巧应该适用于大多数现代浏览器(IE 5+、FireFox、Opera等)
还有一种使用Cookie的方法,这些快速修复将阻止多个表单提交。请尝试以下链接:
是的,我错过了一些。很高兴知道这是不是真的。在我看来,浏览器正在超时,因为您的服务器正忙于处理所有其他(上载)请求
有一个名为one()
的jQuery方法,它只执行一次事件,应该可以很好地解决这个问题
例如:
<form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
<input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<a href="#" id="submit_link" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
</form>
<script type="text/javascript">
$("#submit_link").one( "click", function() {
$("#wf-form").submit();
});
</script>
$(“提交链接”)。一个(“单击”,函数(){
$(“#wf表格”).submit();
});
为了完整性起见:如果它不是一个链接而是一个按钮,您可以简单地在onClick事件中禁用submit按钮(就在submit()
之后),以禁止多次提交文件。您可以将Javascript类用于ajax上载文件和表单类
<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>
<form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
<input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="hidden" value="1000000" name="MAX_FILE_SIZE">
<a href="#" onclick="fcsvUpload(); return false;" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
</form>
<script type="text/javascript">
function fcsvUpload(){
var oData = new FormData(document.getElementById("wf-form"));
var result = true;
var oReq = new XMLHttpRequest();
oReq.open("POST", "wf/csv-upload.php", false);
oReq.send(oData);
if (oReq.status === 200) {
return result;
} else {
return result;
}
});
</script>
函数fcsvUpload(){
var oData=新表单数据(document.getElementById(“wf表单”);
var结果=真;
var oReq=新的XMLHttpRequest();
open(“POST”,“wf/csv upload.php”,false);
oReq.send(oData);
如果(oReq.status==200){
返回结果;
}否则{
返回结果;
}
});
您在带有iframe的html行中有错误。iframe标记未关闭。也许是因为它不起作用。看:
<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid
为什么不禁用按钮直到返回响应?是的,我想这可能会起作用,我会试试看。不过,我想了解问题的确切原因。当它崩溃时,我连续快速地提出了5-10个请求,效果很好,只有在那之后,当我发出更多请求时,它才崩溃,因此,不清楚问题是新请求是在最后一个请求返回之前发出的,还是由于请求的累积数量造成的……您需要检查服务器日志以了解发生了什么,这似乎不是一个正常的PHP错误,可能是由类似于此问题的QOS引起的?正如我在回答中提到的,服务器仍然忙于处理其他请求。发送新的上载请求不会取消正在进行的上载!它并行处理其中一些线程,这还取决于允许的线程数。
<form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
<input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<a href="#" id="submit_link" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
</form>
<script type="text/javascript">
$("#submit_link").one( "click", function() {
$("#wf-form").submit();
});
</script>
<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid #fff;"></iframe>
<form id="wf-form" class="js-wf-form" method="post" action="wf/csv-upload.php" enctype="multipart/form-data" target="upload_target">
<input type="file" name="csv1" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv2" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv3" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="file" name="csv4" value="" class="text ui-widget-content ui-corner-all csv-upload" />
<input type="hidden" value="1000000" name="MAX_FILE_SIZE">
<a href="#" onclick="fcsvUpload(); return false;" type="submit"class="button redButton largeButton run-wf-button">Run Walking Farm</a>
</form>
<script type="text/javascript">
function fcsvUpload(){
var oData = new FormData(document.getElementById("wf-form"));
var result = true;
var oReq = new XMLHttpRequest();
oReq.open("POST", "wf/csv-upload.php", false);
oReq.send(oData);
if (oReq.status === 200) {
return result;
} else {
return result;
}
});
</script>
<iframe id="upload_target" name="upload_target" src="#" style="width:0;height:0;border:0px solid