Обновить содержимое внешнего.txt файла на странице PHP

Я посмотрел на похожие вопросы, но не нашел того, что ищу...

У меня есть веб-страница, написанная на PHP, и мне нужно отображать содержимое внешнего файла.txt, и мне нужно обновлять его, скажем, каждые 20 секунд, так как содержимое файлов.txt меняется регулярно.

Я смог добиться этого, вставив IFRAME и используя PHP include для отображения содержимого файла. Затем я обновляю страницу включения каждые 20 секунд.

Это работает отлично, КРОМЕ, обновления IFRAME приводят к хаосу в статистике моих сайтов из-за количества обновлений, даже если это количество просмотров страниц.

Могу ли я использовать, скажем, AJAX или что-то еще для этого? Я уверен, что они могут быть другим способом решить эту проблему, не оказывая серьезного влияния на мою статистику и не вызывая значительную нагрузку на сервер?

Пожалуйста, предоставьте как можно больше конкретных инструкций, так как мне потребовались дни, чтобы достичь того, что у меня уже есть!

Спасибо заранее!

5 ответов

Если вы используете jquery, вы можете попробовать этот код: он извлечет текстовый файл и поместит содержимое в div с id textdiv

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

Я знаю, что вы просили 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>

Вам нужно будет скомпилировать файл Java, как javac "path/to/readTextFile.java" в cmd.exe

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

Обратите внимание, что текстовый файл получит столько же сумасшедших хитов (но нет пути к этому), но ваша страница не получит сумасшедших хитов.

Вы можете определенно использовать что-то вроде Comet/Long Polling с PHP, но, как упоминается в принятом ответе на этот вопрос, существуют некоторые предостережения при использовании, например, Apache в качестве сервера.

Если вы не ограничены PHP, вы можете использовать http://socket.io/, который идеально подходит для этой цели. Кроме того, если у вас не слишком много клиентов, Comet все равно будет в порядке.

Я бы скрыл Google Analytics JavaScript на основе сеанса, чтобы он загружался только один раз для этого сеанса:

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

Затем вы можете продолжить перезагрузку страницы по своему желанию. Однако предполагается, что вам нужно загрузить текстовый файл с помощью PHP? В противном случае, вы можете не просто загрузить текстовый файл в iFrame, а использовать вызов setTimeout JavaScript для обновления iframe src?

Я бы предложил прототип; Он поддерживает периодическое обновление, из коробки! Получите и включите этот прототип 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 в вашем вопросе!). Распад - это функция, которая позволяет задерживать период отправки запроса на сервер, если одни и те же данные поступают снова и снова... Путь API: читать

Другие вопросы по тегам