• ベストアンサー

シェルスクリプトからPHP実行

シェルスクリプト(bash)内で、以下のようにPHPを呼んだ場合、 その次の処理がPHPの終了を待たずに実行されるようなのですが、 どうしてでしょうか? #!\bin\bash /usr/local/php4/bin/php /home/test.php echo "test!" 以上 なぜか test! という表示がPHPの処理中に出るように思えます。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.4

>もしかしたらPHPとJavaが並列処理されていてその関係でエラーになっているのかと、、、。 そんなことはないので、原因は別の所にあります。 さまざまな原因が考えられますので、ひとつひとつつぶしていくんでしょうね。 >ちなみに重複するようなデータは入れていません。(これは何度も確認しました) これが絶対に正しいのであれば、 >insert処理を実行すると、重複エラーになるのです。 このエラーは実際には重複エラーではないのでしょう。Javaプログラムのデバッグですね。

tama2002
質問者

お礼

いまさらですが、ありがとうございました。 お礼をするのを忘れていました。。。

tama2002
質問者

補足

返信ありがとうございます。 確かにPHPとJavaは並列には動いていないようです。 しかし、PostgreSQLの方はどうでしょうか? 実際に起こっているエラーはこちらです。 duplicate key violates unique constraint "test_pkey" 重複エラーと怒られています。。。 ちなみにPHPの後に記述していたJavaの処理をやめて、1時間ずらしてから Javaを実行したらエラーにならなくなりました。 そこで私の予想では、 PHPで行っているDB内の全テーブルの全項目に対するUPDATE処理が DB内部で別スレッドとして実行されていて、その完了を待たずにJava側から Insert処理をしたために、起こったエラーではないかと。。。 DBの仕様はまったくわからないのですが、実際に起こった現象からの 推測です。 この内容はDBのカテゴリーで質問した方が良いのでしょうか?

その他の回答 (4)

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.5

>処理の内容は、データベース内にある全テーブルを取得し >1テーブルづつ、すべての項目に対して全文検索のように検索し、 >ある値が入ってる項目をすべて別のある値にUPDATEするという >ちょっと重い処理です。 ちょっとトピックから外れますが、8.3 からは全文検索用のインデックスが作れるようになっていますよ。

tama2002
質問者

お礼

ありがとうございます。 こちらも調べてみたいと思います☆

  • notnot
  • ベストアンサー率47% (4848/10261)
回答No.3

>その次の処理がPHPの終了を待たずに実行されるようなのですが、 おそらく気のせいです。 test.phpの内容を書いてみてください。 また、どのような現象を目にして「なぜか test! という表示がPHPの処理中に出るように思えます。」と思ったのでしょうか?

tama2002
質問者

お礼

いまさらですが、ありがとうございました。 お礼をするのを忘れていました。。。

tama2002
質問者

補足

すみません、サンプルではきちんと動くようですので、 本処理を記述します。 test.php内では、データベース接続しています。 ちなみにPostgreSQL8.2.4です。 処理の内容は、データベース内にある全テーブルを取得し 1テーブルづつ、すべての項目に対して全文検索のように検索し、 ある値が入ってる項目をすべて別のある値にUPDATEするという ちょっと重い処理です。 そしてこのPHPが終わったあとで、 「シェル」内から、Javaを呼び出します。(PHPではありません) そして、Java内で先ほどのデータベースに接続し、insert処理を 実行すると、重複エラーになるのです。 ちなみに重複するようなデータは入れていません。(これは何度も確認しました) 原因がわからなかったので、もしかしたらPHPとJavaが並列処理されて いてその関係でエラーになっているのかと、、、。 よくわかりません。。。

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.2

いや、だから、 --- #!/bin/bash /usr/local/php4/bin/php /home/test.php echo "test!" --- のなかの test.php に相当するものを作って試しましたが、 ここで言われている "test!" が一番最後に表示されましたよ ということです。

tama2002
質問者

お礼

ありがとうございます。 そうですか、、、確かにサンプルでは"test!"が最後に出ました。 すみませんでした。

  • junkUser
  • ベストアンサー率56% (218/384)
回答No.1

以下のスクリプトでは並列実行は起こりませんでしたよ。 --- <?php for($i = 0; $i < 10000; $i++){ echo "No. $i\n"; } ?> --- PHPスクリプトに並列実行を起こすようなコードが入っているのではないでしょうか。forkとか

tama2002
質問者

お礼

いまさらですが、ありがとうございました。 お礼をするのを忘れていました。。。

tama2002
質問者

補足

すみません、逆です。。 PHP内でシェルを実行するのではなく、 シェルからPHPを実行する場合についてです。 PHPの終了を待たずに次の処理に行っているのではないかという質問です。 すみませんが、よろしくお願いします。

関連するQ&A

  • シェルスクリプトの1行目に#!を書いてもダメなのはなぜ?

    test.shというシェルスクリプトを #!/bin/bash echo "bash test" のように書き、chmod +x test.shを実行し、 test.shと入力すると、bash testが表示されるはずですが、 エラーbash: test.sh :command not found が出ます。which bashでパスを見ると /bin/bashなので、問題ないはずなんですが。 ちなみに、bash test.shと入力すると、正常に実行されます。 同様のことがperlスクリプト #!/usr/bin/perl print "perl test\n"; についても起こります。 何か設定がまずいのでしょうか? RedHatLinux7.2を使用しています。

  • シェルからPHPを実行したときの戻り値について

    PHPについては、かなり初心者です。 とんちんかんな質問をするかもしれませんが、 ご容赦ください。 今、linux系のOSで、 シェルスクリプトからPHPを実行する処理を作っています。 「/usr/local/bin/php xxxx.php」 という感じです。 この戻り値を、「$?」で取得すると、 正常に終了した場合は「0」、 処理が落ちた場合は「255」 が表示されるようなのですが、 この戻り値について、0、255以外の値を戻したいと思っています。 PHP内部で、特定の条件に当てはまった場合は、「2」をreturnしたいと思っています。 そのreturn値を使って、シェルスクリプトでif文で、判定処理を行いたいのです。 シェルスクリプト側で、PHPでの処理結果を変数に受ける方法があれば、 必ずしも「$?」を使う必要はないのですが・・・、 「$?」で「2」を取得できるのが一番理想です。 何か方法をご存知の方がいらっしゃいましたら、 よろしくお願いします。

    • ベストアンサー
    • PHP
  • Linuxでシェルスクリプトがフルパスだと実行できない

    Linuxでシェルスクリプトがフルパスだと実行できない こんにちは 現在linuxでシェルスクリプトを記載していて、やっと出来た!と思ったら、なぜかフルパスで実行すると失敗します。 中身は例えば #!bin/sh echo "hello" とし、ファイル名をtest.shとします。 実行時にカレントからだと上手くいきます。 ./test.sh ただし、フルパスで実行するとうまくいきません。 ./home/user/test.sh エラーは以下 bash: ./home/dv3/tet.sh:No such file or directory 所有者はrootでグループもrootにしてあります。 シェルの権限は755にして、rootで実行しています。 なぜカレントだと上手くいき、フルパスだと上手くいかないのでしょうか? パスが必要なコマンドも入っていないのに。。。 どなたかご教授いただけると幸いです。 宜しくお願い致します。

  • シェルコマンドでphpを実行したい!

     さくらインターネットでcron設定を使って月末になると起動するphpを読み込もうとしたいのですが、どうやっても上手くいきません。 いろいろと参考になるサイトはあるのですが、動かない理由がわからないのでどなたか教えてください。  まず、cron設定で設定しているシェルのファイルが置いてあるパスに間違いはありません。  次にシェルファイルに書いてあるコードは以下です。 #!/bin/sh PATH=/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/bin cd /home/自分のID/www/自分で作ったフォルダ/; ./自分で作ったフォルダ/phpファイル という風に書いてあります。 ところが、時間になるとこれが実行されず、 サーバーよりエラーメールが届きます。 [not found]と一言。 …最初、シェルファイルの階層が間違っているかと思ったのですが、 どう見てもあってますし…中身が問題なのかなぁ、と考えます。 何かわかれば、是非教えてください。 お願いします。

    • ベストアンサー
    • PHP
  • シェルスクリプトでPHPを実行したい

    シェルスクリプトでPHPを実行したいのですが、うまくできません。 centos5でcrontabに 20 0 * * * /bin/sh /var/www/html/test/test.sh と登録しています。 cronのlogをみたところ Dec 12 00:20:01 localhost crond[19060]: (root) CMD (/bin/sh /var/www/html/test/test.sh) と記録されていてここまでは問題ないように思えます。 test.shの中身は #!/bin/sh cd /var/www/html/test/ php -f daily.php > result exit になっています。 daily.phpが実行されないので、daily.phpに何かおかしなところがあるのかと思い daily.phpを直接ブラウザから起動してみたところ問題なく処理されました。 このような経緯でtest.shの中身が間違っていると思っているのですがどこが間違っているのか分かりません。 どなたかアドバイス頂けると助かります。

  • シェルスクリプトの1行目

    シェルスクリプトの1行目に#!/bin/bashと書くと思うのですが 環境によってbashのパスが違うのですが、そのような場合は2つ書くことは可能でしょうか? 例えばLinuxなんかは#!/bin/bashですよね? Macだと#!/bin/bashだと3系なので古いので5系をインストールすると#!/usr/local/bin/bashになるんです 1台のパソコンで使ってる分には問題ないですが他の環境で使う場合2つ書くにはどうしたら良いでしょうか?

  • シェルで.bashrcが読めません。

    FreeBSD4.5で、 /home/me/の下に以下のシェルをファイル名1で作成し実行してもsuまでしか動きません。 パスもあっているのですが、原因は何が考えられますか? #!/bin/sh /usr/local/bin/sudo su www /usr/local/bin/bash source /home/me/.bashrc

  • [シェルスクリプト内で bashコマンド後のコマンドが実行されない]

    [シェルスクリプト内で bashコマンド後のコマンドが実行されない] 以下の様にシェルスクリプトを記述するとコマンド2が実行されません。 #! /bin/sh コマンド1 bash コマンド2 bash環境でコマンド2を実行させるにはどうしたら良いのでしょうか?

  • 簡単なシェルスクリプトを見てください。

    次のようなシェルスクリプトを作成しました。 #!/bin/sh echo [$1] awk '/"0312345678"/ {print}' /test > /test1 awk '/$1/ {print}' /test > /test2 のように簡単なスクリプトです。 $ sample \"0312345678\" で実行させたら、echo では"0312345678"に出力されます。 しかし、test1にはちゃんと結果が入っていますが、test2は空のファイルです。 なぜ、結果が違うのですか? 実行時、引数を渡す方法で、test1と同じ結果を得たければ、どうすればいいのですか?

  • シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。

    シェルスクリプト(Bash偏)の実行ファイルに関するご質問があります。 ファイル名を変更するシェルスクリプトをbashで行おうとプログラムを作成したのですが、 実行するとbad interpreter: ディレクトリではありません とメッセージが出て終了します。記述に誤りがあるのか、実行の仕方が悪いのか分かりません。教えて下さい。 シェルの記述内容は ファイル名をtest.sh #!/bin/bash/ -f mv A.txt A.ori exit 実行方法として #>chmod x+a test.sh #>./test.sh で行いました。そうしたら、bad interpreter: ディレクトリーではありません とメッセージが出ます。 ちなみに #>. test.sh で実行するとターミナルがシェルの実行と同時に閉じてしまいますが、シェルを実行したディレクトリーを確認すると、処理が終わっておりました。