アプリ版:「スタンプのみでお礼する」機能のリリースについて

JQueryでAjax通信時に、abort()でキャンセルを行うと通信はキャンセルになっているようですが、
サーバー側(Ajaxで呼ばれた処理)は、最後まで処理されてしまいます。

abort()を実行させた時に、サーバー側の処理まで中断させる方法はありますでしょうか?

実行と中止は以下のような感じで書いています。

Ajax実行
arrXhr = $.ajax({
dataType: "json",
type: "POST",
url: "xxxxxxx.php",
async: true,
cache: false,
data: sendData,
success: function ( data ) {
},
error: function ( XMLHttpRequest, textStatus, errorThrown ) {
}
});

中止
xhr.abort();

A 回答 (2件)

環境に依ると思いますが可能です。



例えば、以下のPHPのスクリプトは60秒間動作しますが、ブラウザ側で読み込みを中止(×をクリックする等)すると、すぐに停止します。(test.txtの更新が止まる事で確認できます。)

<?php

$fp = fopen('test.txt', 'w');

for ($i = 0; $i < 60; $i++) {
@fwrite($fp, 'A');
sleep(1);
print("\n");
}

fclose($fp);

?>

Apacheは、レスポンス時にクライアントとの接続が中断されていると、当該プロセスを終了させる、という動作をするためです。
スクリプト内の“print("\n");”で定期的に出力させているのはそのためです。この“print("\n");”が無い場合は、ブラウザ側の読み込みを中止しても60秒間動作し続けます。(text.txtの更新が60bytesになるまで止まりません。)

ecaihさんが実現したい“abort()を実行させた時に、サーバー側の処理まで中断”についても、同様の方法で実現できると思います。
私が実際に行っているのは、Comet処理用のサーバ側スクリプトにて、サーバ側でのイベント発生を待つ間は定期的に改行"\n"を出力しています。改行であれば、JSONコンテンツへの影響が無いためです。

また、PHPでは試す事ができておりませんが、サーバ側の処理中断時に何らかの終了処理をさせたければPIPEシグナルを捕捉する事で実現できるかもしれません。Apacheがプロセスを終了させる際、当該プロセスにPIPEシグナルを発生させるためです。
※私の環境ではpcntl_signalが使えなかったため試せませんでしたが、本関数によりSIGPIPEを捕捉する事で試してみてください。
    • good
    • 0

ブラウザ側の処理が止まってもサーバとしてはそれを関知出来ないので


処理は止まりません。


逆に考えると、何らかの方法でサーバに処理の停止を命令してやればいいので

大まかには
0.何らかの方法で任意の実行中の処理を停止するプログラムをサーバ側に書く

1.処理開始時にサーバで処理停止用のキー的なものを発行してブラウザに渡す

2.処理中断時にそのキーをサーバに渡して任意の処理を停止するリクエストを投げる
みたいな感じでしょうか。

他の人が走らせてる処理を止められないように考慮する必要があったりで
実際に作ると結構大変な気がします。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!