0

私のアプリでは、ユーザーは一度に複数の写真をアップロードできます。

これらがサーバーによって受信されると、次のことが起こります。

  • アップロードされたすべての画像を処理する Gearman ワーカー ジョブがスケジュールされ、さまざまな切り抜きサイズが作成され、Lancosz フィルタリングが適用されてから最終的にディスクに書き込まれます。アップロードされた写真の数と解像度によっては、このプロセスに最大で約 10 秒かかる場合があります。
  • メインの PHP スレッド内で、アップロードされた画像を反映するようにデータベースが更新されます。

すべて正常に動作しますが、データベースが更新されるまでに Gearman ワーカーが完了するという保証はありません。つまり、データベースに画像を照会するページにユーザーがアクセスすると、画像リンクが壊れる可能性があります。

したがって、次のいずれかを行う必要があります。

  1. データベース更新コードを Gearman ワーカーに移動して、画像処理が完了すると完了するようにします。
  2. 一時的に、メインの PHP スレッドで、フル サイズの画像をすべての場所に配置し、フル サイズの画像をさまざまな異なるディレクトリ ("/assets/images/cropped/image.jpg"、"/assets/images/サムネイル/image.jpg" など) は、Gearman ワーカーが完了したときに、トリミングおよびフィルター処理された小さなバージョンで上書きされるのを待っています。

明らかな理由から、ソリューション番号 1 が最も理にかなっていますが、もちろん、ユーザーが画像をアップロードしてから実際にアプリケーション内で画像を表示できるようになるまでに遅延が発生する可能性があるという欠点があります。

したがって、これは実際には 1 つで 2 ~ 3 の質問です。

  • 解決策 1 または 2 が最善の方法ですか? もしそうなら、それはなぜですか? そして、私が見ていないこの状況を管理するためのより良い方法はありますか?
  • ソリューション 1 を使用する場合、ワーカー内でデータベースを更新することによって発生する潜在的な遅延を管理する方法はありますか?
  • 解決策 1 を選択した場合、私は PHP でのオブジェクト指向プログラミングに比較的慣れていないため、問題があります。以下に説明するように:

解決策 1 を実際に使用する場合は、メインのアプリケーション データベース クラスと memcached クラスのパブリック関数、および Gearman ワーカー自体を呼び出した関数のクラスに、すべて Gearman ワーカー内からアクセスできる必要があります。

たとえば、MySQL PDO データベース クエリを実行するメイン アプリで$query = new Query($sql);、値をバインドして実行するなどを使用します。そして、そのファイルの先頭にあるuse \App\Queryので、これらのパブリック関数にアクセスできます。他の例では、別の関数内から関数にアクセスしますが、self::functionToPerform();Gearman ワーカー スクリプトを使用する同じクラスでは、実際のアプリの外部にあるため、ワーカー内からこれらの関数にアクセスするにはどうすればよいでしょうか?

これは 1 つの質問から多くの質問をすることがわかっているので、十分に説明できていることを願っています。どんな助けでも本当に感謝します。

4

1 に答える 1

1

リアルタイムのアップロード/更新画像はどのくらい重要ですか? プロセス イメージの時間が ~10 秒の場合、ユーザーはこれに関する通知を表示できるためです。そして、画像の準備ができ次第、ウェブページが更新されます。

画像処理の作業員は、これだけの仕事をしなければならないと思います。DB 更新用のワーカーを作成できます。メッセージ キュー (RabbitMQ など) と通信できる 2 種類のワーカーになります。

アップロード プロセスは次のようになります。

  • ユーザーが自分の画像をアップロードする
  • 画像処理ワーカーがタスクを取得して実行
  • 画像処理ワーカーがキューに通知メッセージを送信します:「画像の準備ができました!」
  • DB 更新ワーカーはこのメッセージを受け取り、更新を行います
  • DB更新ワーカーが通知メッセージを送信し、メインプロセスがページビューを更新します

もちろん、私が問題を正しく理解していれば...

于 2013-02-20T18:21:59.607 に答える