ホームページ >バックエンド開発 >PHPチュートリアル >私が書いた PHP インスタント チャット ルーム ソリューション
特定のデータ インタラクションは記述されておらず、クライアントへのデータのリアルタイムかつ継続的な送信というコア機能の原理が実装されているだけです
ajax = function(method, url, data) { var objxml = jsuse.createXMLHttpRequest(); //自己写这个函数, 我使用了一个库. if (url.indexOf("http://") != 0) { url = jsuse.BASE_URL + url; } objxml.open(method, url, true); //异步调用 //objxml.setRequestHeader("Content-type", "application/x-octet-stream"); var pos = 0; objxml.onreadystatechange = function() { if (objxml.readyState == 4) { if (objxml.status == "200") { document.write("200 OK"); } else { //document.write(objxml.status); } } else if(objxml.readyState == 3) { var str = objxml.responseText; document.write(str.substr(pos)); pos = str.length; } else { document.write(objxml.readyState+"<br />"); } } try { objxml.send(data); } catch (e) { return false; } return true;}jsuse(function(){ ajax("post","test.php",""); //这一句会在onLoad里加载, 可以写在body的onLoad里.});
set_time_limit(0); //设置页面永不超时for($i=0;$i<3000;$i++){ //先把浏览器缓存冲掉, 不同浏览器这个值不同. echo " ";}ob_implicit_flush(true); //设置PHP实时输出$n = 0;while(true) { echo "$n yeah :-))))<br />"; @ob_flush();//刷新缓冲. sleep(1); $n++;}
ディスカッションへの返信 (解決策)
1. サーバー側は何ですか? 毎秒データベースを更新して、新しいデータがあるかどうかを確認します
2. 異なるチャット ルームのデータは関連していません。これらのデータは同じテーブルに保存されます (結局のところ、これらのデータを保存する必要がない場合、チャット ルームが占めるストレージ容量は実際には非常に小さく、形式は同じなので、テーブルを構築する必要はありません)異なるチャットは識別子によって区別できます。読み取りデータベースと書き込みデータベースは相互にロックし、効率が低下しますか?
まずコードの問題について説明します。
1. 関数で document.write を使用しました。プログラムは正常に実行できますか?
計画に戻ります:
ajax が実行されるたびに、新しい http セッションが生成されます。つまり、サーバーは毎回 php プログラムのコピーを実行します。では、実行される PHP プログラムを無限ループにすることに何の意味があるのでしょうか?
クライアントに ajax を使用してインターフェースを定期的に調整させるだけです。無限ループを作成する必要はありません
1. 関数内で document.write を使用したので、あなたの関数でも同じことができます。プログラムは正常に実行されますか?
2. このアクションは出力するたびに実行する必要があります。ループの外で 1 回だけ実行した場合、気候データをリアルタイムで表示できることを保証できますか?
計画に戻ります:
ajax が実行されるたびに、新しい http セッションが生成されます。つまり、サーバーは毎回 php プログラムのコピーを実行します。では、実行された php プログラムを無限ループに入れるとはどういう意味ですか...
モデレーター、あなたは本当にモデレーターですか?
1. これはテスト コードです。document.write は実際に出力できます。問題があると思いますか? 実は、書き込み関数を使用することは不可能です。 2. 本来、これらの PHP コードはキャッシュを備えています。効率を高めるために、データは非常に効率的に送信されますが、私たちの要件は、このメカニズムを使用せず、ob_implicit_flush(true) と ob_flush がこの役割を果たすことを望んでいます。ただし、それでも、ブラウザ自体にはバッファリングがあり、データ量が少ない場合は、すべてを一度に表示する前に接続が閉じられるのを待ちます。しかし、今はそれを避ける必要があるため、その目的で 3000 個のスペースが使用されます。実際の測定によると、表示をトリガーするのに十分な文字数が必要であり、それ以降のデータはフラッシュする必要がありません。 1 つの文字がすぐに表示されます
3. 無限ループですが、もちろん、インスタント メッセージングでは、長時間の接続を維持する必要があります。
これらのコードはローカル サーバーでは正常に実行されますが、sae プラットフォームでは、このようなサーバー リソースを定期的に要求する PHP アプリケーションはサーバーに多大な負荷をかけます。チャット ルームなどには Node.js を使用することをお勧めします。
応答 3:
応答 3:
ajax の場合、ajax コールバック関数はサーバーが実行を完了したときにのみ呼び出されます。したがって、あなたが言及した長い接続は実際には機能しない可能性があります。自分が書いたコードをまったくテストしていない可能性があります。
言葉が出ない、私はテストしていない、あなたはテストしたのですか?
8階のdream1206さんの返信を引用: 返信3:
ajaxの場合、ajaxコールバック関数はサーバーの実行完了時にのみ呼び出されます。したがって、あなたが言及した長い接続は実際には機能しない可能性があります。自分が書いたコードをまったくテストしていない可能性があります。
無言です、私はそれをテストしていません、あなたはテストしましたか?応答コンテンツが完全にロードされたとき 完了後、responseText に値が割り当てられます。
StatusNet オープンソース Weibo システム、それを参照してください。現在は比較的成熟しています。