我在Windows Server 2012R2上安装了IIS 8.5 / PHP 5.4。
我有一个简单的PHP脚本,每秒都会不断更新文件test.shtm(它只是为文件写了一个递增的数字):
test_call.php: $ pctrl_file =的fopen("作业/ test.grass-PROC"' W&#39);
for ($counter=1;$counter<=100;$counter++)
{if ((fseek($pctrl_file,0)==-1||!fwrite($pctrl_file,$counter))||!fflush($pctrl_file))
echo ('Could not write to file resource');
sleep(1); //delay 1 sec
}
if (!fclose($pctrl_file)) echo 'Failed to close the file';
IIS中的缓存设置为“无缓存”。对于.shtm文件。我也尝试过选项&#34;阻止所有缓存&#34;。
在IIS处理程序列表中,我看到.shtm有一个处理程序,所以我认为.shtm内容不被认为是静态的
在IIS配置编辑器中,我已将.php和.shtm
的ResponseBufferLimit设置为0我还尝试了另一个文件扩展名.aaa而不是.shtm,其中.aaa设置为IIS MimeType列表中的plain / text。 (它没有变化)。
我从客户端浏览器调用此PHP脚本。 我检查test.shtm文件如何通过jquery / ajax使用GET(或POST,它不做更改)进行更改,以供参考,请参阅我的消息下面的代码。
在另一个标签中,我输入此生成的test.shtm文件的URL。 我检查test.shtm文件是否真的使用RemoteDesktop更改,我确认服务器上的文件每秒都会更改。 但是,ajax输出和纯页面输出(在任何浏览器中按下F5到test.shtm的URL)在两次或三次迭代后停止更新。
有三个特点:
1)当PHP脚本完成时,ajax输出立即更新以显示&#34; 100&#34;正如预期的那样,如果我在test.shtm上按F5(在PHP脚本完成之后),它会显示&#34; 100&#34;如预期的那样。
2)正是在我使用RemoteDesktop在记事本中打开test.shtm文件时,ajax输出更新为当前值,浏览器中的F5更新内容正确(但只有一次,直到我打开test.shtm服务器再一次)
3)问题2有时是真实但不总是
为了防止在浏览器中缓存,我尝试添加这些HTTP响应头是IIS配置: 缓存控制:无存储,必须重新验证 到期:0 它什么都没改变。
关于进行此测试的目的,我无法在生成的文件中添加任何其他内容,它应该只包含一个数字。
完全相同的脚本在我的本地计算机上的Windows 7 + Apache 2.2(具有默认缓存和缓冲设置)下运行良好。 我在IIS配置(或其他任何地方)做错了什么?
ajax checker(我也尝试显式调用test_call.php =&gt;无变化):
<html><head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<script src="../jquery_min.js"></script>
</head>
<body>
<div id="answer"></div>
<script type="text/javascript">
function read_pctl()
{$.ajax({type: "GET",
cache:false,
mimeType: "text/plain",
url: 'jobs/test.shtm', //also tried adding ?_='+Math.random(),
data: $(this).serialize(),
success: function(pctl_data) {$('#control').html('updated: '+pctl_data); },
error: function(obj,msg,err) {console.log('TEST pctl error, file "jobs/test.grass-proc" : '+msg+' - '+err);}
});
}
$('#answer').html("<div id='control' style='border:blue 1px solid'>Place for updated numbers</div>"); //display progress message
pctl_updater=setInterval(read_pctl,1000); //start updating control-container
$.ajax({type: "POST",
url: 'test_call.php',
data: $(this).serialize(),
success: function(data) {$('#answer').html("<span class='error'>Finished<br></span>"); }
error: function(obj,msg,err) {$('#answer').html("<span class='error'>TEST call error:<br></span>"+msg+' - '+err); }
});
</script>
</body>
</html>