开发者社区 问答 正文

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

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

展开
收起
蛮大人123 2016-02-06 18:26:31 3280 分享 版权
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    实际上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以后及时关闭,能够避免一些可能的问题

    2019-07-17 18:38:40
    赞同 展开评论