その一般的に、あなたのシステムアーキテクチャを進化起動する必要がある場合、スケーリングの問題がポップアップし、アプリケーションが非同期に動作する必要がありますとき。あなたが持っているこの問題は非常に一般的です(チームの中には私が書いているものを扱っている人もいます)が、最終的に誰もがそれに対処する必要があります。
解決方法1:cronジョブ
は、最も一般的な解決策は、定期的に行うための新しい仕事のためのキューをスキャンするcronジョブを作成することです。誰もが自分自身を持っているので、キューの性質については説明しません。いくつかは問題なく、他は本当に悪いですが、通常、関連情報とジョブステータス(悪い解決策の1つ)を持つDBテーブルが含まれます。 Memcachedを含むソリューション、MongoDBも非常に人気があります。
この解決策の「問題」は、最終的には「スケーリング」です。 Cronジョブは一定の間隔で定期的に実行されるため、タスクに特に時間がかかる場合は、ジョブが重複する可能性があります。つまり、何らかのロックで作業したり、ジョブを順番に実行するスケジューラを利用したりする必要があります。
最終的には、タイムアウトの問題に遭遇することはなく、一般的にマシン全体をこれらのタスクの実行専用にして、メモリの問題でもありません。
解決方法2:ワーカー委任
私はこのソリューションの例として、Gearmanを使用しますが、他のツールは、RabbitMQのようAMQPのような基準を包含する。私はGearmanの方がセットアップが簡単で、メッセージングでの作業処理のために設計されています。
この種類の委任には、呼び出した直後に実行する利点があります。サーバーは基本的には(Apacheサーバーと違いなく)何かを待っています。要求を受け取ると、クライアントからのワークロードを「ワーカー」の1つにシフトします。これは、作成したスクリプトです。ワークロードのサーバー。
これらのワーカーのうち、同じタイプまたは異なるタイプのタスクを実行している、好きなだけ多くのワーカーを持つことができます。これは、スケーリングがあなたが持っている労働者の数によって決まり、これは水平に非常にきれいになることを意味します。
結論:
Cronsは、自動メンテナンスの私の意見では細かいですが、彼らは労働者に理想的な選択肢を実行しますどの同時に作業する必要があるとき、彼らは問題に実行。
いずれにしても、ユーザーがリクエストに対するフィードバックを受け取る方法を変更する必要があります。彼らは、リクエストが処理中であることを知らされ、結果を得るために後でチェックする必要があります。あるいは、実行中のタスクのステータスを定期的に追跡して、ajax経由でユーザーにリアルタイムフィードバックを提供することができます。それは実行中にタスクの状態を維持する必要があるので、cronジョブではややこしいですが、Gearmanには、これを行うための優れた組み込みソリューションがあります。
http://php.net/manual/en/book.gearman.php
504はタイムアウトです。サーバー設定で許可された実行時間を延長する必要があります。しかし、接続を長く開いておくことは、多くの理由から、本当に悪い考えです。私は代わりに、ユーザーにファイルをアップロードさせてから、バックグラウンドプロセス(すなわち、PHP/Apacheを使用しているときはCRON)で処理することをお勧めします。処理が終了したら、UI /電子メール/ SMSなどでユーザーに警告することができます –