2011-12-08 21 views
0

PHPのshell_exec()を使用してFontForgeシェルコマンドを実行するWebアプリケーションがあります。潜在的な並行性の問題が心配です。 shell_exec()をユーザーごとに一意のインスタンスにする方法はありますか?PHPのshell_exec()との同時実行

USER AはFONT AとユーザBを開いた場合は、直ちに生成する前に、フォントBを(開くこと
$command = "fontforge -c 'Open($1); Generate($2)' ".$format1." ".$format2; 
shell_exec($command); 

私は心配です(:コマンドの

一つは、ユーザーが別のファイル形式からフォントを変換することができます)コマンドが呼び出された場合)、FONT Bは現在「オープン」フォントであるため、USER Aは誤ってFONT Bを受け取ることになります。

+0

どのようなコマンドを実行していますか?彼らは何をしますか? –

+0

これは異なるPIDを持つでしょう。それ以外はどうやって問題になりますか? – Gajus

+0

例を使って投稿を更新しました... –

答えて

1

あなたは2人のユーザーが衝突するのを心配するだけでなく、1人のユーザーが複数の要求によって自分自身と衝突することを心配する必要があります。

ユーザーごとに1つのフォントアクション要求を強制するには、pidのようなファイルを作成することができます(プロセスIDの代わりにユーザーIDを使用します)。または(データベーステーブルなどの)要求のキューを作成します。デーモンに、特定のユーザーによる要求に対して、このキューを定期的にチェックする(working列を1に設定する)ようにしてください。ユーザーと衝突ごとに固有の一時的な作業ディレクトリとこれを組み合わせることは考えにくいでしょう。

いずれの方法でも「スタック」する可能性があります(プロセスが終了してメカニズムをクリアできる)。これは、デーモンプロセスが再起動時にworkingフラグをクリアすることで対処できます。

あなたは(ポリシー経由)の同時要求心配じゃないし、単に衝突を避けたい場合は、任意のデーモンを見送ることができ、は、PHPスクリプトを持って、要求ごとに新たに作成された一意の名前のフォルダにフォントファイルをコピー完了したら、それから結果のフォントをコピーします。

+0

一人のユーザーは一度に(ポリシーの問題として)一つのフォントしか変換できないので、私は複数のユーザー間の衝突について心配しています。残念ながら、私はこのキューを実行する唯一の方法だと思います。上で述べたように、FontForgeは一度に1つのフォントを「開く」と定義しています。どのコマンドも 'open'フォントでのみ動作するので、一意のファイル名だけでは問題は解決しません(PHPでuniqid()コマンドを使用して独自のファイル名を作成しています)。 –

+0

これについて考えると、2つのシェルコマンドを同時に実行することは可能ですか?自然にもう一方を待つことはありませんか? –

+0

2つの異なるWeb要求によって呼び出された場合、それらは絶対に同時に実行できます。 – webbiedave

関連する問題