草庐IT

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

coder 2023-10-12 原文

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

编辑: 每个 PHP 用户 session 的持久连接。
例如,如下语句:

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

可能会设置对 mysqli 对象的引用,这对于同一用户在同一 session 中跨网站导航执行多个查询很有用。

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

最佳答案

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

此外,MySQL 连接可能有关联的缓存。所以重用一个连接也许能够重用这些缓存。

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

原因是连接归根结底是一个资源,或者是内部类上的socket连接,这个不经过特殊处理是无法“保存”的。试试吧,你会发现你得到一个错误(使用 PDO 和 mysqli。)

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

我认为如果不编写扩展来实现它,就没有任何方法可以重用特定于 session 的连接。不过,理论上这是可能的,理论上您可以实现一种方法,通过 session ID 从池中拉出连接。

但是持久数据库连接有很多潜在的缺点和风险:

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

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

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

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

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

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

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

关于PHP 在脚本结束时自动关闭连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36811072/

有关PHP 在脚本结束时自动关闭连接的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  3. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  4. ruby-on-rails - 独立 ruby​​ 脚本的配置文件 - 2

    我有一个在Linux服务器上运行的ruby​​脚本。它不使用rails或任何东西。它基本上是一个命令行ruby​​脚本,可以像这样传递参数:./ruby_script.rbarg1arg2如何将参数抽象到配置文件(例如yaml文件或其他文件)中?您能否举例说明如何做到这一点?提前谢谢你。 最佳答案 首先,您可以运行一个写入YAML配置文件的独立脚本:require"yaml"File.write("path_to_yaml_file",[arg1,arg2].to_yaml)然后,在您的应用中阅读它:require"yaml"arg

  5. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  6. ruby - 无法在 60 秒内获得稳定的 Firefox 连接 (127.0.0.1 :7055) - 2

    我使用的是Firefox版本36.0.1和Selenium-Webdrivergem版本2.45.0。我能够创建Firefox实例,但无法使用脚本继续进行进一步的操作无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055)错误。有人能帮帮我吗? 最佳答案 我遇到了同样的问题。降级到firefoxv33后一切正常。您可以找到旧版本here 关于ruby-无法在60秒内获得稳定的Firefox连接(127.0.0.1:7055),我们在StackOverflow上找到一个类

  7. ruby - 如何关闭 ruby​​ gem "Spreadsheet?"中的文件 - 2

    下面的代码在我第一次运行它时就可以正常工作:require'rubygems'require'spreadsheet'book=Spreadsheet.open'/Users/me/myruby/Mywks.xls'sheet=book.worksheet0row=sheet.row(1)putsrow[1]book.write'/Users/me/myruby/Mywks.xls'当我再次运行它时,我会收到更多消息,例如:/Library/Ruby/Gems/1.8/gems/spreadsheet-0.6.5.9/lib/spreadsheet/excel/reader.rb:11

  8. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  9. postman——集合——执行集合——测试脚本——pm对象简单示例02 - 2

    //1.验证返回状态码是否是200pm.test("Statuscodeis200",function(){pm.response.to.have.status(200);});//2.验证返回body内是否含有某个值pm.test("Bodymatchesstring",function(){pm.expect(pm.response.text()).to.include("string_you_want_to_search");});//3.验证某个返回值是否是100pm.test("Yourtestname",function(){varjsonData=pm.response.json

  10. ruby - 确定 ruby​​ 脚本是否已经在运行 - 2

    有没有一种简单的方法可以判断ruby​​脚本是否已经在运行,然后适本地处理它?例如:我有一个名为really_long_script.rb的脚本。我让它每5分钟运行一次。当它运行时,我想看看之前运行的是否还在运行,然后停止第二个脚本的执行。有什么想法吗? 最佳答案 ps是一种非常糟糕的方法,并且可能会出现竞争条件。传统的Unix/Linux方法是将PID写入文件(通常在/var/run中)并在启动时检查该文件是否存在。例如pid文件位于/var/run/myscript.pid然后你会在运行程序之前检查它是否存在。有一些技巧可以避免

随机推荐