PHP自动关闭脚本末尾的连接

时间:2016-04-23 12:51:51

标签: php mysql

我知道PHP会在脚本结束时自动关闭打开的MySQL连接,而打开持久连接的唯一可行方法是使用适当的PHP函数;已经提出并回答了很多问题。 我想知道的是保持临时连接而不是持久连接的好处 - 或者不方便 -
编辑: 每个PHP用户会话的持久连接 例如,语句如下:

session_start();
$connection = new mysqli($host, $user, $pass, $db);
$_SESSION['connection'] = $connection;

可能会设置对mysqli对象的引用,该对象对于同一用户在同一会话中的网站导航中执行多个查询非常有用。

如果连接应该在激活后很快使用,那么将它打开以进行进一步查询是不正确的选择?当多个用户是来自网站的HTTP请求页面以保持MySQL连接存活时,这种方法可能会产生不方便的情况(以及可能的安全风险)? 我想知道更多。谢谢。

1 个答案:

答案 0 :(得分:2)

连接到MySQL或任何数据库的开销很大,尽管它通常不大。当MySQL服务在不同的服务器上运行时,或者根据所需的身份验证方法和init命令,这种开销会更大。

更多,MySQL连接可能有相关的缓存。因此,重用连接可能能够重用这些缓存。

但是在会话中保存资源并不起作用。会话数据被序列化,并存储在例如请求之间的文件。这就是必须使用持久连接方法的原因。

原因是连接最终是内部类的资源或套接字连接,而且无法保存"没有特殊处理。尝试一下,你会发现你得到了一个错误(使用PDO和mysqli。)

mysqli::query(): Couldn't fetch mysqli

我不认为有任何方法可以获得特定于会话的连接重用,而无需编写扩展来实现它。理论上它是可能的,理论上你可以实现一种方法来通过会话ID从池中提取连接。

但持久数据库连接存在许多潜在的缺点和风险:

  1. 如果您的应用程序创建TEMPORARY TABLE,那么这些表在下次运行时仍然存在,因为它是相同的MySQL会话。

  2. 如果您设置了任何变量(SET SESSION等),它们将被保留。

  3. 根据交易的处理方式,从理论上讲,持久连接可能正在进行交易。

  4. 如果应用程序发出任何LOCK命令或使用用户锁,则可以在请求之间保持锁定,并在不知情的情况下保留在新请求中。

  5. 在多租户(共享)网络服务器上,另一个进程以某种方式获取数据库访问权限的风险应该更高。

  6. 这可能会导致大量连接长时间打开,从而增加了数据库服务器上的资源使用量。

  7. 您仍然希望请求之间的连接可能会丢失。