質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

解決済

2回答

6073閲覧

[Ajax]実行すると画面遷移ができなくなる

yoshiky

総合スコア105

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2016/02/29 09:29

いつもお世話になっております。
重いバッチ処理を実行する際に、バックグラウンドで実行させてユーザを待たせないようにしたいと考えています。
しかし、Ajaxで処理実行後、画面遷移ができずにエラーが返ってきます(サーバ側(PHP)の処理は継続している)。

具体的には下記のようにしたいと考えています。

  • 集計画面に集計ボタンがある。
  • 集計ボタンを押すとサーバ側で処理が実行される。
  • 集計ボタンを押すと画面遷移はせず、ローディングアイコンに切り替わる(ぐるぐる回っているだけ)
  • 集計ボタンを押したら画面遷移してもブラウザを落としても処理は継続される。

集計ボタン押下のタイミングと、集計画面を開いたタイミングでバッチ処理の状況をDBから取得し、継続中ならローディングアイコン、終わっていれば(または処理対象がなければ)通常画面を表示、
といった動きを想定しております。

ソースは以下のように書きました(抜粋)

HTML

1<input type="submit" class="btn" onclick='calcExec()' value="集計" />

Javascript

1 2function calcExec(){ 3 $(function(){ 4 $.get('/execute', { hoge : hoge }).done(function(data){ 5 ・・ ・ 6 }); // 処理中に画面遷移するとstatus=0のエラーが返る。 7 8 checkStatus(); 9 }); 10} 11 12function checkStatus(){ 13 $(function(){ 14 polling = setInterval(function(){ 15 $.get('/check', {fuga : fuga}).done(function(data){ 16 if(data == 0){ // PHP側で処理が終わったら0を返す 17 clearInterval(polling); 18 } 19 }); 20 }, 5 * 1000); 21 }); 22} 23

回避策をご教授いただけると幸いです。
基本的なことかと思いますが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

自己解決しました。勘違いというか理解不足というか、リクエストは非同期で行いましたが、その後の処理はバックグラウンドで実行する必要があるみたいです。

そのため、記載したjQueryのコードはほぼ問題なく、原因はサーバ(PHP)側でした。

きれいな書き方が分からないのですが、下記のようにしたらバックエンドで動き続け、画面遷移してもブラウザを落としても処理が継続されました。

ちなみにフレームワークはCodeigniterを使っています。

PHP

1public function execute(){ 2 exec('usr/local/bin/php index.php Hoge calclate > /dev/null 2>/dev/null &'); <= &とphpのパスが肝! 3} 4 5public function calclate(){ 6 //execで呼び出される 7}

お騒がせいたしました。。

投稿2016/03/01 06:29

yoshiky

総合スコア105

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

function内を

$(function(){

})

で囲ってるのって、何か特別な意味とかありますか?

投稿2016/03/01 02:02

ogaaaan

総合スコア765

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yoshiky

2016/03/01 02:45

$.getなど、functionの中でjQueryを使っているためです。
ogaaaan

2016/03/01 03:31

これはなくても大丈夫ですよー。 直接関係内話ですいません。
yoshiky

2016/03/01 06:20

アドバイス、ありがとうございます! ご指摘のとおり外しても動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問