我实际上是想创建(或多或少)即时聊天。 只剩下一件事,直到它完成。这是一个由PHP本身每秒检查新条目的数据库。 while循环非常适合它,因为我可以完美地退出它。 问题是,"每一秒"事情不起作用。 我尝试了睡眠(1),但这导致1分钟的服务器冻结,直到脚本完成。 希望有人可以帮助我,我对此问题感到沮丧。
elseif($latestID != 'undefined' && $_POST['returnafter'] == '60')
{
$timeout = '60';
$i = '0';
while ($i != $timeout)
{
$chat_content = "";
$i++;
$getLastID = mysql_query("SELECT id, userid, content, time_posted FROM (SELECT * FROM chat_system ORDER BY id DESC LIMIT 150) chat_system WHERE id > '" . $latestID . "' $extraQuery ORDER BY id ASC");
while ($lastID = mysql_fetch_object($getLastID))
{
$rowID = $lastID->id;
$user_posted_id = $lastID->userid;
$chat_content = $lastID->content;
$chat_posted = $lastID->time_posted;
$getUserData = mysql_query("SELECT username, avatar, loggedIn FROM account_data WHERE account_id=('" . $user_posted_id . "')");
while ($userData = mysql_fetch_object($getUserData))
{
$username = $userData->username;
$useravatar = $userData->avatar;
$loginStatus = $userData->loggedIn;
}
if ($loginStatus == '1')
{
$onlineStatus = '<img src="./images/3DArt/newOnline.png" class="chat_onlineStatus">';
}
else
{
$onlineStatus = '<img src="./images/3DArt/newOffline.png" class="chat_onlineStatus">';
}
if (date('Y-m-d', $chat_posted) == date('Y-m-d'))
{
$time_posted = strftime('Heute, %H:%M', $chat_posted);
}
elseif (date('Y-m-d', $chat_posted) == date('Y-m-d', strtotime("Yesterday")))
{
$time_posted = strftime('Gestern, %H:%M', $chat_posted);
}
elseif (date('Y-m-d', $chat_posted) < date('Y-m-d', strtotime("Yesterday")))
{
$time_posted = strftime("%A, %d %B %Y %H:%M", $chat_posted);
}
if (isset($_POST['parseEmoticons']) && $_POST['parseEmoticons'] == 'true')
{
$chat_content = emoticons($chat_content);
}
$newChatRow.= '<div class="chatRow" id="' . $rowID . '">
<div class="chatRow_container">
<div><img src="' . $useravatar . '" class="chatAvatar">' . $onlineStatus . '<a href="/?page=Profile&User=' . $user_posted_id . '"><b>' . $username . '</b></a>
</div>
</div>' . $modActions . '
<div class="chat_mainMsg">
' . $chat_content . '
</div>
<div class="chatTime">' . $time_posted . '</div>
</div>';
}
$content = str_replace(array(
'\r\n',
'\r',
'\n'
) , "<br />", $newChatRow);
if(!empty($chat_content)) { echo $newChatRow; $i = $timeout; return false; }
if(empty($chat_content)) { sleep(1); return true; }
}
}
我认为,这些信息应该足够了。如果没有,请问。
编辑:请求由Ajax初始化,成功后请求重复。 这就是PHP必须检查60秒的原因。
答案 0 :(得分:0)
你应该让客户端决定它“喜欢”接收哪些消息。
例如,你在客户端调用你的messages.php
类 - 每个ajax,并在最后一次是脚本请求新消息时传递时间戳
示例:
具有1秒循环的ajax间隔调用messages.php?last=123456
并接收在此时间戳之后创建的所有消息。现在你用javascript更新最后一个时间戳等等。
或者你使用一个完美的框架(如果可能的话),它完全适合你的任务来解决这个问题。
http://socket.io/(或js关键字websockets
)