我目前正在开发一个Symfony2项目,该项目在某些时候涉及提交表单并对文件系统执行冗长的操作(递归副本)。
目前,用户必须等到文件系统操作完成并在重定向之前处理表单。我尝试使用一些简单的AJAX来增强此功能。我遇到了无法同时执行表单提交和查询其他操作/控制器的麻烦。
Symfony2是否允许并发控制器请求?如果它没有,有没有办法完成实现像基本并发一样的工作?
这是我在代码方面要做的事情的概述:
<form action="{{ path('performSomeAction', { 'id': client.getId(), 'someId':some.someId() }) }}" method="post" {{ form_enctype(form) }}>
{{ form_widget(form) }}
<input type="submit" />
这就是我正在尝试同时使用异步XMLHttpRequest提交表单:
<script language="JavaScript" type="text/javascript">
function getXmlHttpRequestObject() {
if (window.XMLHttpRequest) {
return new XMLHttpRequest(); //Not IE
} else if (window.ActiveXObject) {
return new ActiveXObject("Microsoft.XMLHTTP"); //IE
} else {
alert("Your browser doesn't support the XmlHttpRequest object. ");
}
}
var receiveRequest = getXmlHttpRequestObject();
function handleFetchProgress() {
if (receiveRequest.readyState == 4) {
var newData = receiveRequest.responseText;
var oldData = document.getElementById("span_result").innerHTML;
var toDisplay = oldData + "<br />" + newData;
document.getElementById("span_result").innerHTML = toDisplay;
}
}
function fetchProgress() {
if (receiveReq.readyState == 4 || receiveReq.readyState == 0) {
receiveReq.open("GET", '{{ path('fetchProgress') }}', true);
receiveRequest.onreadystatechange = handleFetchProgress;
receiveRequest.send(null);
}
}
$(document).ready(function() {
$('form').submit(function() {
setInterval("fetchProgress()", 1000);
return false;
});
});
答案 0 :(得分:4)
这可能是由会话锁定引起的,在此解释:How do I kill a session in Symfony2?
您必须解锁会话写入模式以接受另一个访问它的请求。
我写了一篇关于处理异步请求的博文:http://blog.alterphp.com/2012/08/how-to-deal-with-asynchronous-request.html