0

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

コマンドの 1 つを使用すると、ユーザーはフォントをあるファイル形式から別のファイル形式に変換できます。

$command = "fontforge -c 'Open($1); Generate($2)' ".$format1." ".$format2;
shell_exec($command);

ユーザー A が FONT A を開き、ユーザー B がすぐに FONT B を開くと (ユーザー A の Generate() コマンドが呼び出される前に)、ユーザー A が誤って FONT B を受け取るのではないかと心配しています。フォント。

4

1 に答える 1

1

2人のユーザーが衝突するだけでなく、1人のユーザーが複数のリクエストを介して自分自身と衝突することを心配する必要があります。

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

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

(ポリシーを介して)同時リクエストを気にせず、単に衝突を回避したい場合は、デーモンを放棄し、PHPスクリプトで、リクエストごとに新しく作成された一意の名前のフォルダーにフォントファイルをコピーしてから、結果のフォントをコピーすることができます。完了時にそれから。

于 2011-12-08T16:58:54.820 に答える