PHP执行持久数据库检查

时间:2014-07-21 09:55:39

标签: php

我实际上是想创建(或多或少)即时聊天。 只剩下一件事,直到它完成。这是一个由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&amp;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秒的原因。

1 个答案:

答案 0 :(得分:0)

你应该让客户端决定它“喜欢”接收哪些消息。 例如,你在客户端调用你的messages.php类 - 每个ajax,并在最后一次是脚本请求新消息时传递时间戳

示例:

具有1秒循环的ajax间隔调用messages.php?last=123456并接收在此时间戳之后创建的所有消息。现在你用javascript更新最后一个时间戳等等。

或者你使用一个完美的框架(如果可能的话),它完全适合你的任务来解决这个问题。

http://socket.io/(或js关键字websockets