Обновить содержимое внешнего.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: читать