• ベストアンサー

PHPでexecやpassthruすると

execやpassthruで実行した実行プログラムが終了するまで待たされると思いますが バックグラウンドで実行する方法はあるでしょうか? PHPはその行で止まらずに実行プログラムとは別に以降の行を実行するということです 要するにexecは実行プログラム実行のトリガーをかけるだけにしたいのです もしあったら具体的に数行以下のコードで教えてください よろしくお願いします

  • reiman
  • お礼率73% (794/1076)
  • PHP
  • 回答数3
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

戻り値を得る必要がないならOSごとのバックグラウンド処理にまかせればよいのでは? UNIX系なら「コマンド &」、Win系なら「cmd /C コマンド」のような・・・

reiman
質問者

補足

Linux+apache+php+postgresqlで行います PHPでユーザからのリクエストに応じて実行プログラムを実行して その結果をPostgresqlに記述して PHPでその内容をユーザが要求したときに見せるということをしたいのです 単にプログラムを実行してその結果を自分が知るということは常にやっていますが そういうことではないのです ウェブアプリの重い部分を高速化のためC言語で作ったコマンドに肩代わりさせたいのです

その他の回答 (2)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

それと、本当にそれが速いのか、詳しく調査した方がいいですよ。 外部プログラムを呼び出すコストって結構ばかになりません。下手すると、Cで書いて短くなった時間よりも、プログラム呼び出すための時間の方長いってことがあります。

reiman
質問者

お礼

ありがとうございます 一回の呼び出しで重いプログラムを実行するので 呼び出しのコストは吸収されると思います とにかく念のため時間計測も行ってみたいと思います

回答No.2

No.1さんの通り、systemやexecやpassthruは シェル上でコマンドを実行しているのと同じなので、 バックグランド実行させたいなら、プラットフォームがLinuxならLinuxのコマンドの流儀通り system("/パス/コマンド 引数 &"); または exec("~  &"); または passthru("~ &"); となります。 ちなみに、このままだと実行権限がhttpdのオーナー(通常apache)での実行になりますが、 実行権限も変えたいときは事前にsudoers(詳細省略)を設定しておいて system("sudo -u user名 /パス/コマンド >> /パス/ログファイル &"); という感じです。

reiman
質問者

お礼

ありがとうございます やってみたいと思います

関連するQ&A

  • PHPのexecで別PHPの実行

    「エックスサーバー」というレンタルサーバーを使用しています。 PHPファイルの中で[exec()]関数を用いて、別ファイルのPHPを実行させたいと考えております。  ・PHPバージョン:5.3.3  ・ドメイン:XXXXX.xsrv.jp 以下の内容(ProgramA)を実行すると、 [exec()]関数で呼び出している処理(ProgramB)が実行されていないように思います。 どのように修正したら、(ProgramB)が実行されるのでしょうか? どうかご教示くださいませ。 ---ProgramA.php (起動する側)---------------------- <?php exec('/usr/bin/php5.3 /home/XXXXX(ユーザー名)/xsrv.jp(ドメイン)/public_html/AAA/BBB/ProgramB.php'); echo "test!"; ?> ※ProgramA.phpを実行すると、ブラウザには「test!」という文字列が表示されます。 ※ProgramA.phpのパーミッションは755に設定されています。 ---ProgramB.php (起動される側)---------------------- <?php echo"HelloWorld"; ?> ※ProgramB.phpのパーミッションは755に設定されています。

    • 締切済み
    • PHP
  • PHPのexec()関数

    phpスクリプトで $command = "./child.php 2>&1"; exec($command, $outstr, $rtn); のような感じで別の phpスクリプトを実行しようとしています。 (child.php は単独では問題なく実行できています) しかし、child.php を 通常の phpファイルのように <?php で開始すると $rtn = 2 で line 1: ?php: No such file or directory というエラーが帰ってきます。 1行目にシェバング行 #!/usr/local/bin/php7.3 を追加すると $rtn = 126 で "/usr/local/bin/php7.3: bad interpreter" のようなエラーになります。 php のパスはサーバーのマニュアルやユーザーページで 確認する限り間違っていないと思います。 (バージョンを外したり、変えたりしてみましたが同じです) どこが間違っているのか、わかる方がいましたら アドバイスをお願い致します。

    • ベストアンサー
    • PHP
  • exec()で他ディレクトリのexeプログラムを実行したい

    url2bmpという、指定したURLのスクリーンショットを作成できるコマンドライン対応のソフトを使用しています。これをPHPから実行させたく、exec()関数を使っています。PHPプログラムとexeプログラムは同じ階層にあり、コードは exec("url2bmp.exe 以下、引数"); のようにしており、問題なく動作していました。 その後、url2bmp.exeを1階層下のフォルダに移し、コードも修正したのですが、動かなくなってしまいました。コードは以下の通りで exec("kasou/url2bmp.exe 以下、引数"); ディレクトリ指定は間違っていないはずであり、原因は明らかにurl2bmp.exeがPHPプログラムと同じディレクトリにないことなのですが、これの対処法は存在しないのでしょうか?同じコードをコマンドプロンプトで実行するとうまくいくのに、exec()関数では動かないという点に納得がいきません。

    • ベストアンサー
    • PHP
  • PHPでexec関数の記述方法について

    phpでexec関数を使う時に、コマンドの記述を、 exec("xxx -yyy zzz"); と記述すると上手く動きますが、 exec("xxx -yyy zzz"); と改行を含むと正しく実行されません。 exec関数は改行させた記述は不可能なのでしょうか? とても長いプログラムになってしまって困っています。 どうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • phpで外部phpを稼働させる方法について

    初心者です、宜しくお願いします。 外部でメールを送信するプログラムを利用者にストレスが無いようにバックグラウンドで稼働させたいと考えています、   自分なりに調べて、exec関数でテストプログラムを作ってみましたが記述の方法に誤りがあるのか動きません、 sampleプログラム (test.php) <?php exec("nohup php -c '' 'sendmail.php' > /dev/null &"); ?> sendmail.phpは自分宛に送信するよう簡単に作ったプログラムで test.phpと同じディレクトリに設置してあります、 単独で実行するときちんと届きます、 パーミッションは双方とも、604に設定してあります。 どなたかご教授いただけると助かります。 宜しくお願い致します。

    • 締切済み
    • PHP
  • PHPからexecを使ってGnuPGを実行できない

    GnuPGをPHPからexec関数を使って実行しようとしていますが、exec関数がエラーになって GnuPGが実行されません。 ただしexec関数に渡すコマンドをコマンドラインから直接打ち込むと正常に実行されます。 具体的には $cmd = "/usr/local/bin/gpg --always-trust --batch --no-secmem-warning -e -a -r ユーザー名 ファイル名のフルパス"; $ret = exec( $cmd, $output, $ret_val ); ここで$retにFALSEが、$ret_valには2が返ってきます。 $cmdのコマンドをコマンドラインから実行すると正常に実行されます。 環境 Apache/1.3.27 (Unix) (Red-Hat/Linux) GnuGP 1.4.6 PHP Version 4.3.11(セーフモードはOff) 以上、よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PHPのexec();をつかってアプリケーションを起動したい。

    サーバーにインストールされたプログラムを起動させたいのですが、うまくいきません。 PHPでバッチファイルを開いて、プログラムを起動させるようにしているのですが、アクセス権限がないのか、ファイルが開かず、web画面も止まってしまいます。 <?php exec('xxx.bat'); ?> 【環境】---------------- Windows Server 2003 R2 Apache2.2 PHP5 ------------------------ サーバーから直接"http://localhost/"や"http://IPアドレス"でアクセスした場合は動くのですが、別PCや、リモートデスクトップでアクセスした場合には動きません。 インターネットゲストアカウントはフルコントロールにしているのですが他にも設定で足りないところがあるのでしょうか。 どのたかご教示お願いします。 ※起動したいプログラムは処理が終ったら自動終了します。

  • Linux:PHPでTELNETによるSMTP結果取得について

    度々利用させていただいています。 以下質問、ご存知の方がいましたら 是非是非教えてください。 今現在、PHPプログラムにおいて [TELNETを使用したSMTPコマンド発行]プログラムを 作成しています。 そこで一つ解決できない問題が生じてしまいました。 問題:   今現在使用しているコマンド発行関数は「system()」関数です。   引数には('telnet hogehoge.jp 25')としています。   出力結果としては・・・     Trying 127.0.0.1...     Connected to helpserve.jp.     Escape character is '^]'.   と出力されます。   しかし、ターミナルソフトを使用してtelnet hogehoge.jp 25を   実行すると・・・     220 hogehoge.jp ESMTP Postfix   と、実行結果コードが出力されます。   この「220」が出力結果としてほしいのですが   どうしても取得出来ません。   色々とその辺の(exec,passthru,shell_exec)関数を試して   みたのですがどうしても取得することが出来ませんでした。      そこで、どうすれば取得できるのご存知の方、是非   お知恵を拝借したいと思います。   (すごい推測ですが、もしかして220のコードは    TELNETが出力しているから取得できない・・・    そんな気はしています。) 環境:  OS:FwdoraCore3  PHP:Ver.5.1.6 なにとぞ、よろしくお願いします。

    • 締切済み
    • PHP
  • PHPからシェルコマンドの実行

    PHPからシェルコマンドを実行したいのですが SSHやSCPコマンドが使えません。 phpからlsなどは問題なく実行できます。 具体的には以下のように書いています。 `scp test.log user@host:/home/hoge`; shell_exec()を使っても実行されませんでした。 環境は以下のとおりです。 PHP 5.4.17 CentOS 5.8 sshやscpコマンドをphpから実行するには何か特別な方法が必要なのでしょうか。 ご存知の方、教えてください。

    • ベストアンサー
    • PHP
  • ブラウザから非同期プログラムを流す方法がわかりません

    ブラウザで確定ボタンを押した際、 バックグラウンドで20秒くらいかかる 長いプログラムを走らせたいのですが、 どうすれば実現できるでしょうか? UNIXだと? ・passthru("php batch.php >/dev/null "); Windowsだと方法はないでしょか?

    • 締切済み
    • PHP

専門家に質問してみよう