1

ある PHP スクリプトが、別のスクリプトの実行中に送信されるイベントを待機するようにします。

ユーザー A とユーザー B はどちらも私の Web サイトの訪問者です。ユーザー A が index.php にアクセスすると、ページの実行が開始されますが、ユーザー B も index.php にアクセスするまで戻りません。(このページは、両方のユーザーが Web サーバーに接続している場合にのみ表示されます。たとえば、2 人の警備員が同時に鍵を回して金庫を開けた場合などです。)

これを実現する 1 つの方法は、他のユーザーが index.php にアクセスしたことによる通知を受信するまで、index.php の実行を一時停止することです。

これを行うために、私は見ました

  1. libevent; ただし、シグナリング中に「ID」または「文字列」を送信することは許可されていないようです。
  2. pear の Event_Dispatcher; ただし、スクリプトの「間」では機能しません。
  3. PHP 共有メモリ関数; しかし、メモリが変更されるまで待つことができないようです。
4

4 に答える 4

3

PHPスクリプトを完全に一時停止したくない場合があります。ユーザーは、ページがフリーズしたと思ってそこに座っているだけです。代わりに、AJAXを使用してUSER-Aの状態をデータベースに保存してから、AJAXを使用してUSER-Bの状態も保存されているかどうかを再度確認します。アイデアは、AJAXにバックグラウンドでUSER-Bのステータスをサイレントにチェックさせることです。ログインを検出したら、コールバック関数にページへの処理を実行させます。

于 2011-02-04T03:22:25.577 に答える
2

「待機中」のリクエスト (ユーザー A) のコードで、競合しないローカルホスト アドレスとポートにバインドされた新しいリッスン ソケット ( http://php.net/manual/en/sockets.examples.php ) を作成します。それ以外の場合 (たとえば、127.12.34.56 ポート 7890)、socket_accept を呼び出して接続を待ちます。その状態で待機中のリクエストがすでに存在する場合、これは失敗します。それ以外の場合は、そこで接続を待機します。

「シグナリング」リクエスト (ユーザー B) で、新しいソケットを作成し、リスニング ソケットに接続します。ユーザー A の要求を待っている PHP ハンドラーは、ブロックされていた socket_accept 呼び出しからすぐに戻り、続行できます。2 つの間でメッセージを渡す必要がある場合は、ソケットとの間でメッセージを読み書きするだけです。

これは、サーバーから送信されたイベントを表示するチャット ルームや通知ページなどのアプリケーションで実行する非常に一般的なタスクです。このアプローチには、スリープを呼び出して DB またはファイルをループでチェックし続ける (または JavaScript 側からループでサーバーに多くの要求を戻す) ポーリング アプローチよりもいくつかの利点があります。

- リソースやネットワークトラフィックを消費する不要な HTTP リクエストや DB クエリ、CPU ループを作成しません。

・トリガーイベント発生時、遅延なく即行動

・DBやファイルに依存しない

主な欠点は、PHP がソケットを開いてソケットに接続する権限を持っている必要があることです。これは、共有ホスティング環境には当てはまらないことがよくあります。

例については、https://gist.github.com/root9b/e1f0b82769296b06c079e53c7362bb94を参照してください。

于 2016-06-15T20:57:38.343 に答える
1

sleep と db の使用についてはどうですか?

クライアント1がログインすると、PHPは「待機中のエントリ」を挿入し、設定された間隔で(おそらくtime_nanosleepを使用して)データベースをポーリングして、「完了」とマークされたものを探します。
クライアント 2 がログインすると、PHP は「待機中のエントリ」を更新して「完了」に設定します。
プロセスが完了したことを確認したクライアント 1 は、順調に進みます。

データベースがない場合は、単純な一時ファイルを使用してこれを行うことができます。

于 2011-02-04T03:39:12.847 に答える
0

あなたはデーモンを探しています、これを作成する方法についてのいくつかの情報があります:

http://kevin.vanzonneveld.net/techblog/article/create_daemons_in_php/

于 2011-02-04T03:20:26.077 に答える