PHP 在脚本结束时自动关闭连接


PHP automatically closing connection at the end of the script

我知道PHP会在脚本结束时自动关闭打开的MySQL连接,打开持久连接的唯一可行方法是使用适当的PHP函数;已经提出和回答了许多问题。我想知道的是保持临时连接而不是持久连接

的好处或不方便编辑:每个 PHP 用户会话的持久连接。
例如,如下语句:

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

可以设置对 MySQLli 对象的引用,该对象可用于同一用户在同一会话内跨网站导航执行多个查询。

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

连接到MySQL或任何数据库都有开销,尽管它通常不大。 当MySQL服务在不同的服务器上运行时,或者取决于所需的身份验证方法和初始化命令时,此开销可能会更大。

此外,MySQL 连接可能具有关联的缓存。 因此,重用连接可能能够重用这些缓存。

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

原因是连接最终是一个资源,或者是一个内部类上的套接字连接,如果不进行特殊处理,就无法"保存"。 尝试一下,你会看到你得到一个错误(使用PDO和mysqli)。

mysqli::query(): 无法获取 mysqli

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

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

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

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

  3. 根据事务的处理方式,理论上持久连接可能具有正在进行的事务。

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

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

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

  7. 您仍然必须预料到请求之间的连接可能会丢失。