問題タブ [reactphp]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
php - Ratchet PHP WAMP - React / ZeroMQ - 特定のユーザー ブロードキャスト
注:これは、を利用するこの質問と同じではありません。私は代わりに使用しているので、この質問は特にその部分に関係しています。これは将来他の人に役立つことがわかるので、コード例と説明を含む回答が必要です。
MessageComponentInterface
WampServerInterface
個々のユーザーに対してループ プッシュを試みる
私は Ratchet と ZeroMQ の WAMP 部分を使用しています。現在、プッシュ統合チュートリアルの作業バージョンがあります。
私は次のことを実行しようとしています:
- zeromq サーバーが稼働中で、サブスクライバーとアンサブスクライバーをログに記録する準備ができています
- ユーザーは、websocket プロトコルを介してブラウザーで接続します
- 要求した特定のユーザーにデータを送信するループが開始されます
- ユーザーが切断すると、そのユーザーのデータのループが停止します
ポイント(1)と(2)が機能していますが、問題は3番目のものにあります:
まず、特定のユーザーにのみデータを送信するにはどうすればよいですか? おそらく「トピック」が個々のユーザーIDになる場合を除いて、ブロードキャストはそれを全員に送信しますか?
第二に、セキュリティ上の大きな問題があります。クライアント側からサブスクライブしたいユーザー ID を送信する必要があるように思われる場合、ユーザーは変数を別のユーザーの ID に変更するだけで、そのデータが代わりに返されます。
第三に、実際のループを開始するには、zeromq のコードを含む別の php スクリプトを実行する必要があります。これが最善の方法であるかどうかはわかりませんが、個別の php ファイルではなく、コードベース内で完全に機能するようにしたいと考えています。これは、私が分類する必要がある主要な領域です。
次のコードは、私が現在持っているものを示しています。
コンソールから実行するだけのサーバー
私は文字通りphp bin/push-server.php
これを実行するために入力します。サブスクリプションとサブスクリプション解除は、デバッグ目的でこのターミナルに出力されます。
Websocket 経由でデータを送信するプッシャー
無駄なことは省き、メソッドに集中しましonMessage()
たonSubscribe()
。
ループ内で上記のプッシャー コードの使用を開始するスクリプト
これは私の問題です。これは、将来的に他のコードに統合される可能性がある別の php ファイルですが、現在、これを適切に使用する方法がわかりません。セッションからユーザーの ID を取得しますか? 私はまだクライアント側から送信する必要があります...
最後に、サブスクライブするクライアント側の js
結論
上記は機能していますが、次のことを理解する必要があります。
個々のメッセージを個々のユーザーに送信するにはどうすればよいですか? 彼らが JS で websocket 接続を開始するページにアクセスしたときに、PHP のキューに何かを押し込むスクリプト (zeromq) も開始する必要がありますか? それが私が現在手動で行っていることであり、それは間違っていると感じています.
JS からユーザーをサブスクライブする場合、セッションからユーザー ID を取得してクライアント側から送信するのは安全ではありません。これは偽造される可能性があります。もっと簡単な方法があれば教えてください。
php - このコード サンプルで $loop は何をしますか?
Phil Sturgeon は、ベンチマークに関するこの記事を書きました。
私が関心を持っているのは、ReactPHP と呼ばれるこの技術です。
私は彼らの GitHub に行ったことがありますが、例がなければまだ頭に浮かびません。
ありがたいことに、Phil のリポジトリを使用できます。
12 行目で、Phil は ReactPHP でループを作成しました。
https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L12
その後、24 行目でループを使い始めました。
https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L24
私の質問は次のとおりです。
- これの目的は何
$loop
ですか? - ReactPHP では、これは単純な Web サーバーであると書かれています。それは、nginx や Apache を置き換えるということですか?
- ReactPHP または類似のテクノロジーを使用するのに適した時期はいつですか? それを使用するのに適していないのはいつですか?
私はこの技術について学ぼうとしているので、この質問の言い方が悪い場合は、書き直せるようにお知らせください。
編集:
質問が広すぎるというフィードバックが寄せられているので、質問を絞り込んでコード例を参照させてください。
https://github.com/philsturgeon/nonblockingbro/blob/master/p2-async.php#L12からコード サンプルを取得し、
以下に複製しました。何をし$loop
ますか?
php - React/Promise が解決されたときに同期的に戻る
React/Promise が解決されたら、関数呼び出しから戻る必要があります。基本的な考え方は、非同期呼び出しから同期呼び出しを偽装することです。つまり、promise が解決または拒否されると、外側の関数は値を返さなければなりません。
これは React/Mysql を使用して RedBeanPHP 用のドライバーを作成することです。これにより、React イベント ループで CPU が枯渇する可能性が高いことは承知しています。
私の最初のアイデアは、ジェネレーターを使用してから、\React\Promise\Deferred::then
コールバック内で yield を呼び出すことでした。
PHP ジェネレーター クラスである AFAICT は、PHP エンジン自体によってのみ直接構築可能です。then コールバックは、これが機能するために、非同期関数のジェネレーターで send を直接呼び出す必要があります。
php - Windows で react/zmq をセットアップする
公式サイトの指示に従って、システムに Ratchet をセットアップしています。以下を実行しました。
- 公式サイトからzeromqをダウンロードしてインストール
- http://zeromq.org/bindings:phpの指示に従ってPHP バインディングを行い、dll ファイルをコピーしました (前述の URL がダウンしているため、[ http://178.79.157.189/~mikko/win32/から dll ファイルを取得しました)。php-zmq-win32.zip] ) 3.php.iniファイルを変更。
しかし、サーバーを再起動すると、次のエラーが表示されます。
PHP の起動: 動的ライブラリ 'c:/wamp/bin/php/5.4.3/ext/php_zmq.dll' を読み込めません - %1 は有効な Win32 アプリケーションではありません。
php - Composer: lib (React PHP) 部分的にのみ自動読み込み
React lib の 1 つのコンポーネントは自動読み込みですが、大部分はそうではありません。
プロジェクトに反応/反応を構成し、そのプロセスのすべてがスムーズに進みました。または
を使用しようとすると、「クラスが見つかりません」というエラーがスローされます。
xDebug をオンにすると、配列に... が含まれていることに気付きましたが、他には何もありません。他の React ライブラリもそこにあるはずです
。React\EventLoop\Factory
React\Stream\Stream
Composer\Autoload\ClassLoader->prefixes['R']
React\Promise
それを見て、私は var_dumpedを実行し、ネームスペース\React\Promise\any('string')
を正常に自動ロードしました。React\Promise
それでも、他のReact\
名前空間にあるクラスはオートロードに失敗します。
私の問題は、Composer\Autoload\ClassLoader->prefixes
配列に明確に存在しないことに何らかの関連があると思わざるを得ませんが、かなり初心者なので、それは単なる予感です。
ところで、すべてが少なくともアクセス可能であることを確認するために、これらのクラスでハードコードされた 's を試しました。require
成功しました(もちろん、後続の依存関係が自動ロードされないことを除いて:)
このタイプのオートローディングの原因は何だと思いますか?
php - ReactPHP Socket Server: (クライアントへの) 書き込みをトリガーするのは何ですか?
クライアントに書き込もうとすると、メッセージがバッファリングされ、場合によってはまったく書き込まれません。
現在の状況:
サーバーに telnet で接続すると、Server Ready:
メッセージは期待どおりにすぐに出力されます。
ランダムなデータ (「クローズ」以外) を送信すると、サーバーの端末は毎秒適切に進行状況を表示しますが、クライアントの出力はすべてのスリープが終わるまで待機し、一度にすべて出力します。
最も重要なことは、「close」を送信するときに、必須の秒だけ待機し、クライアントで書き込みを行わずに閉じることです。
目標:
私の主な目標は、接続を閉じる前にクライアントに簡単なメッセージを書き込むことです。
コード:
概要:
閉じる前にクライアントに何も書き込まれないのはなぜですか?