Demo.php 文件
<?php
function write_back()
{
echo file_get_contents("sample.html");
sleep(2);
write_back();
}
write_back();
?>
导致我错误Fatal error: Maximum execution time of 30 seconds exceeded in C:\xampp\htdocs\omnama\demo.php on line 8
我每2秒钟回复一次从php脚本到ajax请求的html内容。
Demo.html 文件
function loadXMLDoc()
{
var xmlhttp;
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.status==200)
{
document.getElementById("myDiv").innerHTML=xmlhttp.responseText;
}
}
xmlhttp.open("GET","demo.php",true);
xmlhttp.send();
}
让我解释一下我想做什么。我有不断更新的sample.html文件,它可能包含当前登录的用户数或者可以聊天的人数,等等。
我使用了一个html文件,因为无论何时新用户登录,都会使用PHP文件概念使用用户名更新html文件,然后将这些html文件更新为所有在线用户。所以我只是更新{ {1}}标记有demo.php文件
给出的响应我使用过HTML文件,因为每次都要请求MySql检查是否有人登录,会导致严重的服务器问题,这就是为什么我要使用html文件。但每次回复文件内容都会给我这些错误。
我正想着这样做。只检查文件的最后修改时间,如果它与前一个修改时间不同,则回显其内容,这是正确的方法吗?有人能解释我如何跟踪sample.html并将其内容更新为登录用户?我需要一些帮助。谢谢
答案 0 :(得分:0)
可能有几种方法可以解决这个问题,最后我猜测它取决于你有多少请求/更新。
但是我认为首先你需要决定如何检索你感兴趣的结果。
简单解决方案:您可以使用setInterval()并让浏览器在服务器(POLL)上执行新的XmlHttpRequest,以按特定的预定义时间间隔检索新的用户列表
更复杂的解决方案:您可以建立一个“Web-socket”,如服务器和浏览器之间的连接,然后按下用户列表中的浏览器。您可以设置像服务器,长轮询自定义实现或socket.io这样的彗星(http:// http://socket.io/ - 我是一个巨大的粉丝)并让服务器通知监听浏览器值得通知发生。
现在到服务器端:
就我个人而言,我并不喜欢你的方法必须写入html文件以避免数据库查询。显而易见的方法是根据请求在数据库中查询新用户并回复。是否有这么多用户会导致服务器瓶颈?如果是这样,你可以添加更多的服务器吗? (mysql被复制只是为了服务这个?)如果你对所提出的请求添加时间戳(或告诉我自XXX以来发生的变化),你可能会加快查询速度。
你有其他选择吗?即如果你最终使用socket.io,你的整个在线 - 离线状态可以由服务器端的套接字状态处理而不需要其他任何东西。 (socket.io服务器知道哪些客户端连接到它)。
另一个想法可能是将在线用户保留在内存存储器中,例如memcached或redis服务器。因此,在每次登录/注销时,您都会更新一个memcached服务器,并相应地从中检索结果。
如果我花更多的时间,我可能会想到更多的方法。但是,您需要确保的是,如果您确实需要所有这些,并且无法使用简单的SQL查询。
答案 1 :(得分:0)
我不认为使用递归函数write_back是个好主意。 每2秒使用ajax发送xmlhttprequest(setTimeout或setInterval)可能会更好, 或者你可以使用彗星科技。 第一个要回答的问题,希望得到这些帮助。