3

すでに数日試した後、私は確かにこの問題を自分で解決することはできません。これが問題です:

PHPファイル内でリアルタイムに生成されている画面(HTML)に情報を表示する必要があります。

PHPは非常にアクティブなクロールを実行しており、URLの膨大な配列を返します。各URLは、PHPがキャプチャするとすぐに、HTMLでリアルタイムに表示する必要があります。そのため、Ob_flush()メソッドとflushメソッドを使用してエコーと印刷を行います。アレイを入手したらすぐに。

その間、ユーザーが作業中にこの情報を見ることができるように、この情報を何らかの方法で表示する必要があります(完了するまでに1時間以上かかる可能性があるため)。

私が理解している限り、AJAXを使用して実行することはできません。これは、1つの要求を行うだけで、配列内の情報を読み取る必要があるためです。コメットがこのようなことを実行できるかどうかも完全にはわかりません。新しい情報を取得するとすぐに接続が中断され、配列のサイズが急速に大きくなるためです。

さらに、さらに複雑にするために、配列を処理および生成しているのと同じファイルのユーザーインターフェイスとしてHTMLファイルが含まれているため、配列内の情報(URL)を印刷またはエコーする必要はありません。表示する必要があります。

短編小説; ここに配置する必要があります:

<ul>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    <li></li>
    ...
</ul>

PHPループで生成され、配列内にプッシュされるURLの終わりのないリアルタイムの更新されたリスト(1,000行下)。

どんな助けでも本当にありがたいです。前もって感謝します!

4

5 に答える 5

3

Webソケットを試してください。

それらはクライアントとサーバー間のリアルタイム通信を提供し、socket.io を使用することでブラウザー間の互換性を提供します。基本的には long-polling / comet と同じ結果が得られますが、リクエスト間のオーバーヘッドが少ないため高速です。

この場合、Web ソケットを使用して、処理の現在のステータス (または実行中の処理) に関する更新をクライアントに送信します。

このSocket.io での PHP の使用を参照してください。

于 2012-09-14T21:00:38.250 に答える
0

これを行う最善の方法は、最初の PHP スクリプトで各レコードをデータベース (おそらく MySQL または SQLite) に保存し、次にデータベースから読み取って最新のレコードを出力する 2 番目の PHP スクリプトを作成することだと思います。次に、AJAX を使用してこのスクリプトを頻繁に呼び出し、送信するレコードをテーブルに追加します。最初のスクリプトをトリガーする方法を見つける必要があります。

JavaScript は、既に持っている最後の URL の ID を記録し、それを AJAX リクエストで送信する必要があります。そうすれば、PHP はそれより大きい ID を持つすべての行を選択できます。

URL の数が非常に多く、サーバー上にそれほど大きなデータベースを保存できない場合 (ブラウザはこれほど大きなテーブルにどのように対処するのだろうかと疑問に思うかもしれません!)、常に PHP スクリプトを使用できます。最新のレコードを出力し、データベースからも削除します。

編集: 多くの MySQL 挿入を行う場合、それを高速化するためにできることがいくつかあります。ここにそれらを詳述する優れた答えがあります。簡単に言うと、MyISAM を使用して、1 つのクエリにできるだけ多くの行を入力します (PHP にバッファ配列を用意し、そこに URL を追加し、それがいっぱいになったらバッファ全体を 1 つのクエリに挿入します)。

于 2012-09-14T20:59:04.980 に答える
0

PHP が Memcached サーバーに書き込むスキームを使用したとします。

rec1、rec2、rec3 として書き込む各キー

current_min と current_max も保存します

ユーザーは ajax で常にポーリングしています。リクエストごとに、最後に見たキーを含めます。これを k と呼びます。次に、サーバーは k から max までのすべてのレコードを返します。

すぐに利用できるレコードがない場合、サーバーは最大 3 秒間待機ループに入り、100 ミリ秒ごとに新しいレコードがあるかどうかを確認します。

レコードが利用可能になると、すぐに送信されます。

クライアントが更新を受信するか、接続が終了するたびに、クライアントはすぐに新しい要求を開始します...

新しいレコードを書き込むには、max+1 を挿入し、min と max をインクリメントするだけです。ここで、max-min は、保持しておきたいレコードの数です...

于 2012-09-14T21:11:13.430 に答える
0

Web ソケットの代替は COMET です

私はこれについて記事を書き、私の経験を説明するフォローアップを行いました.

私の経験ではCOMETは速いです。Web ソケットは間違いなく未来ですが、それを行う必要がある状況にある場合は、COMET を 1 時間以内に起動して実行できます。

間違いなく、ある種の共有メモリ構造が必要です。おそらく、データベース内のメモリ内一時テーブル、または stephen が既に提案した Memcached です。

于 2012-09-14T21:18:13.710 に答える
0
If I were you , I try to solve this with two way .
First of all I encode the output part array  with json and with the setTimeout function with javascript I'll decode it and append with <ul id="appendHere"></ul> so 

リストが更新されると、それ自体が自動的に更新されます。js を使用した cronjob のように。

2 つ目は、処理中に出力が取れなかったので、mysql へのデータ挿入を使用しても意味がないという場合は、MongoDb などを使用して速度を上げます。ちなみに、キーで必要なものに到達し、挿入された値を複製することはありません。

于 2012-09-14T21:30:42.140 に答える