• ベストアンサー

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

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

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答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% (4900/10358)
回答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