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

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

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

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

4回答

6225閲覧

execで実行した処理が終了したことを受け取ることは可能でしょうか?

red13

総合スコア79

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2017/12/01 00:08

編集2017/12/01 00:46

phpのexecを使用し、
SELECT結果をファイルに出力後、出力が完了したことをメールで知らせる等の処理を実行したいのですが
execで実行したコマンドが完了したことをphp内で知ることはできるのでしょうか?
以下は処理イメージです。

/* 非同期処理完了後にメールを送りたい。 */ // ①非同期処理を実行する。場合によっては数十分かかる。 exec("mysql -u root -ptest 'SELECT * FROM TEST_TABLE' > test/test.csv > /dev/null &"); // ② ①の処理が完了後に実行したい処理。 メール送信など。

追加補足:
execの文を修正しました。

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

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

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

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

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

guest

回答4

0

時間のかかる処理を exec で、非同期に処理させているのですね。

非同期処理が終わったことだけを知りたいというような内容であれば、exec で実行するコマンドの後に ; や && や || でつないで、メール送信させる方が簡単そうです。

php

1exec("{ mysql -u root -ptest 'SELECT * FROM TEST_TABLE' > test/test.csv > /dev/null ; echo "finished .." | mail -s 'Command finish.' メールアドレス;} &");

投稿2017/12/01 01:25

編集2017/12/01 01:26
CHERRY

総合スコア25171

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

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

red13

2017/12/01 01:34

複雑な処理でなければコマンドのみで終わらせることが可能なのですね。 今回は色々と処理がありますので、コマンドのみでは難しいです。 今後、機会がある場合は、こちらを参考させていただきます。
guest

0

exec関数の第3引数に変数参照を渡すことで、終了コードを受け取ることができます。
また、通常は外部コマンドが完了するまでexecは終了しないかと思います。

PHP: exec - Manual
http://php.net/manual/ja/function.exec.php

重い処理を行う場合は、バッチ処理とした方がよいかもしれません。
その場合は画面からは受付だけを行います。

また、テーブルをすべて出力するのであれば、mysqldump等を使用されてもよいかもしれません。

投稿2017/12/01 00:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

red13

2017/12/01 00:50

第3引数はコマンドの実行結果なので、終了したかどうかは違うと思っているのですが、 この考えが違いますかね? また、今回はテーブル全てが対象ではないためdumpを使用していません。
退会済みユーザー

退会済みユーザー

2017/12/01 01:36 編集

質問の前提が変わりましたので回答内容もまた変わります。 miyabi-sunさんのご回答を参考にされるとよいかと思います。
guest

0

自己解決と言いますか、回答を見て思いつきました。
①exec処理完了後に処理を実行するphpを別ファイルで作成する。
②exec処理を同期で実行する。
③ ①のphpを別のphpから呼ぶ。
これなら非同期、かつexec完了後に処理が実行できると思いました。

/* exec.php */ // mysqlからデータを取得するphpを非同期で呼ぶ。 exec("php getData.php > /dev/null &");
/* getData.php */ // 非同期で実行されるphp内で出力処理を同期で実行 exec("mysql -u root -ptest 'SELECT * FROM TEST_TABLE' > test/test.csv"); // exec実行後の処理

投稿2017/12/01 00:58

red13

総合スコア79

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

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

miyabi-sun

2017/12/01 01:01

非同期実行の前の行で何をやってるのか不明なので私の回答では案しか出してませんでしたが、 恐らくそれが最善でしょう。
red13

2017/12/01 01:20

<form action="exec.php" method="post"> submitする。 </form> 上記のようにformからsubmitした後の重たい処理を非同期処理にしたいという理由で質問しました。 単純に非同期だけならよいのですが、完了したことを通知するという仕様もあったため、今回の質問をしました。
miyabi-sun

2017/12/01 01:31 編集

なるほど、一度Webサーバーとしてリクエストを受け取りたいのですね。 本題とは違うのでコメント欄にぶら下げますが、 PHP側のタイムアウトを切りつつ JavaScript側でAjaxを送信してPHPは全て同期実行、 メールを投げたり結果が帰ってきたらChromeのブラウザ通知を受け取るという手法もありますね。
red13

2017/12/01 01:38

ajaxもありですね。 今回はexecという方法をとりましたが、今後はajaxも含めて考えてみます。
guest

0

ベストアンサー

コマンド文字列の末尾に&を付ければ非同期実行になりますが、
完全にPHPの制御の手から離れて取り扱えなくなります。
終了を検知する方法はOSぐるみでプロセスを監視するような手法になってくるでしょう。

PHPでバッチを作る場合、PHPファイル自体がCronやBash等を利用して
別プロセスで叩かれるものかと思いますので同期実行してのんびり待てば良いでしょう。

JavaSCript

// ①非同期処理を実行する。場合によっては数十分かかる。
exec("mysql -u root -ptest 'SELECT * FROM TEST_TABLE' > test/test.csv");

コマンド文字列の末尾に&を付けない限り同期実行です。 なのでこれは…同期実行なのでは? 次の行にメール送信のコマンドを用意しましょう。 そうすれば終わり次第メールを送信してくれるかと思います。

投稿2017/12/01 00:41

miyabi-sun

総合スコア21158

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

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

red13

2017/12/01 00:47

指摘の通り、質問文が誤ってました。 申し訳ありません。
red13

2017/12/01 01:00

やはり非同期はphpだけで完結するものではないのですね。 回答を見て、自分で思いついた方法を記載しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問