我在PHP中创建了一个类似于聊天框的聊天框。唯一的问题是它不会自动重新加载。有没有办法让它在PHP中重新加载,或者我是否必须移动一切所以我可以使用AJAX?此外,我的一个用户经常在线。我将它设置为离线,如果他们在最后3分钟内按下了一个键或点击了它们,并在他们离开页面时将它们设置为离线。他们使用的是Firefox 9.0。这是因为使用了onunload吗?什么是解决方案?
答案 0 :(得分:4)
您可以使用可由PHP生成的meta refresh
标记,但它不是特定于PHP的功能。
<meta http-equiv="refresh" content="600">
这将在600秒后刷新内容。您可以根据应用程序的需求更准确地节省时间。
Ajax可能是检查用户不活动的首选方法。以下是关于检查用户活动的类似帖子 - How can I detect with JavaScript/jQuery if the user is currently active on the page?
<强>更新强>
关于如何在Firefox中处理用户退出的第二个问题,就像你说onunload
可能不一致一样。这是使用ajax再次闪耀的地方。如果您的应用程序停止从客户端接收ajax更新,您可以进行某种清理以将其标记为非活动状态。
我们在ASP.Net MVC应用程序中遇到过类似的情况。我们最终使用Application Variables来存储最近的活动和用户状态。一个php示例可以是found here。
希望这有帮助!
答案 1 :(得分:2)
您可以添加一些JavaScript来自动刷新整个页面,但使用AJAX对最终用户来说会好得多。
答案 2 :(得分:2)
您将不得不在大约一分钟后超时待处理请求或浏览器执行此操作。不同的浏览器有不同的超时设置,所以只需使用小的东西。超时后,您打开一个新的待处理请求,不会遗漏任何内容。
我有一些代码可以玩: listen.php(客户端调用此方法创建待处理请求,等待事件$ eid的消息nr $ mnr。
define('WAIT_MAX', 55); // wait max 55 sec
define('WAIT_INT', 1); // wait 1 sec per call
$start = time();
while ($start + WAIT_MAX > time())
{
// check if an event occured
$res = mysql_query('SELECT * FROM event WHERE `eid`="'.$eid.'" AND `mnr`="'.$mnr.'"');
if (mysql_num_rows($res) > 0)
{
// event occured
$row = mysql_fetch_assoc($res);
$msg = $row['msg'];
echo "<event eid=\"$eid\" mnr=\"$mnr\" msg=\"$msg\" />\n";
die();
//die('event occured: '.$msg."<br>\nNext mnr=".($mnr+1));
//break;
}
else
{
// no event occured
mysql_free_result($res);
sleep(WAIT_INT);
}
}
die(WAIT_MAX . ' seconds passed and no event occured.');
Bob将消息发送到yell.php,提供$ msg
if (isset($_GET['msg']))
$msg = $_GET['msg'];
else
$msg = 'no message given, just firing the event.';
mysql_query('INSERT INTO `event` (`eid`, `mnr`, `msg`) VALUES ("'.$eid.'", "'.$mnr.'", "'.$msg.'")');
一些init.php使它工作:
$eid = -1;
$mnr = -1;
if (isset($_GET['eid']) && isset($_GET['mnr']))
{
$eid = max(0, (int)$_GET['eid']);
$mnr = max(0, (int)$_GET['mnr']);
}
elseif (isset($_GET['eid']))
{
$eid = max(0, (int)$_GET['eid']);
$mnr = 1;
}
else
die('no eid given');
根据需要使用和修改此代码。