关于减少从AJAX快速调用PHP脚本的服务器开销的建议


Advice on reducing server overhead of rapidly called PHP script from AJAX

我正在为一个现场直播的网站编写一个聊天程序,就像您可以猜到的那样,任何非应用程序驱动的聊天都依赖于循环AJAX调用来获取新信息(消息),在我的情况下,每2秒一次。我的JSON是通过PHP创建的,并由SQL填充,这是我的一些关注,虽然它显示没有明显的影响我的服务器目前,我无法预测增加几百个用户的混合可能会做什么。

<?PHP
require_once("../../../../wp-load.php");
global $wpdb;
$table_name = $wpdb->prefix . "chat_posts";
$posts = $wpdb->get_results("SELECT * FROM ". $table_name ." WHERE ID > ". $_GET['last'] . " ORDER BY ID");
echo json_encode($posts);
?>

显然没有太多的空间来优化代码本身,但我有点担心Wordpress SQL引擎写得有多好,如果它会使我的SQL陷入困境,一旦它达到每2秒接收200个请求的程度。是否将数据库查询的json编码结果缓存到一个文件,然后对PHP脚本的新调用进行检查,并使用新查询重新构建文件或根据其最后修改日期传递文件内容是处理此问题的更好方法?此时,我在文件系统上添加了更大的负载,但无论用户数量如何,都将SQL负载减少到每2秒一个查询。

或者我是否已经在正确的路径上,每次调用都只查询服务器?

所以这就是我想到的,我去了DB唯一的路线进行了一些测试,虽然响应很快,但它没有很好地扩展,连接很快就被吃掉了。所以我决定写一些快速的缓存逻辑。到目前为止,它工作得非常好,似乎允许我将我的聊天扩展到我想要的大小。

$cacheFile = 'cache/chat_'.$_GET['last'].'.json';
if (file_exists($cacheFile) && filemtime($cacheFile) + QUERY_REFRESH_RATE > time())
{
    readfile($cacheFile);
} else {
    require_once("../../../../wp-load.php");
    $timestampMin = gmdate("Y-m-d H:i:s", (time() - 7200));
    $sql= "/*qc=on*/" . "SELECT * FROM ". DB_TABLE ."chat_posts WHERE ID > ". $_GET['last'] . " AND timestamp > '".$timestampMin."' ORDER BY ID;";
    $posts = $wpdb->get_results($sql);
    $json = json_encode($posts);
    echo $json;
    file_put_contents($cacheFile,$json);
}

它也很棒,因为它允许我对消息运行格式化功能,例如将URL解析为实际链接等,而开销要小得多。