2012-03-18 7 views
0

現在、Symfony2プロジェクトで作業しています。ある時点では、フォームを送信してファイルシステムに長時間の操作(再帰的コピー)を実行する必要があります。Symfony2でのAJAXを使用した並行操作

現在、ユーザーはリダイレクトされる前にファイルシステム操作が完了し、処理されるまで待つ必要があります。私はいくつかの単純な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

Symfony2のは、Webアプリケーションを構築するために、私はそれが同時コントローラ要求することができます願っています...「フォームの送信を行うことができることと、別のアクションを照会ない説明され/コントローラを同時に "より正確にしてください。 – greg0ire

+0

「ReceiveReq.open(「GET」、「{{path( 'fetchProgress')}} ')というテキストでAJAX要求が実行されるとすぐに、フォームを処理するコントローラ({{path( 'performSomeAction')}})は何も返しません。AJAXリクエストからの応答を受け取りますが、フォーム送信コントローラからの応答はありません。 AJAXリクエストからの応答があり、フォーム提出を担当するコントローラが停止するまで、ページは1秒間ロードされます。 –

+0

2つのリクエストがありますか?アクセスログを確認してください。 – greg0ire

答えて

4

これはおそらく、セッションLOによって引き起こされますここで説明されています:How do I kill a session in Symfony2?

セッション書き込みモードのロックを解除して、アクセスを許可する必要があります。

私は非同期リクエストを扱うに関するブログ記事を書いた:http://blog.alterphp.com/2012/08/how-to-deal-with-asynchronous-request.html

+1

これはまさにこの問題を引き起こしていました!質問はかなり時代遅れであり、私はsession_write_close()を実行して解決しました。それから、@ greg0ireが指摘しているようにjQueryを使用するように書き直しました。 –

関連する問題