2

これに対する最善の解決策はわかりませんが、これが私がやったことです。

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 時間かかる場合があります。

4

2 に答える 2

0

正しく理解しているかどうかはわかりませんが、提案があります。優先順位のプレフィックスが付いたロックファイルを取得します。

例: 10-script.phpが開始されました

20-script.phpが開始されました( 10-foobar.ext.lockを待機するループに入ります)

10-foobar.ext.lockは10- script.phpによって生成されませんが、まだ待機中です

30-script.phpは10-foobar.ext.lock20-example.ext.lockを待つ必要があります

cygwinでpcntl_forkを見つけようとしましたが、機能するものが見つかりませんでした

于 2011-09-13T04:19:50.010 に答える
0

.lock ファイルを作成するのではなく、ローダーが zip ファイルの処理を開始するときに、zip ファイルの名前を変更するだけです。例: "foobar.zip.bar" の場合、ディスク上に新しいファイルを作成するよりも処理が速くなります。

ただし、ファイルの名前を変更した後に次のローダーが読み込まれることを保証するものではありません。少なくとも、別のスクリプトで新しいローダーをロードするいくつかのコントロールが必要です。

また、CURL を使用して PHP でスレッド化をエミュレートすることも可能です。ぜひ試してみてください。

https://web.archive.org/web/20091014034235/http://www.ibuildings.co.uk/blog/archives/811-Multithreading-in-PHP-with-CURL.html

于 2011-09-14T14:18:51.067 に答える