2012-04-15 3 views
0

Я пытаюсь передать данные, считанные из файла, в chrome client. Я могу передавать данные успешно, но мои ответы получаются в кэше, и я хочу предотвратить это. Такая ситуация существует, потому что мой плоский файл содержит записи данных, которые независимы друг от друга, и я тоже хочу относиться к ним. Например, мой файл содержит:Предотвращение локального кэширования ответов при потоковой передаче HTTP

{idle_time:94125387364,system_time:98954710321,user_time:3683963615} {idle_time:94125387789,system_time:98954710456,user_time:3683963845} {idle_time:94125387876,system_time:98954710678,user_time:3683963986}

так вместо того, чтобы {idle_time: 94125387876, system_time: 98954710678, user_time: 3683963986} (третья позиция) в XMLHTTPRequest.responseText, я получаю

{idle_time:94125387364,system_time:98954710321,user_time:3683963615} <br/> 
{idle_time:94125387789,system_time:98954710456,user_time:3683963845} <br/> 
{idle_time:94125387876,system_time:98954710678,user_time:3683963986} 

ПРИМЕЧАНИЕ. Меня не беспокоят теги breakline и пробелы.

Мой PHP скрипт выглядит так, test.php

<?php 
set_time_limit(0); 
$filename = 'D:\Smoke_Test\data.txt'; 

function flush2(){ 
echo(str_repeat(' ',256)); 
// check that buffer is actually set before flushing 
if (ob_get_length()){    
    @ob_flush(); 
    @flush(); 
    @ob_end_flush(); 
}  
@ob_start(); 
} 

$file_last_modified_time = 0; 

while(true) 
{ 
$modified_time = filemtime($filename); 
$processor_info = ""; 
if ($file_last_modified_time < $modified_time) 
{ 
    header("Expires: Sun, 20 Jan 1985 00:00:00 GMT"); // date in the past 
    header("Cache-Control: no-cache"); 
    header("Pragma: no-cache"); 
    $file_last_modified_time = $modified_time; 
    $handle = fopen($filename,"r"); 
    $processor_info = fgets ($handle); 
    fclose ($handle); 
    @ob_clean(); 
    echo $processor_info."<br/>"; 
    //flush2(); 
} 
flush2(); 
sleep(1); 
clearstatcache(true, $filename); 
} 

?> 

и моя страница HTML выглядит следующим образом: home.htm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-  transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml" > 
<head> 
<title></title> 
<script type="text/javascript" language = "javascript"> 
function read_file() 
{ 
    if (window.XMLHttpRequest) 
     {// code for IE7+, Firefox, Chrome, Opera, Safari 
     xmlhttp=new XMLHttpRequest(); 
     } 
    else 
     {// code for IE6, IE5 
     xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 
     } 
    xmlhttp.onreadystatechange=function() 
     { 
     if (xmlhttp.readyState==4 || xmlhttp.readyState==3) //&& xmlhttp.status==200) 
     { 
      handle_data (xmlhttp.responseText); 
     } 
     } 
    xmlhttp.open("POST","test.php",true); 
    xmlhttp.send(); 
} 

function handle_data (input) 
{ 
    document.getElementById("txtResponse").innerHTML=input; 
} 
</script> 

</head> 
<body> 
<p> 
<input type="button" id="dtnSendRequest" value="Send Request" onclick="read_file()"/> 
</p> 
<p> 
response : <span id="txtResponse"></span> 
<!-- <input type="text" id="txtResponse" width="500"/> --> 
</p> 
</body> 
</html> 

ответ

0

Вы не можете избежать того, что происходит с responseText. Его характер Http Streaming (не локальный или кеширующий) делает это возможным. Я нашел очень хорошую статью, в которой говорится о моей ситуации, а также о решении.

В статье http://ajaxpatterns.org/archive/HTTP_Streaming.php

После пункта содержит мое положение, а также решение для нее.

«Свойство responseText XMLHttpRequest всегда содержит содержимое, выгруженное из сервера, даже если соединение все еще открыто. Таким образом, браузер может выполнять периодическую проверку, например, чтобы увидеть, изменилась ли ее длина. Одна проблема, однако, это то, что когда-то покраснел, служба не может отменить что-либо его вывод. Например, строка responseText, возникающая из службы таймера, может выглядеть так: «12:00:00 12:01:05 12:01:10 », тогда как в идеале это будет просто« 12:00:00 », а затем« 12:01:05 », а затем« 12:01:10 ». Решение состоит в том, чтобы проанализировать строку ответа и посмотреть только на последний значение. Точнее, последнее полное значение, так как возможно, что текст заканчивается частичным результатом. Пример этой методики работает таким образом. Чтобы упростить синтаксический анализ, служба выводит каждое сообщение, ограниченное специальным токеном, «@ END @ "(тег XML будет альтернативой подход). Затем можно запустить регулярное выражение, чтобы захватить последнее сообщение, за которым должен следовать этот токен, чтобы убедиться, что он завершен »

0

попробуйте добавить это к верхней части вашего PHP файл

header("Expires: Sun, 20 Jan 1985 00:00:00 GMT"); // date in the past 
header("Cache-Control: no-cache"); 
header("Pragma: no-cache"); 
+0

Нужно ли добавить это на серверный или клиентский код? –

+0

на сервере –

+0

Я изменил php код, но проблема все еще существует. Вы можете видеть измененный код в вопросе. –

0

Используйте это, чтобы отключить кэш:

header("Cache-Control: no-cache, must-revalidate"); 
header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); 

Убедитесь, что вы вызываете это перед отправкой любого выхода.

+0

Я изменил код php, но проблема все еще там. Вы можете увидеть измененный код в вопросе –

+0

Попытайтесь вставить мой код ниже '@ob_clean();' – Jeffrey

+0

Got Warning: Невозможно изменить информацию заголовка - уже отправленные заголовки (вывод начался с C: \ wamp \ www \ Dashboard \ test.php : 14) –

Смежные вопросы