0

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

假设我server.php从我的client.html页面调用,每 5 秒获取一次响应。这是client.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);
}

现在在server.php文件中,我包含数据库文件 (database.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
}
?>

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

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

现在看到的问题是,每 5 秒创建一个新的 mysql 连接(我看到在 Mysql Administrator > Server Connections 中创建了很多连接)。

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

4

2 回答 2

1

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

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

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

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

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

更好的解决方案:

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

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

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

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

于 2012-05-31T07:57:13.717 回答
0

连接池将是您的答案。我不是 PHP 专家,但我在 google 上找不到任何东西向您展示如何进行连接池。

您可能想阅读这个 SO 问题以获取更多信息:PHP 中的连接池

希望有帮助。

于 2012-05-31T07:56:13.170 回答