• 締切済み

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が消せればこの方法でもいいのですが… とにかく実現できればいいのですが… わかる方がいたら教えてくださいお願いします。

  • PHP
  • 回答数1
  • ありがとう数1

みんなの回答

  • kalkichi
  • ベストアンサー率64% (22/34)
回答No.1

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

参考URL:
http://www.miuxmiu.com/archives/tag/background
smatosan
質問者

お礼

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

関連するQ&A

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

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

    • 締切済み
    • PHP
  • 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
  • PHPでバックグランド処理について

    PHPでバックグランドで処理させたいと考えています。 300通前後のメールを一括送信するために、この送信処理をバックグランドで処理させたいと考えています。 色々調べて、 system()関数とexec関数を知りました。 しかし、動きが上手くいきません。解決策や糸口をご教授頂けないでしょうか? メールを送るファイル: back.php フロントで実行するファイル:mai.php で下記の様に書きました。 back.php <?php require_once('Mail.php'); $params = array( "host" => "smtp.gmail.com", "port" => 587, "auth" => true, "username" => "****@gmail.com", "password" => "****" ); $mailObj = Mail::factory("smtp",$params); mb_language('ja'); mb_internal_encoding('utf-8'); $rec ='**_com2@yahoo.co.jp'; $header = array( "To"=>$rec, "From"=>"admin@**-terakoya.jp", "Subject"=>mb_encode_mimeheader('これは件名') ); $com = 'メール本文'; $com = mb_convert_encoding($com,"UTF-8","auto"); $mes =$mailObj -> send($rec,$header,$com); if(PEAR::isError($mes)){ echo '<pre>'; var_dump($mes->getMessage()); echo '</pre>'; } ?> 実行するファイル mail.php var_dump(system("php www/htdocs/ac/back.php > /dev/null &")); です。 パスの指定方法が問題なのかもしれないと思い色々試してみましたが最終的には無理でした。 ちなみに、本番サーバーの環境とXampp環境では何か違う方法が必要なのでしょうか? 上記例は、本番サーバーで記述した物です。 どうぞご教授お願いします。

    • ベストアンサー
    • PHP
  • PHPバックグランド処理について

    初めて、質問させて頂きます。 コミュニティーサイトを運営しているのですが、登録メンバーが増えてきてメール送信の処理に時間がかかるようになってきました。 現在は、MYSQLのDBから 条件に会った人のアドレスを検出させて whileのループでmail関数で送信しています。 $result=mysql_query("**************"); while($value = mysql_fetch_array($result)){ $MAIL=$value["MAIL"]; mail($MAIL,$sbj,$msg,$header,"-fmail@mail.com"); } バックグラウンドで処理させる方法をインターネットで調べていたら 下記のURLにたどりつきました。 http://www.itboost.co.jp/phptips/view.php?fCID=21 呼び出しプログラムを mail.php 送信プログラムを send.php とし、mail.phpから ある条件下で send.phpを実行させるために system("send.php $1 $2 $3 $4 $5 > index.php &"); という感じにしてみましたが、うまくいきません。 パスの問題なのでしょうか?それとも根本的に間違っているのでしょうか? 解決策や、他の方法があれば教えてください。 お願いします。 環境:レンタルサーバ OS Redhat Linux Server Apache DB MYSQL PHP4.12 qmailは入っていません。

    • ベストアンサー
    • PHP
  • プログラムの処理時間を表示する

    Windowsのコマンドプロンプトで,プログラムの処理時間を表示する事ってできますか? ---------- a.exe ampl cooksched.run b.exe ---------- というバッチファイルを実行しているのですが,この一連の処理をする時間を表示させたいです. ちなみにa.exeとb.exeはC言語で書いたものをcygwinでコンパイルしたものです. 2行目の[ampl cooksched.run]というのは,AMPLという言語のバッチファイルみたいなものです. 説明が下手ですみませんが,何か分からない事がありましたら補足いたしますのでよろしくお願いいたします.

  • バックグラウンドにて処理を行う方法

    アプリケーション削除時にバックグラウンドにて処理をさせる方法についてお知恵を拝借ください。 端末にインストールされている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] バックグラウンドにて処理を行い、ユーザー作業が発生しないことを考えています。 バッチ処理をバックグラウンドで実行させる方法はございませんでしょうか。お知恵を拝借ください。

  • バックグラウンド処理を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
  • アクティブにしたいアプリケーションがある。

    現在、Windowを持つアプリケーションと通信を行うバッチプログラムを作成しています。このアプリケーションは両方とも自分で作成しています。 例えば、以下のようなアプリケーションです。 MyEditorというWindowを持つアプリケーションとconnect.exeというバッチプログラム。 MyEditorを起動して、コマンドプロンプトから、"connect.exe input a"とすると、MyEditorにaという文字を入力してconnect.exeが終了する。 このとき、connect.exeが終了すると、通常コマンドプロンプトがアクティブな状態になって、キーボードからの文字入力はコマンドプロンプトに入力されますが、これを、connect.exeが終了したときにMyEditorの方がアクティブになって、キーボード入力がMyEditorの方に行くようにすることはできるのでしょうか? つまり、以下のような動作にすることは、可能でしょうか? 1.MyEditorを起動 2.コマンドプロンプト起動 3.コマンドプロンプトでconnect.exe input aと実行 4.キーボードでbと入力するとMyEditorにbが入力される もし可能であるならば、その実現方法が知りたいです。 どなたかご教授いただけると、大変助かります。 よろしくお願いします。

  • PowerShell1.0での外部プログラム実行方法

    すいません、初歩的な質問で恐縮です。 以下のようなコマンドを実行したいのですが Powershell1.0の場合どのようにしたらよい のでしょうか? C:\hoge.exe -A100 -B200 -C300 -D400 D:\hoge.raw コマンドプロンプトですと普通に実行可能なのですが Powershellで上のをタイプしても The raw file is being acquired - .4 と表示されるだけで、C:\hoge.exeが実行できてない みたいです。また、 C:\hoge.exe D:\hoge.raw の場合はPowershellでも実行できるのですが、 C:\hoge.exeの引数である-A100とかをつけると ダメみたいです。よろしくお願いします。