【问题标题】:Persistent connections that dont persist between two php scripts在两个 php 脚本之间不存在的持久连接
【发布时间】:2016-11-26 12:40:01
【问题描述】:

我在一个 php 文件中创建了一个临时表,并想在另一个 php 文件中访问它。脚本按顺序运行。我使用了 mysqli 并在主机名前添加了 p:。

问题出在我的第二个 php 文件中,我无法访问我的临时表。所以我想知道是否可以这样做?如果是的话怎么办?我正在使用 WAMP 服务器。

【问题讨论】:

  • 向我们展示您的尝试。 提醒:我们不是来为您创建代码的。
  • 根据您的要求,您需要的不是临时表,而是实际的、真实的表。在这种情况下,您的问题就会消失,因为两个脚本都可以访问相同的数据源。
  • @Mjh,我想使用临时表,因为在第二个脚本中,我从中读取数据,然后删除它。我认为就性能而言,创建临时表可能会更好,但我可能错了。

标签: php mysqli persistent-connection


【解决方案1】:

不可能,直接。当用于建立临时表的连接关闭时,临时表将被销毁。当您的“创建”脚本关闭时,它的数据库连接将关闭,并且 mysql 会清理 - 包括销毁该临时表。

这意味着当你的“使用”脚本启动时,它会建立一个新的连接,而没有第一个脚本所做的任何事情。

PHP 中有可用的持久连接,但这些连接存在于一个池中,并且无法控制任何特定脚本从该池中获取哪个连接。您可能会很幸运并为两个不同的脚本收到相同的连接,但这纯属偶然。

您需要一些 OTHER 3rd 持续运行的脚本来保持打开 mysql 连接,同时保留临时表。您的其他两个脚本将与第三个脚本进行通信。

【讨论】:

  • WAMP 的情况下,您写的可能是真的,但我进行了测试。出于此测试的目的,我将php-fpmpm.start_servers = 2pm.max_requests = 0 一起使用,以便进程不会退出。我通过创建持久 PDO 连接连接到 MySQL。在 MySQL 的终端中,我通过发出 SHOW PROCESSLIST\G; 来验证是否已建立连接,它显示 1 个 id 为 6 的连接。我“锤击”我的 php 端点,它执行选择查询。在 500 个 http 请求之后,发出 SHOW PROCESSLIST\G; 会显示一个相同的活动连接。
  • 如果您只有一个站点用户,并且站点上从来没有 2 个以上的并行请求,那么您很可能在池中只有 1 个 pcon。但是一旦你有 2 个以上的脚本并行运行,它们就会建立两个连接,现在所有的赌注都没有了。
  • 使用非持久连接并发出SHOW PROCESSLIST\G; 显示不同的连接过程。鉴于我可能错了,我想看看其他人对此有何看法,因为我知道仓促的测试肯定会导致某个地方出错:)
  • 我正在使用 nginx 和 wrk 来模拟连接。如果是一个用户或两个用户,连接是由 nginx 多路复用的,那么这真的很重要吗?这就是 fastcgi 应用的美妙之处。
  • 感谢您对这个问题的洞察力,这是一个很好的解释。
【解决方案2】:

来自http://php.net/manual/en/mysqli.persistconns.php

然而,mysqli 扩展的持久连接提供了内置的清理处理代码。 mysqli进行的清理工作包括:

(也值得阅读其他内容,但重要的是)

  • 关闭并删除临时表

简而言之,临时表就是这样,临时的。除了为一项特定操作临时存储一些数据外,它不打算用于其他目的。如果您想要更永久的东西,请考虑使用带有内存存储引擎的混凝土表。

【讨论】:

  • 是的,我已经读过,但仍然认为这是可能的。带有内存存储引擎的具体表是什么意思?
猜你喜欢
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-19
  • 2011-10-04
  • 1970-01-01
相关资源
最近更新 更多