mysql_close不执行_【mysql】每次请求完都要执行mysql_close()吗?

每次请求完都要执行这个数据库关闭操作吗?

如果忘了执行会怎样?

如果必须要执行,有没有办法让他自动执行呢?

回答

实际上mysql链接作为一个资源,在其创建的时候就被绑上了一个”destructor”:

php-5.2.17/ext/mysql/php_mysql.c

//386行

ZEND_MODULE_STARTUP_D(mysql)

{

REGISTER_INI_ENTRIES();

le_result = zend_register_list_destructors_ex(_free_mysql_result, NULL, "mysql result", module_number);

le_link = zend_register_list_destructors_ex(_close_mysql_link, NULL, "mysql link", module_number);

....

}

//308行

static void _close_mysql_link(zend_rsrc_list_entry *rsrc TSRMLS_DC)

{

php_mysql_conn *link = (php_mysql_conn *)rsrc->ptr;

void (*handler) (int);

handler = signal(SIGPIPE, SIG_IGN);

mysql_close(&link->conn);

signal(SIGPIPE, handler);

efree(link);

MySG(num_links)--;

}

当php脚本结束时,所有的资源会被释放,包括未被关闭的mysql的链接,这时候就会执行_close_mysql_link,关闭对应的链接(注:使用mysql_pconnect创建的链接另当别论)。

如果你希望在php结束的时候自动关闭,可以使用 register_shutdown_function 这个php内建函数。不过参考上面的内容,这么做没有意义。

最后,实际上要求使用mysql_close只是为了优化,如果你的应用请求数很多,用完mysql以后及时关闭,能够避免一些可能的问题,详情可以参考caoz的这篇:http://hi.baidu.com/ncaoz/item/7253e0…

作为良好的习惯,最好是及时关闭mysql的连接,为什么呢?

假如说你从数据库里获取了数据以后,还做了很多花时间的工作,比如说数据整理,视图渲染等,不到php脚本结束连接是不会关闭的,期间如果mysql的连接数已经到了最大,那么新的连接只能等到之前的脚本把所有那些跟数据库操作无关的代码执行完毕以后才能连上,大大浪费了mysql的连接数,所以及时手动关闭mysql的连接,可以使新的请求得到更快的响应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值