我正在为一个进行直播的网站编写一个聊天程序,就像您可以猜到的那样,对于任何非应用程序驱动的聊天,它依赖于循环 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 秒一个查询。
或者我是否已经走在正确的道路上,只需在每次调用时查询服务器?
最佳答案
这就是我的想法,我只使用数据库进行了几次测试,虽然响应很快,但扩展性不佳,连接很快就被耗尽了。所以我决定快速编写一点缓存逻辑。到目前为止,它运行良好,似乎让我可以随心所欲地扩展我的聊天。
$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 解析为实际链接等,而开销要少得多。
关于php - 关于减少从 AJAX 快速调用 PHP 脚本的服务器开销的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33054224/