0

同様の質問を調べましたが、探しているものがまったく見つかりませんでした...

PHP で記述された Web ページがあり、外部の .txt ファイルの内容を表示する必要があります。.txt ファイルの内容は定期的に変更されるため、たとえば 20 秒ごとに更新する必要があります。

IFRAME を挿入し、PHP インクルードを使用してファイルの内容を表示することで、これを実現できました。次に、インクルード ページを 20 秒ごとに更新します。

これは正常に動作しますが、IFRAME の更新は、更新の量が原因で Web サイトの統計に大混乱を引き起こしています。ページビューに対するカウントです。

たとえば、AJAX などを使用してこれを行うことはできますか? 私の統計に深刻な影響を与えず、サーバーにそれほど負荷をかけずにこれを行う別の方法であると確信していますか?

私がすでに持っているものを達成するのにすでに何日もかかっているので、できるだけ多くの具体的な説明を親切に提供してください!

よろしくお願いします!

4

5 に答える 5

1

あなたが Ajax/JavaScript を要求したことは知っていますが、Java アプレットはほとんどのデスクトップ ブラウザーで動作し、このタスクは Java では非常に簡単なので、Java アプレットでそれを行う方法の例を作成しました。

// PHP/HTML embed code
<APPLET CODE="readTextFile.class" width=400 height=300>
    <PARAM NAME="fileToRead" VALUE="<?php echo $textfile ?>">
    Your browser does not support the <code>applet</code> tag.
</APPLET>

javac "path/to/readTextFile.java"cmd.exeのように Java ファイルをコンパイルする必要があります。

// readTextFile.java

import java.applet.*;
import java.awt.*;
import java.io.*;
import java.net.*;
import java.util.*;

public class readTextFile extends Applet {

   String fileToRead = "path/to/myfile.txt";
   StringBuffer strBuff;
   TextArea txtArea;

   public void init(){
       txtArea = new TextArea(300, 400);
       txtArea.setEditable(false);
       add(txtArea, "center");

       // First try the HTML applet parameter, if not use fileToRead variable
       String prHtml = this.getParameter("fileToRead");
       if (prHtml != null) fileToRead = new String(prHtml);

       // Set up a timer to read the file every 20 seconds
       Timer t = new Timer();
       t.scheduleAtFixedRate(new TimerTask() {
           public void run() {
               readFile();
           }
       }, 0, 20*1000);
   }

  public void readFile(){
       String line;
       URL url = null;
       try{
           url = new URL(getCodeBase(), fileToRead);
       } catch (MalformedURLException e) {
           //handle or do nothing
       }

       try {
           InputStream in = url.openStream();
           BufferedReader bf = new BufferedReader(new InputStreamReader(in));
           strBuff = new StringBuffer();
           while((line = bf.readLine()) != null){
               strBuff.append(line + "\n");
           }
           txtArea.append("File Name : " + fileToRead + "\n");
           txtArea.append(strBuff.toString());
       } catch(IOException e) {
           e.printStackTrace();
       }
   }
}

これにより、サーバーから 20 秒ごとにファイルが読み取られます。アクセスしようとしているファイルが、readTextFile.class を配置する場所と同じフォルダーまたはその下 (ただし、上ではない) にあることを確認してください。

テキスト ファイルは同じくらい多くのクレイジー ヒットを取得しますが (ただし、それを回避する方法はありません)、ページはクレイジー ヒットを取得しないことに注意してください。

于 2012-04-16T11:09:01.080 に答える
1

jquery を使用している場合は、このコードを試すことができます。テキスト ファイルを取得し、id textdiv の div 内にコンテンツを配置します。

<script type='text/javascript'>
var doInterval;
function getfile() {
  $.ajax({
    url: "file.txt",
    complete: function(request){
      $("#textdiv").html(request.responseText);
    }
  });
}
doInterval = setInterval(getfile, 20000);
</script>
<div id="textdiv"></div>
于 2012-04-16T11:09:32.780 に答える
0

PHPでComet/Long Pollingのようなものを使用することは間違いありませんが、この質問に対する受け入れられた回答が述べているように、サーバーとしてApacheなどを使用する場合はいくつかの注意点があります。

PHPに限定されていない場合は、socket.ioを使用できます。これは、原因に最適です。また、クライアントがあまり多くない場合でも、Cometは問題ない可能性があります。

于 2012-04-16T11:08:33.400 に答える
0

セッションに基づいて Google アナリティクス JavaScript を非表示にして、そのセッションで 1 回だけ読み込まれるようにします。

<?php
session_start();
if (!isset($_SESSION['beenHere']) || !$_SESSION['beenHere']) {
?>
  <!-- ga.js javascript here -->
<?php
} else {
  $_SESSION['beenHere'] = true;
}
?>

その後、必要に応じてページをリロードし続けることができます。ただし、これはPHP でテキスト ファイルをロードする必要があることを前提としていますか? それ以外の場合は、テキスト ファイルを iFrame にロードするだけでなく、JavaScript の setTimeout 呼び出しを使用して iframe src を更新することはできませんか?

于 2012-04-16T11:08:42.837 に答える
0

プロトタイプをお勧めします。すぐに使用できる定期的な更新をサポートしています。そのプロトタイプ JS スクリプトを取得してページに含めます (ここからダウンロードしてください)。次に、このスクリプトをスクリプト ブロックに追加します。

new Ajax.PeriodicalUpdater('logger', 'path/to_file.php',
{ 
    method:'post',
    parameters: {sender:'mrigesh',reciever:'browser'},
    frequency: 20,
    decay: 2
});

したがって、「path/to_file.php」は、定期的に更新する必要がある情報の一部を提供します。あなたの好みに合わせて頻度を変更してください(あなたの質問で20を見ました!)。Decay は、同じデータが何度も受信された場合に、サーバーに送信されるリクエストの期間を遅らせる機能です... API パス:読み取り

于 2012-04-16T12:00:57.287 に答える