首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PHP pconnect和connect测试失败

PHP pconnect和connect测试失败
EN

Stack Overflow用户
提问于 2011-02-01 14:01:48
回答 1查看 2.1K关注 0票数 4
代码语言:javascript
复制
<?php
$connp = mysql_pconnect("localhost", "root", "password");
echo mysql_stat($connp);
mysql_close($connp);
if(!mysql_ping($connp)){
    echo " false";
}
echo "<br />";

$conn = mysql_connect("localhost", "root", "password");
echo mysql_stat($conn);
mysql_close($conn);
if(!mysql_ping($conn)){
    echo " false";
}
echo "<br />";

?>

大家好,

我已经测试了php pconnect和connect。

上面是代码,下面是结果。

正常运行时间: 697914线程:1个问题: 1530个慢查询:0个打开: 91个刷新表:1个打开的表:每秒0个查询:平均0.2false

正常运行时间: 697914线程:2个问题: 1530个慢查询:0个打开: 91个刷新表:1个打开的表:每秒0个查询:平均0.2false

如您所见,两者都是echo false。应该是pconnect不会显示false,不是吗?因为pconnect正在等待超时。但事实并非如此。

而且,当我真正关闭$connp时,它不能查询任何sql语句。因此,pconnect执行的操作与connect完全相同。

我已经在php.inc中打开了持久化。请告诉我我哪里错了。谢谢大家。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-01 16:46:26

在大多数情况下,没有理由将mysql_close()与持久连接结合使用,但以下是一些解释。

首先,您应该区分资源( PHP变量,内部为:a zval)和连接(例如,TCP或套接字连接,也称为“链接”)。

当您调用mysql_connect()时,每次都会创建一个新的连接,并返回一个新的资源。在同一脚本中多次调用mysql_connect()将创建多个连接,并返回相应的资源。

当您调用mysql_pconnect()时,只有在当前进程中没有找到活动的持久连接时,才会创建一个新的连接,并且每次都会返回一个新的资源。对mysql_pconnect()的多次调用将返回不同的资源,这些资源都指向相同的连接。

mysql_close()将在连接资源上执行操作

  1. 如果资源指向的连接不是持久连接,则该连接将关闭。
  2. 在任何情况下都会销毁该资源。

这确实意味着在持久连接上使用mysql_close(),您将无法再使用此连接,即使此连接仍处于打开状态,您可以使用以下命令进行调试:

代码语言:javascript
复制
<?php
$connp = mysql_pconnect("localhost", "root", "password");
mysql_close($connp);
sleep(60);
?>

并在MySQL中查看该连接仍处于活动状态:

代码语言:javascript
复制
SHOW PROCESSLIST;

如果您在error_reporting中启用了警告,您将看到如下消息:

代码语言:javascript
复制
Warning:  mysql_ping(): 4 is not a valid MySQL-Link resource in ... on line ...

使用先前创建的持久连接的唯一方法是再次创建一个指向它的新资源

代码语言:javascript
复制
$connp = mysql_pconnect("localhost", "root", "password");

在资源上使用mysql_thread_id()将为您提供MySQL连接标识符,以便您可以确保mysql_close()不会关闭持久连接,而只是销毁资源:

代码语言:javascript
复制
<?php
$conn = mysql_connect("localhost", "root", "password");
echo mysql_thread_id($conn), "\n";
mysql_close($conn);

$connp1 = mysql_pconnect("localhost", "root", "password");
echo mysql_thread_id($connp1), "\n";
mysql_close($connp1);

$connp2 = mysql_pconnect("localhost", "root", "password");
echo mysql_thread_id($connp2), "\n";
mysql_close($connp2);
?>

这将输出类似以下内容:

代码语言:javascript
复制
61
62
62
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4859462

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档