プロが教えるわが家の防犯対策術!

シェルスクリプト(bash)内で、以下のようにPHPを呼んだ場合、
その次の処理がPHPの終了を待たずに実行されるようなのですが、
どうしてでしょうか?

#!\bin\bash

/usr/local/php4/bin/php /home/test.php

echo "test!"
以上

なぜか test! という表示がPHPの処理中に出るように思えます。

A 回答 (5件)

以下のスクリプトでは並列実行は起こりませんでしたよ。


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

この回答への補足

すみません、逆です。。

PHP内でシェルを実行するのではなく、
シェルからPHPを実行する場合についてです。
PHPの終了を待たずに次の処理に行っているのではないかという質問です。

すみませんが、よろしくお願いします。

補足日時:2008/07/04 18:39
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/19 23:39

いや、だから、


---
#!/bin/bash

/usr/local/php4/bin/php /home/test.php

echo "test!"
---
のなかの test.php に相当するものを作って試しましたが、
ここで言われている "test!" が一番最後に表示されましたよ
ということです。
    • good
    • 0
この回答へのお礼

ありがとうございます。

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

お礼日時:2008/07/05 12:19

>その次の処理がPHPの終了を待たずに実行されるようなのですが、



おそらく気のせいです。

test.phpの内容を書いてみてください。

また、どのような現象を目にして「なぜか test! という表示がPHPの処理中に出るように思えます。」と思ったのでしょうか?

この回答への補足

すみません、サンプルではきちんと動くようですので、
本処理を記述します。

test.php内では、データベース接続しています。
ちなみにPostgreSQL8.2.4です。

処理の内容は、データベース内にある全テーブルを取得し
1テーブルづつ、すべての項目に対して全文検索のように検索し、
ある値が入ってる項目をすべて別のある値にUPDATEするという
ちょっと重い処理です。

そしてこのPHPが終わったあとで、
「シェル」内から、Javaを呼び出します。(PHPではありません)
そして、Java内で先ほどのデータベースに接続し、insert処理を
実行すると、重複エラーになるのです。

ちなみに重複するようなデータは入れていません。(これは何度も確認しました)

原因がわからなかったので、もしかしたらPHPとJavaが並列処理されて
いてその関係でエラーになっているのかと、、、。
よくわかりません。。。

補足日時:2008/07/05 12:19
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/19 23:40

>もしかしたらPHPとJavaが並列処理されていてその関係でエラーになっているのかと、、、。



そんなことはないので、原因は別の所にあります。
さまざまな原因が考えられますので、ひとつひとつつぶしていくんでしょうね。

>ちなみに重複するようなデータは入れていません。(これは何度も確認しました)
これが絶対に正しいのであれば、
>insert処理を実行すると、重複エラーになるのです。
このエラーは実際には重複エラーではないのでしょう。Javaプログラムのデバッグですね。

この回答への補足

返信ありがとうございます。

確かにPHPとJavaは並列には動いていないようです。
しかし、PostgreSQLの方はどうでしょうか?

実際に起こっているエラーはこちらです。
duplicate key violates unique constraint "test_pkey"

重複エラーと怒られています。。。
ちなみにPHPの後に記述していたJavaの処理をやめて、1時間ずらしてから
Javaを実行したらエラーにならなくなりました。

そこで私の予想では、
PHPで行っているDB内の全テーブルの全項目に対するUPDATE処理が
DB内部で別スレッドとして実行されていて、その完了を待たずにJava側から
Insert処理をしたために、起こったエラーではないかと。。。

DBの仕様はまったくわからないのですが、実際に起こった現象からの
推測です。
この内容はDBのカテゴリーで質問した方が良いのでしょうか?

補足日時:2008/07/07 10:57
    • good
    • 0
この回答へのお礼

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

お礼日時:2010/09/19 23:40

>処理の内容は、データベース内にある全テーブルを取得し


>1テーブルづつ、すべての項目に対して全文検索のように検索し、
>ある値が入ってる項目をすべて別のある値にUPDATEするという
>ちょっと重い処理です。

ちょっとトピックから外れますが、8.3 からは全文検索用のインデックスが作れるようになっていますよ。
    • good
    • 0
この回答へのお礼

ありがとうございます。

こちらも調べてみたいと思います☆

お礼日時:2008/07/07 11:08

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!