2016-04-25 7 views
4

私はHTTPリクエストに対してそのリストを実行しているアプリケーションを持っています。各リクエストはフレームワークオブジェクト$appがインスタンス化され、ルーティング/コントローラ/モデルなどを処理する単一ページに渡されます。HTTPリクエストとcliクラスオブジェクトとのやりとり方法

これで、オブジェクトがインスタンス化される別のクラスがあります。 CLIスクリプトはそれを$cliAppと呼ぶことができるようになりました。どのように私はお互いにオブジェクトの両方の話をするのですか? $appは、新しい要求があるたびにインスタンス化します。

$cliAppは、スクリプト実行時に一度だけインスタンス化されます。このスクリプトは$loopオブジェクトを介してループ内でPHP React Event loopによって実行されます。

Cli AppはWebSocketを実行しています。だから基本的に私はHTTP &ソケットを介して通信する必要があります。 http api。

P.S. :

今、私はメッセージキューイングを使用する1つのソリューションを持っています。 0mqなどですが、それは私がスケーリングして単純なままにしているわけではないので、残念です。

私が現在試みているもう一つの解決策は、$http要求とスレッドによって作成されたスレッド間でSptStorageObjectを共有することです。これは$cli要求によって作成されました。多分これは依存性注入の問題です。私はこの$storeオブジェクトを共有するのに苦労しています。

+0

あなたのアプリへのすべての要求は、サーバー上に新しいスレッドを開始します。 CLIも同様です。 PHPのスレッドは何も共有しません。コミュニケーションを実現するには、メッセージングシステムが必要です。あなたは正しい軌道に乗っています。 – colburton

+0

ここでいくつのプロセスが実行されているのか分かりません。基本的には、PHPプロセスの1つのインスタンスを起動します(反応HTTPサーバー)、$ cliAppはこの内部にありますか?またはここに複数のPHPインスタンスが生成されていますか? – Method

+0

@メソッドReact Event Loop&Ratchet Websocketsを使用しています。 HTTPリクエストは別のフレームワーク、すなわちsymfony/silexコンポーネントを使用しています。 – kishanio

答えて

3

私が正しく理解していれば、あなたは(仮定注意)があります。

  • (おそらくApacheまたは類似のウェブサーバ上の)HTTPを介して通信し、通常のPHPのWebアプリ
  • 長時間実行PHPのCLIアプリをウェブソケットを介して通信します。

おそらく、両方のアプリがウェブクライアントからのコミュニケーションを継続的に受信しています。おそらく、MySQLデータベースなどの独自の永続データストアを持っていて、おそらく同じものを共有している可能性もあります。

私は、永続的なデータストアから最新のデータにアクセスする(または2つのプロセスが別々のデータストアを使用する)各アプリケーションを超えていると仮定します。実際には、 2つのプロセスの間でオンデマンド通信が可能です。

メッセージキューを使用して適切な道を歩いていますが、すでに完全に正常に動作する2つの通信レイヤーがある場合は、3つ目の専用プロセス間通信レイヤーを追加する必要はありません。

必要なものは、あなたのウェブアプリケーションとの通信を開始する必要があるときには、あなたのcliアプリケーションがHTTPを発し、cliアプリとの通信を開始する必要があるときはWebアプリケーションがWebソケットを発する必要があります。

実際にこのように見えるのは、かなり簡単です。

cliアプリでは、cURLを使用してWebアプリケーションへのHTTP接続を開始するだけです。これはかなりシンプルで、途中であなたを助けるためにウェブ上に無限のリソースがあります。もしあなたがつまってしまったら、あなたの問題に特有の新しい質問をここに来て、あなたは行くでしょう。このすべてが、次のされて、あなたのWebアプリケーションに必要です。ページが直面している基本的なクライアントが

  • CLIを認証するためにいくつかの方法が十分でない場合は、CLIのアプリは、に要求を送信することができます

    • 適切なエンドポイント(複数可)ウェブクライアントが利用できないはずのデータにアクセスする必要がある場合は、アプリケーション

    WebアプリケーションがcliアプリケーションとのWebSocket接続を開始するには、ネイティブPHPを認識していないため特にWebsocketプロトコルを対象とする機能性です。しかし、私はあなたがに接続し、送信/ウェブアプリケーションのプロセスが生きている間、データを受信して​​、ときにそれをシャットダウンするために使用することができ、あなたのウェブソケットサーバを設定する機能を提供することを目的としているthis (extremely permissive) github project、それalso includes a client scriptを見つけましたやり直しまだ最小限のアクティビティがあるようですが、直接使用することも、独自のwebsocketクライアントを作成するための出発点として使用することもできます。この場合

    は、ちょうど逆の状況のように、あなたはそれがちょうどそれに適切なデータを提供できるように、Webクライアントからのトラフィックを認識し、認証するためにCLIクライアントを必要としています。

    何らかの理由でこのシナリオがうまくいかない場合は、メッセージキューまたは共有データストアに戻ります(状況によっては、データストア/メッセージキューとして機能する可能性があります)。

  • 関連する問題