管理ページから更新できるシンプルなクライアント側Webページを構築しています。私はPHP=クライアントターゲットページのサーバー側操作に使用しています。
セットアップは私にはやり過ぎのように感じます:
index.html
_には、いくつかの基本的なhtml入力要素があります。ボタンが_makeClientPage.php
_のXML GETリクエストをトリガーします。 PHPスクリプトは、HTML入力から生成された変数を受け取り、_clientPage.html
_ファイルを書き留めます。new_image
_と呼ばれる2つのJavaScript変数と、任意の文字列値を持つ_old_image
_があります。new_image
_の_<script>
_タグの間のJavaScript変数(_clientPage.html
_)に渡されます。<img>
_タグで表示されるのではありません。パノラマ画像ビューアーである Panolens.js に渡す必要があります。 JS関数は、新しいイメージでPanolens.jsを更新します。clientPage.html
_でsetInterval(function(){checkUpdate())}, 1000)
を実行します。 checkUpdate()
も以下にあります。それは基本的に毎秒実行され、_new_image
_を_old_image
_と比較し、それらが異なる場合、PanoLens APIが更新目的で呼び出され、_old_image
_が_new_image
_に割り当てられ、毎秒更新される同じ画像。ここでのトリックは、_clientPage.html
_ファイルでは、_new_image
_変数がJavaScript自体によって直接読み取られないことです。実際に別のPHP関数にリクエストを送信し、_clientPage.html
_を読み取り、_new_image
_変数を抽出し、代わりにそのように比較します。なぜですか?クライアントが_url/clientPage.html
_、ブラウザはファイルの変更を追跡できないため、管理者のアクションによって更新された変数の実際の値を要求するリクエストをサーバーに送り返す必要があります。
最後に、自分のコンピュータの管理者と自分の電話のあるクライアントを想像してください。管理者は入力を入力してボタンを押し、クライアントが表示しているページに目的の画像を送信します。クライアントは、ヘッドセット付きの電話を「身につけ」、Oculusデバイスにいるかのように画像を表示します。そのため、「更新」をクリックするだけのオプションはありません。
私の質問はsetInterval()
についてです。このアプリケーションを100のクライアントに配布する場合、サーバーは非常に多くのphpリクエストを処理する必要があります。そして、いいえ、原始的な本能や時期尚早な最適化などの人たち、私はこの質問をしているので、学ぶことができます。以下は、私が試したものですが、別の方法で実行できるかどうか尋ねます。 「意見」を求めていないことを願っています。
私はプログラミングのキャリアにおいて非常に新しいです。そして、それは私が行っている最初のサーバー側のWeb開発です。 PHPは何か便利なことをするために行き来する必要があります。昨日、JSからPHPに変数を渡すために、XMLHttpRequestをPHPに作成する方法を学びました。同時に明るいと暗い。
毎秒コントロールをバイパスするために、PHPからJavaScript関数をトリガーする方法について、インターネットを検索し続けます。理にかなっているのは、管理者が_generate image
_ボタンを押すと、クライアントページがその通知を受け取るということです。しかし、differnetファイルでそれがどのように行われるか理解できません。
このトピックに関するあなたの経験を共有していただければ幸いです。
コード:
_clientPage.html
_のscript
タグの間:
_...
new_image = '_name_%new_image%_name_';
old_image = 'old_image';
var setInterval_forUpdate = setInterval(function(){checkUpdate()}, 1000); // everysecond
function checkUpdate(){
callPHPUpdate();
if(newImageInfo != old_image){
old_image = newImageInfo;
updateImage();
}
}
function updateImage(){
...
// update PanoLens.js image
...
}
function callPHPUpdate(){
var xmlhttp = new XMLHttpRequest();
xmlhttp.onreadystatechange = function(){
if(xmlhttp.readyState==4 && xmlhttp.status==200){
res = xmlhttp.responseText;
newImageInfo = res.split('_name_')[1];
}
}
xmlhttp.open("GET","updateInfo.php",false);
xmlhttp.send();
}
_
_updateInfo.php
_は、_clientPage.html
_が必要とするものです。
_<?php
function getLineWithString($fileName, $str) {
$lines = file($fileName);
foreach ($lines as $lineNumber => $line) {
if (strpos($line, $str) !== false) {
return $line;
}
}
return -1;
}
$new_line = getLineWithString('clientPage.html', 'new_image = '); // notice how I read the variable
echo $new_line;
?>
_
(1)サーバー送信イベント、(2)WebSocket、および(3)ロングポーリングを探しています。 3つすべては、同じ要求を何度も繰り返さずに(ポーリングと呼ばれる)クライアント側で情報を受信するというまったく同じ問題を解決する実際の方法です。
あなたのケースでは、サーバー送信イベント(SSE)から始めます。 WebSocketの追加機能が必要になるとは思われません。SSEは、プロキシサーバーやその他のインフラストラクチャの点で、ロングポーリングと比較して幅広いサポートを提供する可能性があります。
そうは言っても、あなたの主な懸念は時期尚早の最適化を示しています。 推測ではなく、サーバーが処理する要求の正確な数推測の事柄が予想されます(経験が豊富であっても、とにかく間違ってしまうでしょう)。そして、負荷テストを実行することでこの数がわかります。これを超えると、サーバーが誤動作を開始するしきい値が表示されます。