• 締切済み
  • 困ってます

PHPで外部プログラムのバックグラウンド処理(Windows)

よろしくお願いします。 PHPのバージョン4でWindowsです。 現在***.exeをsystem()で実行しています。 この***.exeの処理が長い時で、10分位かかってしまうので、バックグラウウンドで処理をしたいと考えています。 コマンドプロンプトで >start ***.exe ~ を実行したところ、うまいことバックグラウンドで処理できました。 しかし、system()で上記のコードを実行したら一瞬黒い画面が出るだけで***.exeが実行されませんでした。 なにがだめなのか全然見当もつきません… 実現できればどんな方法でもかまわないので、 次の方法も試しました。 1. a.phpでsystem(">b.php") b.phpを呼び出し b.phpでsystem(">***.exe")を実行 結果:***.exeは実行されるのですがバックグラウンドで処理されない。 2. コマンドプロンプトでIEを開いてa.phpにアクセス a.phpでjavascript window.openでb.phpをオープン b.phpでsystem(">***.exe")を実行 b.phpをwindow.closeで閉じる 処理は出来たのですが、a.phpが残ってしまう…(消せない、消し方がわからない) a.phpが消せればこの方法でもいいのですが… とにかく実現できればいいのですが… わかる方がいたら教えてくださいお願いします。

共感・応援の気持ちを伝えよう!

  • 回答数1
  • 閲覧数2185
  • ありがとう数1

みんなの回答

  • 回答No.1

Windows版ではexec系の関数で非同期処理はできなかったと思います。 参考URLのようにpopenではいかがでしょうか。 これでもダメなら、目的のプログラムを起動してすぐ終了するようなプログラムを別に作成する必要があります。 未検証で申し訳ないのですが参考になれば幸いです。

参考URL:
http://www.miuxmiu.com/archives/tag/background

共感・感謝の気持ちを伝えよう!

質問者からのお礼

popenですね!これは知りませんでした! さっそく試してみます! ありがとうございました!

関連するQ&A

  • バックグラウンド処理をforkする意味

    初歩的な質問かもしれませんが… デーモンなどではなく、あくまでも通常のCGIスクリプトにおいて、何か重い処理をさせる場合は、STDOUTをcloseして処理はforkで生成した子プロセスにさせる、するとユーザーを待たせることなく(ブラウザをビジーから開放し)処理はバックグラウンドで実行される、という方法がよく見られるのですが、素朴な疑問があります。 ブラウザを開放させるにはSTDOUTをcloseすれば良い、 では、なぜ処理を子プロセスにさせなければならない? という点です。 一応、以下のような簡単なコードで試してみました。 ----------------- use Date::Format; my $log_file = 'hogehoge/test.log'; my $start = time2str('%m-%d %T', time); print "Content-Type: text/plain\n\n"; print "start:$start"; close(STDOUT); &heavy_exe($start); exit; sub heavy_exe { my $start = $_[0]; sleep(15); my $now = time2str('%m-%d %T', time); open(LOG, ">>$log_file") or &error('cant_open'); print LOG "$start\t$now\n"; close(LOG); } ----------------- 実行してみると、ブラウザはすぐさま開放される(読み込み完了になる)のと、15秒後にロギングも問題なく行われ、また本当に開放されていることを確認するために表示から15秒以内にリロードさせても、問題なく2プロセスとも動いていました。 以上を見る限りでは、forkなんてしなくても単にブラウザを開放するだけでいい、STDOUTをcloseするだけでバックグラウンド処理されると思うのですが、どうなのでしょう。 あるいは何か環境に依存した、子プロセスにさせなければならない理由などがあるのでしょうか。 よろしくお願いいたします。

    • 締切済み
    • CGI
  • MSDOSをバックグラウンドで起動させたい。

    Windows2000のMSDOS(コマンドプロンプト)を実行すると、画面が表示されます。この画面を表示させずにバックグラウンドでプログラム(バッチファイル)を実行させるにはどうしたらよいのでしょうか? 以下、バッチファイル概要 @echo off start c:\php\php.exe c:\aaa.php 上記を実行させると、c:\php\php.exeのコマンドプロンプトが画面に表示されてしまいます。

  • PHP バックグラウンド処理

    apache1.3系+PHPで大量のメール送信プログラムを作成していますが、ある動きで困っております。 特定のフォームにて件名と本文を入力し、submitすることでsystem関数を利用して別のプログラムをバックグラウンドで動かそうとしてますが、メール送信前にコメントを表示したいのです。 しかし、表示をする前に後に記述しているsystem関数が読み込まれるようで、system関数の処理が終わると、そのコメントが表示されるようになってしまってます。 例) // ここでコメントを表示 print<<<HTML <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=EUC-JP"> <title>WEBMAIL</title> </head> 送信を受付ました </body> </html> HTML; // メール送信プログラムをバックグラウンドで system("/usr/local/bin/php webmail2.php $subject $address $data & "); 実際に100件程のアドレスに向けて送信しましたが、送信処理は正常に動作しているようですがバックグラウンドで動いている気配がありません。 また、system関数の処理の前にコメントを表示したいのですが、実際に表示されるのは配送処理が終わってからとなっています。 system("/usr/local/bin/php webmail2.php $subject $address $data >/dev/null & "); ↑ これですと変数が受け渡しされませんでした。 先にコメントを表示するにはどうしたらいいのでしょうか?

    • ベストアンサー
    • PHP
  • バックグラウンドにて処理を行う方法

    アプリケーション削除時にバックグラウンドにて処理をさせる方法についてお知恵を拝借ください。 端末にインストールされているYahooツールバーを削除する方法を探しています。 別質問(http://okwave.jp/kotaeru.php3?q=2059564)にて 下記レジストリキーを実行することで削除する方法は確立できましたが、 この方法であればアンインストールウィザードが表示されてしまいます。 [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\UninstallString] [rundll32.exe C:\PROGRA~1\Yahoo!\COMPAN~1\Installs\YCOMP5~1.DLL,DllCommand ui] バックグラウンドにて処理を行い、ユーザー作業が発生しないことを考えています。 バッチ処理をバックグラウンドで実行させる方法はございませんでしょうか。お知恵を拝借ください。

  • PHPのバックグラウンド処理でタイムエラー?

    PHPで定期的にサイトの更新を把握するため、fopenで呼び出すプログラムを作っています。 SYSTEM関数でバックグラウンド処理を行っているのですが1時間くらいするといつのまにか処理がストップしてファイルへの出力がとまってしまいます、タイムエラーにしては毎回停止する時間が違うので他の原因のような気がするのですが・・・ なにが原因かわかる方いませんでしょうか?回答よろしくお願いします。

    • ベストアンサー
    • PHP
  • PHPでバックグランド処理

    PHPでバックグラウンド処理をSYSTEM関数で行っていたのですがサーバーの変更をしてからSYSTEM関数が動作しなくなってしまいました(´;ω;`) なのでSYSTEM関数以外でバックグラウンド処理はできないでしょうか?よろしくお願いします(m。_。)m ↓旧サーバーで使用していた奴です system("/usr//bin/php /home/member/ユーザーID/public_html/melmaga.php");

    • 締切済み
    • PHP
  • WindwosXPのバックグラウンドデフラグ

    WindowsXPはバックグラウンドで勝手に デフラグを実行している, (C:\WINDOWS\system32\dfrgntfs.exe) と聞いたのですが, これをしないようにするには どうすればよいでしょうか? よろしくお願いします.

  • system で実行したプログラムの標準出力を変数で受け取りたい

    実行結果を標準出力に出力する cプログラム A があります。 perl から system を利用して A 呼び出し、その実行結果を perl で加工する仕組みを考えています。 今のところ、標準出力を一旦変更して、テンポラリのファイルに出力させ、再度そのファイルをオープンして perl で利用するという形で何とか実現できています。 open (SAVESTDOUT, ">&STDOUT") or die "..."; #(1) open (STDOUT, ">$tempFile") or die "..."; #(2) system "A"; #(3) close(STDOUT) or die "..."; #(4) open(STDOUT, ">&SAVESTDOUT") or die "..."; #(5) という感じです。 一旦テンポラリーのファイルを介するところがスマートでないので、直接変数に標準出力結果を落したいです。 (1) そのまま (2) 標準出力を perl の変数に変更 (3) そのまま (4) なし (5) そのまま といった感じで実現したい(もちろんより良い解法があれば尚宜しいです)のですが、可能でしょうか? ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Perl
  • PHPプログラムの呼出

    PHPのプログラムの中で、別のPHPプログラムを自動的に呼び出し、引数も渡したいのですが、その方法を教えてください。 関数system()では、戻り値しかないようなので、どの関数を使えばいいのでしょうか? また、呼び出された方(子プログラム)の中で、その引数を参照する方法も教えてください。

    • 締切済み
    • PHP
  • win8.1 バックグラウンドで作動するもの

    ハードディスクを新品にしwindows 8.1を3月25日に新しくインストールしました。 バックグラウンドで何らかの処理を勝手に作動させたくないので、わかるものはすべて作動しない設定に変更しています。 次のものの作動を止めています。 「インデックスサービス」を無効化 システムの復元を無効化 自動クリーンアップ機能を無効化 ディスクのデフラグ自動実行の無効化 この状態で朝4時30分に自動で起動させ、タスクスケジューラーを使ってperlを動かしています。 朝7時ころに目を覚ましパソコンをチェックすると通常は処理が終わっているのですが、3月27日の金曜日は動作が遅くなっており処理が完了していませんでした。 タスクマネージャーを開いて確認するとSYSTEMが大量のリソースを使っていました。 この日の確認はここまでで、遅いなりに処理が完了するのを待ちました。 それ以降は問題なく、タスクマネージャーを確認しても異常なく、処理が遅くなることもなかったのですが本日4月3日の金曜日にまた動作が遅くなってしまい、SYSTEMが大量のリソースを使っています。8時30分位までこの状態が続きました。 タスクマネージャーのSYSTEMの上で右クリックしプロパテイを開くと作動しているのはntkrpamp.exeでした。 タスクスケジューラーで毎週金曜日に動作するタスクとか、ntkrpamp.exeが動作するタスクを探したのですが見つかりません。 何かがバックグラウンドで動いているのは間違いないと思うのですが対処方法がわかりません。 ご存知のかたよろしくおねがいします。