外部からフォルダへデータファイルが新しく置かれたら(←A)Aを一度にMySQLへINSERTするPHP(←B)と、INSERT内容を元に編集するPHP(←C)を作りました。
これらを円滑且つ重複なく稼働する為、CRONから1分毎に呼び出されるシェルスクリプトでは上記各処理の動作中フラグがなければ、それぞれ呼び出す形にし、その際Bを呼び出す行下にはフラグファイル(B')を作成することで、Cの冒頭ではB'がなければ起動できないようにしました。
これでBが完了しなければCに進めないようにしたところ、確かにA→B→C順に動いたのですが、場合によってBでMySQLへINSERT中?にCへ進む場合がありました。結果C判定が異常になる場合が発生しています。
とりあえずCの手前にSleepを入れて対応しますが、根本的解決ではないので悩んでいます、
以上、抽象的な話で恐縮ですが、何かアドバイスいただければ幸いです。よろしくお願い致します。
ちなみにPHP5.3.3・Mysql14.14です。
SQL実行に失敗したまま続行している可能性があります。
http://piyopiyocs.blog115.fc2.com/blog-entry-657.html
エラーコードを拾うか、Exceptionを拾ってみてください
Bの処理が多重で動くことはないでしょうか?
Aのファイルが時間差で置かれたような場合とか。
Bの処理が動いているときは次のBの処理もブロックする必要があるかと思います。
あとトランザクション使った方が良いです。
phploveさんありがとうございます。
ログによると、Bが多重で動いていることはないようです。
ただ今までAが時間差で置かれたこともないですが。
Bの処理が動いているときは次のBの処理もブロックする処理は入れています。
トランザクションも入れています。
実際のソースを見てみないと何とも言えませんがCが終了しないうちに次のBが動いているのではないかと思います。
cronで定期的に起動するのはBだけにしておいて、BからCを呼び出す形にするべきです。
Bを呼び出す際には、BもCも動作中ではないことを確認するようにします。
ビ=ヨンセさんありがとうございます。
incronは初耳でした!
参考にさせていただきます。
ひとつまえのコメントは私ではありませんw
私の想定ではAはcronでの起動だろうと考えておりました。
きっちりとデータを置いたときの同期を取りたいのであれば、ファイルがあるかどうかの監視ではなく、なにかしらのプログラムを動かして「ファイルを置いた」というトリガーを受け付けてBの処理を起動するべきだとおもいます。
Bの処理をPHPで書くならApacheの元で動作させることができるわけですから、HTTPでリクエストを出してもらえばいいのではないかと思います。
deguchoさんありがとうございます。
2016/10/22 12:02:49エラーは出ませんでした。