これに対する最善の解決策はわかりませんが、これが私がやったことです。
PHP を使用して、zip ファイルを含むディレクトリを調べています。
これらの zip ファイルには、SqlLoader (sqlldr) を介して Oracle データベースにロードされるテキスト ファイルが含まれています。
コマンドラインから複数の PHP プロセスを開始して、これらの zip ファイルをデータベースにロードできるようにしたいと考えています。
他の「php ローダー」プロセスが実行されている場合、重複して同じ zip ファイルをロードしようとするべきではありません。1 つのプロセスを開始して各 zip ファイルを処理できることはわかっていますが、同時にロードできるように、受信する zip ファイルに対して新しいプロセスを開始したいと考えています。
今、'filename.ext.lock' という名前のファイルを作成して、zip ファイル、ディレクトリ、または一般的なテキスト ファイルを 'ロック' するクラスを作成しました。起動する他のプロセスは、ファイルがこのように「ロック」されているかどうかを確認します。ロックされている場合は、そのファイルをスキップして別のファイルに移動して処理します。
ディレクトリを使用して「プロセスID」ファイルを作成するクラスを作成しました。これにより、各PHPプロセスは、ログの目的で使用できるIDを持ち、どのPHPプロセスがファイルをロックしたかを識別できます。
私はWindowsマシンを使用していますが、これをubuntuマシンにする予定はありません.pcntlを提案する人のために.
他にどのような解決策がありますか? ロックファイルが作成されようとしている可能性があり、コンテキストスイッチが発生し、最初のPHPプロセスがロックファイルを作成する前に別のPHPプロセスがファイルを「ロック」するため、これは完全に同期されていないことがわかります。
このソリューションを改善するにはどうすればよいか、アイデアを教えてください。Java実装?アーラン?
また、言及するのを忘れていましたが、PHP プロセスは DB に接続して、SqlLoader を介してロードしようとしているファイルに関するメタデータをフェッチします。それは重要ではないと思いますが、念のため。
簡単なメモ: sqlldr はロードしているテーブルをロックし、複数のプロセスが同じテーブルにロードしようとするとボトルネックになることを認識しています。この問題を軽減するために、現在ロードされているテーブルの後にファイル名を含むディレクトリを作成する予定です。テーブルのロードが完了すると、それぞれのファイルが削除され、他のプロセスがそのテーブルを安全にロードできるかどうかをチェックします。
追加情報: 7zip を使用してファイルを解凍し、php の exec を使用してこれらのコマンドを実行しています。
exec を使用して sqlldr も呼び出しています。
zip ファイルは巨大 (1 GB) になる可能性があり、1 つのテーブルをロードするのに最大 1 時間かかる場合があります。