在PHP页面中刷新内容外部.txt文件

时间:2012-04-16 11:00:57

标签: php html ajax iframe

我看过类似的问题,但还没找到我要找的东西......

我有一个用PHP编写的网页,我需要显示外部.txt文件的内容,我需要刷新每个,比如20秒,因为.txt文件内容会定期更改。

我已经能够通过放入IFRAME并使用PHP include来显示文件的内容来实现这一点。然后我每隔20秒刷新一次包含页面。

这样可以正常工作除外,IFRAME刷新会对我的网站统计数据造成严重破坏,因为刷新量很大,ehcih计入网页浏览量。

我可以使用AJAX或其他东西来做这件事吗?我确定他们可能是另一种方式来做这件事而不会严重影响我的统计数据并且不会在服务器上造成太大的负担?

请尽量提供尽可能多的具体说明,因为我已经花了几天时间来实现我已经拥有的东西!

非常感谢提前!

5 个答案:

答案 0 :(得分:1)

我知道你要求使用Ajax / JavaScript,但是Java Applets适用于大多数桌面浏览器,这个任务在Java中非常简单,所以我给你一个如何用Java applet做这个的例子。

// 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>

您需要在cmd.exe中编译javac "path/to/readTextFile.java"之类的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

请注意,文本文件会获得尽可能多的疯狂点击(但是没有办法解决这个问题)但是你的网页不会发疯。

答案 1 :(得分:1)

如果您使用的是jquery,可以尝试以下代码: 它将获取文本文件并将内容放在div中,并带有id文本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>

答案 2 :(得分:0)

你可以肯定地使用像Comet / Long Polling这样的东西,但正如the accepted answer to this question提到的那样,在使用例如{3}}时会有一些注意事项。 Apache作为服务器。

如果您不限于PHP,则可以使用socket.io,这非常适合原因。此外,如果您没有太多客户,Comet仍然可以为您服务。

答案 3 :(得分:0)

我会根据会话隐藏Google AnalyticsJavaScript,因此它只为该会话加载一次:

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

然后您可以根据需要继续重新加载页面。但是,假设您需要使用PHP加载文本文件?否则,您是否可以将文本文件加载到iFrame中,并使用JavaScript setTimeout调用来刷新iframe src?

答案 4 :(得分:0)

我会建议原型;它支持定期更新,开箱即用!在您的页面上获取并包含该原型JS脚本(从here下载)。然后在脚本块中添加此脚本。

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路径:read