您好,匿名用户
随意问技术百科期待您的加入

每次请求完都要执行mysql_close()吗?

0 投票

每次请求完都要执行这个数据库关闭操作吗?
如果忘了执行会怎样?
如果必须要执行,有没有办法让他自动执行呢?

用户头像 提问 2012年 12月1日 @ Gemini 上等兵 (319 威望)
分享到:

1个回答

0 投票
 
最佳答案

实际上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...

用户头像 回复 2012年 12月1日 @ hacker 上等兵 (362 威望)
选中 2012年 12月1日 @Gemini
提一个问题:

相关问题

0 投票
1 回复 25 阅读
0 投票
1 回复 13 阅读
用户头像 提问 2014年 3月11日 @ 切糕 上等兵 (151 威望)
0 投票
1 回复 44 阅读
0 投票
1 回复 37 阅读
0 投票
1 回复 29 阅读

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...