3

MSN プロトコルに基づいた単純なチャット Web アプリケーションを開発しています。サーバーは、 から返されたファイル リソースを介して MSN サーバーと通信しますfsockopen ()。クライアントは 経由でサーバーにアクセスしますXMLHttpRequestresponseText ()サーバーは最初にログインし、オブジェクトのを通じてクライアントが受け取る連絡先リスト (HTML テーブルでフォーマットされたもの) を出力しXMLHttpRequestます。

これが問題です。MSN サーバーとの通信を担当するファイル リソースは、すべてのチャット関連機能 (会話の作成、オフライン/オンライン状態の変化の追跡など) が機能するように維持する必要があります。ただし、XMLHttpRequestを完了するには、PHP スクリプトの実行を終了する必要があります。XMLHttpRequestこれは、チャット セッションの進行中、クライアントが から応答を得られないことを意味します。

さらに悪いことに、ファイル リソースをシリアル化することはできません。つまり、チャット セッションを$_SESSION []プレースホルダーに単純に保存することはできません。

それで、私の質問は、ファイルリソースをあるファイルから別のファイルに「転送」する方法はありますか?

4

4 に答える 4

2

ほとんどの言語では、アプリケーション間でファイル ハンドルを渡すことはできません。知る限り、ほとんどのオペレーティング システムでも許可されていません。

解決策は、サーバー プロセスをデーモンとして実行し続けることです。これは、Web サーバーの外部で実行する必要があることを意味します。

見る

http://symcbean.blogspot.com/2010/02/php-and-long-running-processes.html

http://www.phpclasses.org/browse/package/5758.html

C.

于 2010-02-10T09:16:41.767 に答える
0

リソースは、それを実行するPHP拡張機能を作成しない限り、リクエストの終了後も存続できません(mysql_pconnect()たとえば、永続的なMySQL接続で実行されるように)。ただし、Cometテクノロジー、たとえばDojoツールキットでサポートされているBayeuxプロトコルを使用して、サーバーと通信することはできます。これには、スタンドアロンサーバーまたは長時間実行リクエストのいずれかが必要になります。後者の場合、PHPとウェブサーバーの時間制限により、実行時間が長すぎるためにそのリクエストが強制終了されないようにしてください。

于 2010-02-10T08:56:54.363 に答える
0

提案をありがとうございました。このプロジェクトを開始する前に、comet テクノロジの使用を検討していましたが、やめることにしました (PHP/Apache はうまく実装されていないようです)。私は、最もエレガントではないが実行可能なハッキングされたソリューションを思いつきました。

1 つの PHP スクリプトが MSN サーバーとの通信を担当し、ユーザーがアクティブである限り実行されます。ファイルにデータを書き込み (email_out)、ファイルからデータを読み取ります (email_in)。クライアントが AJAX リクエストを送信するたびに、別の PHP スクリプトが POST データをファイル (email_in) に書き込み、(email_out) からデータを返します。両方のスクリプトは、最終的にファイルにアクセスできるようになるまでデータの読み取り/書き込みを行いません (ファイル リソースをめぐって競合するため)。

わからない、提案は?これは確かに最も効率的な方法ではありませんが、私が考えることができる唯一の PHP/Apache ソリューションです。

于 2010-02-10T21:33:20.207 に答える
0

考えられる解決策は、サーバー側に PHP スクリプトを配置することです。この方法では、呼び出しに対応するリソースfsockopenが削除されることはなく、接続が閉じられることもありません。

これについては、「彗星」という用語を検索することをお勧めします。基本的な考え方は、サーバー側で永久に実行され、必要なときにクライアントに更新を送信するスクリプトを用意することです。

ブラウザに X 秒ごとに Ajax リクエストを送信させる代わりに、クライアントとサーバーの間の開いた接続を維持します。残念ながら、PHP はその仕事に最適なツールではないとよく言われます...

スタックオーバーフローについて: [php] コメット

于 2010-02-10T05:21:48.083 に答える