1

PHPを使用してクライアントにデータを送信する際の問題の解決策を見つけようとしています。最大の問題は、PHPスクリプトを使用した単一の接続内でデータを送信し続けることです。他にも方法はあると思いますが、今のところ解決方法がわかりません。

私がやろうとしているのは、クライアントがWebサーバーに接続し、接続を開いたままにして、TCP接続が「確立」されるようにすることです。彼は、この接続を維持するために、たとえばX秒ごとにGETリクエストを作成し続けます。

特定のイベントでのこの接続の内部で、クライアントが要求を行わずにクライアントにデータを送信したいと思います。つまり、イベントはクライアント側ではなくサーバー側でトリガーされるということです。

私のクライアントはArduinoモジュールであるため、JavaScriptやクライアント側の手法を使用する可能性はありません。接続を開いたままにすることはできますが、HTTPを使用してクライアントにデータを渡す必要があります。

サーバー上にデータベースを設定しており、データベース内で何かが変更された場合、PHPはクライアントにデータを送信します。

PHPスクリプトでループ内で実行されているphpflush()で遊んでみました。しかし、それは私が望むようにはなりません。

だからどんなアドバイスもありがたいです。ありがとうございました。

編集:ソリューションがWindowsマシンでも機能するのであれば完璧です!

edit2:1つだけではなく、複数のクライアントが存在します(例:数百)

4

4 に答える 4

1

多くのクライアントがない限り、サーバー側のイベントはうまくいくように思えます。 http://dsheiko.com/weblog/html5-and-server-sent-events

何百ものクライアントがあることを読んでください。その場合、おそらくPHPを使用したくないが、代わりにnode.jsを使用します。

于 2012-12-26T22:25:23.663 に答える
0

さて、私はそれが機能したい方法を見つけたと思います。flush()が機能しなかった理由は、フラッシュする前にフラッシュバッファーの制限に達していないことです。また、Nginxサーバーを使用していて、gzipを無効にしました(念のため)。

絶対に機能する私のテストコードは次のようになります。

<?
ob_implicit_flush(1);

for($i=0; $i<10; $i++){
  echo $i;

  //this is for the buffer achieve the minimum size in order to flush data
  echo str_repeat(' ',1024*64);

  sleep(1);
}
?>

ここで私の答えを見つけました:Nginxでも機能するPHPフラッシュ

そのような出力を受け入れることができるかどうか、Arduinoでテストします。助けてくれてありがとう。

于 2012-12-27T10:40:53.430 に答える
0

CRONジョブはどうですか?

http://en.wikipedia.org/wiki/Cron

http://www.cyberciti.biz/faq/how-do-i-add-jobs-to-cron-under-linux-or-unix-oses/

それがあなたのプロジェクトの解決策になるかもしれないと思います。私がCRONを正しく理解していない場合、あなたがすることは、与えられた間隔で与えられたスクリプトを実行することです。つまり、基本的には、スクリプトをX秒ごとに実行する必要があります。そして、スクリプト内で、データベースを操作する関数があります。

于 2012-12-26T22:20:25.507 に答える
0

あなたが探しているのはIPC-プロセス間通信だと思います。あなたの場合、私はメッセージキュー(またはそれらの複数)を提案します

(クライアント上)

  1. への接続を開くfoo.php
  2. 新しい行を受け取ったら、それを処理します。
  3. 接続がタイムアウトした場合は、再度開きます

(サーバー上- foo.php

  1. メッセージキューを開きます(ユーザーごとにメッセージキューを登録する必要があります!)
  2. bar.phpあなたがそれについて知っているようにそれを登録してください。
  3. ブロッキング受信を開始します。
  4. メッセージを受信したら、送信したいもの、FLUSH OUTPUT BUFFERSを送信し、2に戻ります。
  5. タイムアウトした場合は、2に戻ります。

(サーバー上- bar.php

  1. データベースが変更されたら、すべてのアクティブなキューにメッセージを送信します

このアプローチにはいくつかの問題があります。

  • サーバー側は実際にはLinux/Unix(Macを含む)でのみ機能します
  • メッセージキューの数には限りがあります
  • ハウスキーピング、古いキューの削除などを行う必要がある場合があります。

メリット:

  • これはアプリケーションに依存しません。メッセージキューはオペレーティングシステムの機能であるため、bar.php実際にはJavaアプリケーションと言えます。
于 2012-12-26T23:02:56.237 に答える