gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 22:25:14 26 4
gpt4 key购买 nike

我构建了一个由 PubNub 提供支持的实时聊天应用程序。目前,我允许仅通过 PubNub 直接向用户发送消息和从用户接收消息。但是,我希望通过首先将它们推送到我的服务器/数据库(内置 PHP 和 MySQL)来“保存”这些消息,然后在成功输入后通过 PubNub 发送给用户。

我目前的 PHP 服务器的设置接受请求并将其定向到正确的案例声明,给定定义的 action 作为传递到请求中:

<?php

switch($action)
{

case "userLogin":
...
break;


case "signUpUser":
...
break;

...

case "syncWithServer":
...
break;

?>

其中每个 case 语句允许数据库插入和更新,并在给定数据传递后操作成功后返回。

有关详细示例,我们有下面的 sendMessage 案例。必须插入数据然后返回最新的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;

鉴于聊天应用程序需要非常低的延迟,这个公式可能会遇到哪些我在非常低使用率测试中可能看不到的生产问题?

如何缓解这些问题?

Heroku 是否适合部署此类服务器?

最佳答案

如果许多用户同时聊天,那么保存到数据库(我猜是“syncWithSErver”)可能会成为瓶颈,那个 case 语句执行数据库查询,数据库会过载,因此,减慢消息发送速度。

不是直接保存它们,而是使用任何内存缓存,例如 memcache 或 redis 来临时存储它们,并使用后台作业(例如附加到 cron 的 php 脚本)来继续保存它们。

关于PHP实时聊天备份服务器生产问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35460343/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com