8

私のアプリは予約を処理します。処理時に、アプリのパートナーのいずれかが予約を行った方に予約の詳細を送信して、予約への参照を保存できるようにします。また、アプリが実行する他の処理を中断することもありません。

パートナーにメッセージを送信する方法を考えました。私の解決策は、予約を行っているパートナーのいずれかにcURL POSTリクエストを送信することです(私の質問に答える以外に、誰かがこれよりも優れた解決策を持っている可能性がありますか?)

各パートナーには、このPOSTリクエストを受信し、送信した予約情報を保存するために設定する特定のURLがあります。

問題: このPOSTリクエストを送信しようとして、そのWebサーバーが遅いか低速である場合、応答を受け取るまで不必要に長く待つ可能性があります。これにより、サービスを利用する実際のユーザーの予約の確認が遅れる可能性があります。

理想的な解決策: このPHP cURLリクエストを別のスレッドで送信して、楽しい方法で予約を確認できるようにしたいと思います。他のスレッドで遅延がある場合、これは私たちを遅らせることはありません。

私が検討した他の解決策は次のとおりです。

  • このリクエストを送信するために外部スクリプト(Pythonで記述されているなど)を呼び出します。exec()の使用は、非常に多くのリソースを消費する可能性があることを読みました。たくさんの予約があるので、これらの予約POSTをたくさん送信します。したがって、理想的には、リソースの良心が必要です。
  • ソケットの使用。私はこれらの構成に精通しておらず、ソケットサーバーがダウンしているのではないかと心配しています。それはまた、維持する使命のように感じます。たぶん私は間違っています?
  • 事実上ソケットサービスであるプッシャーのようなサービスを使用する。欠点は、リスナーがメッセージを見逃した場合、二度とメッセージを受け取らないことです。たとえば、パートナーはその予約の保存を見逃します。

私がここで達成しようとしていることについて、特に私がいるのと同じ種類の状況の解決策を必要としている誰かから、いくつかのフィードバックを得るのは素晴らしいことです。助けてくれてありがとう!

4

2 に答える 2

2

つまり、基本的に、他のクライアントが使用するAPIをPHPで作成していることになります。これが私が提案することです:

  1. POST/GETメソッドを介してクライアントにリクエストを送信させます。クライアントにデータをプッシュしようとするAPIサーバーとしてのあなたの代わりに。これは、クライアントのサーバーの速度が低下したり、速度が低下したりすることで解放されるため、はるかに優れたアプローチです。したがって、彼らがあなたにリクエストを送信するとき、それは彼らが応答を処理するために完全に能力があることを意味します。

  2. HTTP持続的接続を使用します。apachekeep-aliveでは、その値を高に設定して、クライアントが既存の接続を再利用できるようにして、待ち時間を短縮します。

  3. PHPでのマルチプロセッシングについては、マルチプロセッシングの概要をご覧 ください。基本的にpcntl_fork()、プロセスをフォークしてマルチプロセッシング用の新しい子プロセスを作成できる機能があります。

  4. redisなどに基づいてバックグラウンドジョブキューを実装します。アイデアは、すべての長時間実行ジョブがバックグラウンドジョブキューにドロップされ、次に各タスクに対してワーカーが生成されるため、これらのジョブはマルチプロセッシングを介して実行されるというものです。RedisとSoloを使用するPHPワーカー

それが役に立てば幸い

于 2012-10-26T22:27:36.437 に答える
1

cronを介して別のスクリプトを実行するのはどうですか?
最終確認の取得にはさらに大きな遅延が必要になる可能性があります(毎分外部リクエストのみを送信できます)が、ユーザーインターフェイスアクションで情報をキューに保存して続行するだけで、スケジュールされたタスクが後で処理できるようになります。
キュープロセッサは、ユーザーインターフェイスを保持することなく、外部サービスからの有効な応答を確認し、必要に応じて再試行できます。

よりタイムリーな処理のために、cronで可能であるよりも短い遅延で処理するエントリのキューをチェックするデーモンを作成できます。PEARには、PHPでデーモンを作成するのに役立つSystem_Daemonパッケージがあります。

于 2012-10-26T22:24:34.270 に答える