在 Ajax 应用程序中以最佳方式使用 mysql


Using mysql optimally in Ajax application

我开发了一个ajax应用程序,其中每5秒调用一次服务器页面,用于从数据库中获取最新数据。

假设我每 5 秒从我的client.html页面调用server.php以获取响应。这是客户端中的示例代码.html

$(document).ready(function() {  
refresh_msg();
});
function refresh_msg()
{
setTimeout(update_msg, 5000);
}
function update_msg()
{
var url = "server.php";
var params = "task=update&id=12";
http.open("POST", url, true);           
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
http.onreadystatechange = function() {
    if(http.readyState == 4 && http.status == 200) {
        var resp = http.responseText;
        }
}
http.send(params);
setTimeout(update_msg, 5000);
}

现在在服务器.php文件中,我包含数据库文件(数据库.php)并为客户端请求提供服务。这是示例代码:

<?php
include_once 'database.php';
if(isset($_POST['task']) && isset($_POST['id']))
{
$sql = "select message from user_messages where id='".$_POST['id']."'";
$res = mysql_query($sql);
// send response
}
?>

最后这是我的数据库.php文件,其中包含数据库连接详细信息:

<?php
mysql_connect("localhost:3306","root","root");
mysql_select_db("my_database");
?>

现在看到的问题是,每 5 秒创建一个新的 mysql 连接(我看到在我的 Mysql 管理员>服务器连接中创建了很多连接)。

我觉得这不是查询数据库的最佳方式。相反,我可以有一个 mysql 连接并将其用于来自客户端的所有后续 ajax 请求吗?

如果您的数据库服务器与 Web 服务器位于同一台机器上,则在每个请求上创建新连接的开销实际上非常小。在大多数简单用例中,为每个请求创建一个与数据库的新连接可能就好了。如果数据库服务器太忙,则可能与应用程序的设计有关,而不是因为打开和关闭连接(有关更好的解决方案,请参见下文)。

如果这个答案根本无法接受,您可以改用持久数据库连接进行探索。在Apache(最流行的Web服务器之一)的通用示例中,有两种情况:

  1. 标准连接。Apache 的父进程将创建一定数量的工作进程(如 Apache 配置中所定义),用于处理请求。 如果请求 PHP 文件,将在该工作进程中创建 PHP 解释器的实例。此外,如果在解释PHP文件期间请求MySQL连接,则将建立与数据库的连接。脚本执行完成后,将关闭与数据库的连接。

  2. 持久连接。以上所有情况都是正确的,除了一个区别:当PHP脚本完成执行时,从该Apache进程到数据库的连接将不会关闭。然后,如果该工作线程处理的下一个请求请求相同的数据库连接(即,使用同一用户/密码连接到同一主机上的同一数据库),则将重用以前使用的连接。

持久连接是否对性能产生实际影响取决于许多因素,从 Web 服务器容量和配置到应用程序设计和数据库结构。

更好的解决方案:

一般来说,你可能不需要持久连接;如果你觉得你的数据库由于轮询(每X秒检查一次的过程)而太忙,你最好实现一个缓存层,完全消除对数据库的访问。

假设您有一个用户对用户的消息传递应用程序,您可以编写一些基本的缓存逻辑,例如:

  1. 在用户页面发出的第一个请求时,查询他的消息并将最新的(或其他)放入缓存中,如memcached。
  2. 每次用户轮询时,检查该值是否在缓存中;如果是,则不更改
  3. 每次用户向其他用户发送消息时,请从缓存中删除接收用户的最后一条消息
  4. 下次接收用户轮询服务器时,它将看不到任何消息,并返回到数据库以获取最新值

每隔几秒钟直接轮询一次数据库通常会导致应用程序不能很好地扩展。

连接池将是您的答案。我不是PHP专家,但我在谷歌上找不到任何告诉你如何做连接池的东西。

您可能需要阅读此 SO 问题以获取更多信息:PHP 中的连接池

希望有帮助。