LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1975|回复: 9

php里头的mysql_pconnect()连接什么时候才关闭?

[复制链接]
发表于 2004-3-22 20:22:50 | 显示全部楼层 |阅读模式
如果一直不关闭,是否会造成资源浪费?
发表于 2004-3-22 20:31:24 | 显示全部楼层
不关闭也没有关系,MySQL会自动的关闭,但是建议您关闭
个人整理的常用操作
[PHP]
<?php
/***************************************************************************
*                              DB.php
*                        -------------------
*   Begin                : Tuesday, Mar 9, 2004
*   Copyright            : (C)2004 The StarDust Studio
*   Written                          : Alchemy of Group
*   E-mail               : root@alchemy.cn
***************************************************************************/
class sql_db
{
        var $db_connect_id;
        var $query_result;
        var $row = array();
        var $rowset = array();
        var $num_queries = 0;
        var $in_transaction = 0;
        // 析构器 sql_db('数据库服务器','数据库用户名','用户密码','数据库名称','是否持续连接')
        //===================================================================
        function sql_db($sqlserver, $sqluser, $sqlpassword, $database, $persistency = true)
        {
                $this->persistency = $persistency;
                $this->user = $sqluser;
                $this->password = $sqlpassword;
                $this->server = $sqlserver;
                $this->dbname = $database;
                // 连接数据库
                $this->db_connect_id = ($this->persistency) ? mysql_pconnect($this->server, $this->user, $this->password) : mysql_connect($this->server, $this->user, $this->password);
                // 检查连接状态
                if( $this->db_connect_id ){
                        if( $database != "" ){
                                $this->dbname = $database;
                                $dbselect = mysql_select_db($this->dbname);
                                if( !$dbselect ){
                                        mysql_close($this->db_connect_id);
                                        $this->db_connect_id = $dbselect;
                                }
                        }
                        return $this->db_connect_id;
                }
                else{
                        return false;
                }
        }

        // 关闭数据库
        //===================================================================
        function sql_close(){
                if( $this->db_connect_id ){
                        // 残余事物处理
                        if( $this->in_transaction ){
                                mysql_query("COMMIT", $this->db_connect_id);
                        }
                        return mysql_close($this->db_connect_id);
                }
                else{
                        return false;
                }
        }

        // 基本查询
        //===================================================================
        function sql_query($query = "", $transaction = FALSE){
                // 清除以前的结果
                unset($this->query_result);
                if( $query != "" ){
                        $this->num_queries++;
                        if( $transaction == BEGIN_TRANSACTION && !$this->in_transaction ){
                                $result = mysql_query("BEGIN", $this->db_connect_id);
                                if(!$result){
                                        return false;
                                }
                                $this->in_transaction = TRUE;
                        }
                        $this->query_result = mysql_query($query, $this->db_connect_id);
                }
                else{
                        if( $transaction == END_TRANSACTION && $this->in_transaction ){
                                $result = mysql_query("COMMIT", $this->db_connect_id);
                        }
                }
                if( $this->query_result )
                {
                        unset($this->row[$this->query_result]);
                        unset($this->rowset[$this->query_result]);
                        if( $transaction == END_TRANSACTION && $this->in_transaction ){
                                $this->in_transaction = FALSE;
                                if ( !mysql_query("COMMIT", $this->db_connect_id) ){
                                        mysql_query("ROLLBACK", $this->db_connect_id);
                                        return false;
                                }
                        }
                       
                        return $this->query_result;
                }
                else{
                        if( $this->in_transaction ){
                                mysql_query("ROLLBACK", $this->db_connect_id);
                                $this->in_transaction = FALSE;
                        }
                        return false;
                }
        }

        // 额外查询
        //===================================================================
        // 得到传回行的数目
        function sql_numrows($query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                return ( $query_id ) ? mysql_num_rows($query_id) : false;
        }
        // 最后查询操作 INSERT、UPDATE 或 DELETE 所影响的行 (row) 数目
        function sql_affectedrows(){
                return ( $this->db_connect_id ) ? mysql_affected_rows($this->db_connect_id) : false;
        }
        // 得到传回纪录的数目
        function sql_numfields($query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                return ( $query_id ) ? mysql_num_fields($query_id) : false;
        }
        // 取得指定纪录的名称
        function sql_fieldname($offset, $query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                return ( $query_id ) ? mysql_field_name($query_id, $offset) : false;
        }
        // 到到目前所在纪录的型态格式
        function sql_fieldtype($offset, $query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                return ( $query_id ) ? mysql_field_type($query_id, $offset) : false;
        }
        // 将查询结果 result 拆到数组中
        function sql_fetchrow($query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                if( $query_id ){
                        $this->row[$query_id] = mysql_fetch_array($query_id, MYSQL_ASSOC);
                        return $this->row[$query_id];
                }
                else{
                        return false;
                }
        }

        function sql_fetchrowset($query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                if( $query_id ){
                        unset($this->rowset[$query_id]);
                        unset($this->row[$query_id]);
                        while($this->rowset[$query_id] = mysql_fetch_array($query_id, MYSQL_ASSOC)){
                                $result[] = $this->rowset[$query_id];
                        }
                        return $result;
                }
                else{
                        return false;
                }
        }
        // 获得结果
        function sql_fetchfield($field, $rownum = -1, $query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                if( $query_id ){
                        if( $rownum > -1 ){
                                $result = mysql_result($query_id, $rownum, $field);
                        }
                        else{
                                if( empty($this->row[$query_id]) && empty($this->rowset[$query_id]) ){
                                        if( $this->sql_fetchrow() ){
                                                $result = $this->row[$query_id][$field];
                                        }
                                }
                                else{
                                        if( $this->rowset[$query_id] ){
                                                $result = $this->rowset[$query_id][$field];
                                        }
                                        else if( $this->row[$query_id] ){
                                                $result = $this->row[$query_id][$field];
                                        }
                                }
                        }

                        return $result;
                }
                else{
                        return false;
                }
        }
        // 移动内部传回的列指针到指定的 $rownum 去
        function sql_rowseek($rownum, $query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                return ( $query_id ) ? mysql_data_seek($query_id, $rownum) : false;
        }
        // 得到最后一次使用 INSERT 到 MySQL 数据库的执行 ID
        function sql_nextid(){
                return ( $this->db_connect_id ) ? mysql_insert_id($this->db_connect_id) : false;
        }
        // 以释放内存
        function sql_freeresult($query_id = 0){
                if( !$query_id ){
                        $query_id = $this->query_result;
                }
                if ( $query_id ){
                        unset($this->row[$query_id]);
                        unset($this->rowset[$query_id]);
                        mysql_free_result($query_id);
                        return true;
                }
                else{
                        return false;
                }
        }
        // 传回数据库的错误信息
        function sql_error(){
                $result['message'] = mysql_error($this->db_connect_id);
                $result['code'] = mysql_errno($this->db_connect_id);
                return $result;
        }

}
?>
[/PHP]
 楼主| 发表于 2004-3-22 21:22:08 | 显示全部楼层
谢谢!
不过书上说,mysql_pconnetc()是永久连接,就是用mysql_close()也关闭不了。
我不知道这种连接是在退出浏览器时消失,还是客户端关机是消失?

另外,rh9自带的php是否支持fasttemplete?如果有,缺省是安装在那个目录下?我找不到
发表于 2004-3-22 21:40:56 | 显示全部楼层
对不起,我对PHP可能有一知半解了:)
查了一下,使用mysql_pconnect开启资料库时,程式会先寻找是否曾经执行过本函式,若执行过则传回先前执行的 ID,本函式无法使用 mysql_close() 关闭资料库的,那就要看你是不是服务器的访问量很大,大的话,就使用她,不大的话,使用mysql_connect


关于模板,我都是复制到PHP文件的目录下使用的,不知道安全不,fastTemplate好像不太好用,我的PHP是最新的,老是报错,可能是我的设置有问题,现在我使用phplib-7.4.tar.gz了,其实这也是挺好的,不过要看个人的爱好了
下载地址:http://smarty.php.net/do_downloa ... ty-2.5.0-RC2.tar.gz
 楼主| 发表于 2004-3-22 21:52:27 | 显示全部楼层
你的意思是这个永久连接,不管是哪个客户端都可以使用吗?
如果是这样那会不会有安全问题?

有空的我试试那个phplib。:thank
发表于 2004-3-22 22:03:07 | 显示全部楼层
人家高手比较的结果
1.当数据库操作结束之后 ,由(mysql_connect()建立的连接将自动关闭,而mysql_pconnect()建立的连接将继续存在,是一种稳固持久的连接;
2.mysql_pconnect(),每次连接前,都会检查是否有使用同样的hostname,user,password的连接,如果有,则直接使用这个连接号;
3.mysql_connect()建立的连接可以用mysql_close()关闭,而mysql_pconnect()不能用mysql_close()来关闭。
 楼主| 发表于 2004-3-22 22:10:57 | 显示全部楼层
:thank
发表于 2004-3-23 22:21:39 | 显示全部楼层

好象不是这么回事

在 php 中。只有php 以 moudel 方式运行时\ pconnect 才有效。

但在更大的并发连接时。好象效率回受到影响。在 www.chinanuix.net 的 PHP 版有讨论。但我自己没测试过。我没这个需求。使用 pconnect 就足够了。

pconnect 适用于同时较大的客户连接。处理速度会有所提高。
但这个较大有限制。如果想有更大的应用。还是使用其他的吧。

比如 java 等。
发表于 2004-3-23 22:25:21 | 显示全部楼层

安全问题。

这个没有影响。

他只是产生一个 connect id .等待其他客户来连接。

connect 对于每一个连接都会产生一个线程来响应。

pconnect 仅仅产生一个线程。对于 mysql 来说。只要用户名和密码正确。他才不管其他的。无论是谁连接。只要有通行证(用户名和密码。就让你进门)
 楼主| 发表于 2004-3-25 00:00:36 | 显示全部楼层
明白了。
:thank
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表