简体   繁体   English

PHP实时聊天备份服务器生产问题

[英]PHP Real-time chat back up server production issues

I have built out a real time chat application powered by PubNub. 我建立了一个由PubNub支持的实时聊天应用程序。 At present, I allow messages to be sent and received directly to and from a user through PubNub alone. 目前,我只允许通过PubNub直接与用户之间收发消息。 However, I wish to "save" these messages by first pushing them to my server/db, built in PHP and MySQL, then upon successful entry, send to the user via PubNub. 但是,我希望通过以下方式“保存”这些消息:首先将它们推送到用PHP和MySQL构建的服务器/数据库中,然后在成功输入后通过PubNub发送给用户。

The setup of my present PHP server accepts the request and directs it to the proper case statment given the defined action passed into the request as: 我当前的PHP服务器的设置接受请求,并将给定的action传递给请求,并将其定向到适当的大小写语句:

<?php

switch($action) 
{

    case "userLogin": 
        ...
    break;  


    case "signUpUser":
        ...
    break;  

        ...

    case "syncWithServer":
        ...
    break;  

?>

where each case statement allows for database insert and update and subsequent return upon the actions success given the data passed. 其中,每个case语句都允许数据库插入和更新,并根据给定的数据在操作成功后随后返回。

For a detailed example, we have the sendMessage case below. 有关详细示例,我们在下面有sendMessage案例。 The data must be inserted and then return the latest sync_id, for that message just inserted, then sent back to the user so as to keep everything in sync: 必须插入数据,然后返回最新的sync_id,对于刚刚插入的消息,然后将其发送回用户,以使所有内容保持同步:

case "sendMessage":

    // Output is: {"message_sync_id":"4"}
    if ($userId = authenticateUser($db, $username, $password, $gcmregid)) 
    {   
        //echo "passed1";
        if (isset($_REQUEST['to_user_sync_id']))
        {
            //echo "passed2";a
             $touserid = $_REQUEST['to_user_sync_id'];               
             $unescapedMessage = $_REQUEST['message_text'];
             $message = mysql_real_escape_string($unescapedMessage);             
             $campaign = $_REQUEST['shared_campaign_id'];
             $location = $_REQUEST['shared_campaign_location_id'];

             if($stmt1 = $db->prepare("INSERT INTO `messages` (`message_sync_id`,`from_user_sync_id`, `to_user_sync_id`, sent_dt, `message_text`,`shared_campaign_id`,`shared_campaign_location_id`) 
                                      SELECT 
                                      CASE 
                                      WHEN max(message_sync_id) is null
                                      THEN 0
                                      ELSE max(message_sync_id)
                                      END + 1
                                      , ?
                                      , ?
                                      , NOW()
                                      , ?
                                      , ?
                                      , ?
                                      from messages;"))
             {
                $stmt1->bind_param("sssss", $userId,$touserid,$message,$campaign,$location);
                $stmt1->execute();
                $stmt1->close();

                $sqlMaxSyncId = "select max(message_sync_id) as message_sync_id from messages;";

                if($resultMaxID = $db->query($sqlMaxSyncId))
                {

                    $row = $resultMaxID->fetch_assoc();

                    $out = json_encode(array('message_sync_id' => $row['message_sync_id']));

                    error_log("sendMessage", 3 , $row['message_sync_id']);

                }
                else
                {
                    $out = FAILED;
                }           

             }
             else
             {
                $out = FAILED;
             }

        }
        else
        {
            $out = FAILED;
        }   
    }
    else
    {
        $out = FAILED;
    }   
break;

Given chat applications require very low latency, what production problems may this formulation run into that I may not see during very low usage testing? 给定聊天应用程序需要非常低的延迟,那么在使用率非常低的测试中,这种配方可能会遇到哪些生产问题,而我可能看不到呢?

How can these be alleviated? 如何缓解这些问题?

Would Heroku be an appropriate environment to deploy such a server? Heroku是部署这样服务器的合适环境吗?

The save to database (which I guess is "syncWithSErver") could become a bottleneck if many users are chatting at the same time as I guess, that case statement executes a database query, a database that would be overloaded, and thus, slowing down the message dispatch. 如果许多用户同时聊天,那么保存到数据库(我想是“ syncWithSErver”)可能会成为瓶颈,该case语句将执行数据库查询,这将导致数据库过载,从而减慢速度消息发送。

Instead of saving them directly, use any memory cache, such as memcache or redis to store them temporary, and use a background job (a php script attached to cron, for example) that will keep saving them. 与其直接保存它们,不如使用任何内存缓存,例如memcache或redis来临时存储它们,并使用将继续保存它们的后台作业(例如,附加到cron的php脚本)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM