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

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

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

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

Q&A

解決済

1回答

404閲覧

ブラウザよりpelrで長時間かかる処理を実行させておき、その後ページ移動する場合について

mitsu326

総合スコア23

Perl

Perlは多目的に使用される実用性が高い動的プログラミング言語のひとつです。

0グッド

2クリップ

投稿2018/03/08 01:35

今回、メール配信など時間の掛かる処理をブラウザより 実行・中止 を行なう管理画面を作成しております。

完成させたい希望の仕様としては、簡単に書くと下記のような物になります。
1.ブラウザより、メール配信のページを作成し、メール配信の実行と中止をボタン操作で行なう。
※実行、中止ボタン操作後に、Ajaxの非同期通信を使いスクリプトを実行させる予定です。
2.配信を実行させた後に、ページを離れ他の作業を行えるようにする。
3.メール配信ページに戻った際に、実行させたメール配信が処理中であればその途中経過を表示する。

作成段階で問題になっているのが
【問題点1】
項目1の、ボタンで実行させるのはわかるのですが、実行中の物を、中止(中断)させる処理がブラウザより
可能なのでしょうか?
また、可能でしたらどのような処理?命令文になるのか教えてください。

 いままで、処理の途中で中止させる事を考えたことが無く見当も付きません・・・

【問題点2】
項目2のスクリプトのみ実行させておき、ページを離れても実行させたままにするにはどのような方法が良いのでしょうか?

 現在、考えておりますのが、fork関数を使い処理を分ける方法を考えております。
親プロセス(master.cgi)・・・ 処理の受付、実行の完了の応答
子プロセス(slave.cgi) ・・・メール配信、処理の途中経過をログファイルに出力
※ログファイルは、項目3の状況でアクセスした際にログを参照し実行中なら途中経過を表示させるために使いたいと考えております。

スクリプトの構成としては、
親プロセス(master.cgi)の処理
1.処理を受け付け、fork関数を使い子プロセス(slave.cgi)を実行させる。
2.Ajaxへ処理の実行の応答を返す
3.close(STDOUT) して exit;
【問題点3】ここで終了して良いのか?又は、何か待っていなけれなならないのでしょうか?
まったく違っていたら処理の方法を教えてください。

 子プロセス(slave.cgi)の処理
1.親プロセスより実行されメール配信処理を行う
2.送信が完了したメールのログを保存
3.全てのメールが送信終わった場合は、完了をログに保存して終了

この様な流れで考えておりますが、今の現時点で3つの問題が発生しております。
問題1 実行させたスクリプトをブラウザ上より中止させることが可能なのか?
可能な場合はどのような処理?命令文になるのかを教えてください。

 問題2 スクリプトを実行させたまま、ページを離れるのが可能なのでしょうか?
現在考えている方法で良いのでしょうか?また、違うおすすめの方法がありましたら
教えてください。

 問題3 fork関数で処理を行った際に、上記のように終了して良いのでしょうか?
終了してNGな場合は、どのような処理が妥当なのでしょうか?

この様な構成で作成するのは初めてなので、他に問題点が出そうな物がありましたら合わせて
ご回答頂けるとありがたいです。

宜しくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

全てに答えられるわけではありませんが、分かるものだけ

問題1 実行させたスクリプトをブラウザ上より中止させることが可能なのか?

可能です。

ソースコードの提示がないので想像になりますが、
メール配信ということはループ処理が利用されているものと思われます。
実行中かどうかの状態を持っておくファイルを1つ作っておき、
ループの最初でそのファイルの中身を取得、状態を確認し、
「中止」ないし「中断」となっていればループを抜けるようにする。
文字列でなくても数字にしておき0が実行中、1が完了、3が中断、4が中止
のように決め打ちでも良いと思います。

取得した情報により画面に何か表示すれば完了したのか中止したのか分かります。

「中断」で「再開」することがある場合、「今どこまで実行したか」というのは持っておかなければなりませんが。

「スクリプトを中止する」というより、「状態によりスクリプトを終了ロジックに導く」、と言ったほうが正しい表現ですね。

問題2 スクリプトを実行させたまま、ページを離れるのが可能なのでしょうか?

ajaxで非同期であれば他の操作をしていても問題ないと思います。
基本的に、一度投げた処理は何かエラーがない限りスクリプトが終了するまで動作し続けます。
心配であれば、ajaxから実行するスクリプトではsystem関数?でメール配信プログラムを実行するだけにとどめておき、
何かのタイミング(該当の配信ページにアクセスしたり、「状態確認」ボタンを押したり)状態監視のプログラムをajaxで実行し、現在の状態を受け取るようにしておけば良いと思います。

投稿2018/03/08 01:53

m.ts10806

総合スコア80850

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

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

mitsu326

2018/03/08 06:52

ご回答ありがとう御座います。 スクリプトを直接中止させるのではなく、ファイルを介して中止させるのですね! 見当もつか無かったので素晴らしいです! 早速取り入れて進めていきます。 問題2の方も、Ajaxから処理を投げて処理が実行した応答のみAjaxへ返し、スクリプトはその後処理をし続けると言うことで宜しいのでしょうか? この辺が私自身あいまいなところなので・・・ 少し教えて頂きたいのですが、Ajaxで処理をCGIへ投げたあとCGIの処理が完了しないと、Ajax側でsuccessとして扱ってもらえないと思っていたのですが、そうでは無いという事で宜しいのでしょうか? Ajaxの非同期通信で少し勉強してみます。
m.ts10806

2018/03/08 07:06

>Ajax側でsuccessとして扱ってもらえないと思っていた というより、実行コマンドを投げるだけのajaxと実行状況を受け取るajaxを別々にすれば良いと思いますよ。 実行するだけならコマンド投げたら返ってくるので一瞬ですし、実行状況を受け取るのも実行状況ファイルの内容を取得するだけなので一瞬です。
mitsu326

2018/03/08 07:33

ご回答頂きましてありがとう御座います。 簡易スクリプトを作り試したところ出来ました。 Ajaxについてもページ移動しても処理を実行しており終了した時点でファイルに出力するようにしたら動作している確認も取れました。 この方法を取り入れてエラーの場合などの処理を付け加えて行きたいと思います。 ありがとう御座いました。
m.ts10806

2018/03/08 07:33

解決に向かいそうで何よりです。
mitsu326

2018/03/08 07:34

これでやっと頭がスッキリしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問