mysql_connect()与mysql_pconnect()的区别
时间:2008-03-20 来源:剑心通明
存取 MySQL
透过网页存取数据库内容的程序,多半要遵循以下几个步骤来进行:
建立数据库联机
选定欲存取的数据库
执行查询动作
取出查询结果
中断数据库联机
以下将针对这几个步骤一一加以说明。
建立数据库联机
我们将存取数据库的过程,想象成一艘货轮要进港载货。首先,港务局(MySQL)会对我们进行身分验证,以确定是否为货物的拥有者。在通过身分验证之后,我们将会得到一张「识别证」。
一般而言,港务局会开放 3306 号港口(port)供我们上下货物,因此我们不必多费唇舌,可以直接驶入其中;否则,我们还要将货轮驶向特定的港口停放。
$link = mysql_connect(HOSTNAME, USERNAME, PASSWORD);
$link = mysql_connect(HOSTNAME:PORT, USERNAME, PASSWORD);
上面这行叙述在对 MySQL 表明存取者的身分。其中的 HOSTNAME 是「主机名称」,若 Web server 与 MySQL
同在一部机器上的话,可以写成「localhost」,否则请写数据库主机的名称或 IP。USERNAME 与 PASSWORD 所指的就是要存取
MySQL 的账号密码了。
一般的情况下,MySQL 会透过 3306 port 运作。若系统使用这项默认值的话,我们可以不用再加指定;否则请额外加入 PORT 参数来说明,如:「localhost:9000」。
透过 mysql_connect( ) 的运作,MySQL 可以确认数据存取者的身分。成功的话,将回传一个「link identifier」;否则传回 FALSE。
选定欲存取的数据库
取得通行许可之后,接着进入货物区。这里可能会有许多间货品仓库(数据库),我们还要向管理员出示「识别证」,并从中挑选一间仓库。
mysql_select_db(DBNAME);
mysql_select_db(DBNAME, Identifier);
上面的 DBNAME 指的是「数据库名称」,当面对单一数据库时,Identifier 可以省略不写。
由于存取每个数据库都需要一个个别的 link identifier,所以若我们想同时存取两个数据库时,必须建立两个 link
identifier ,并在 mysql_select_db( ) 里指明哪一个 link identifier 将对应到哪一个数据库。
执行查询动作
此时,无论是要将货物搬上船,或是将船上的货品存放到仓库中,请将工作清单(QueryString)拿出来,然后就可以开工了。
$result = mysql_query(QueryString);
$result = mysql_query(QueryString, Identifier);
$result = mysql_db_query(DBNAME, QueryString, Identifier);
QueryString 即我们对数据库的查询动作,它可能是一段数据查询的叙述,也可能是新增、修改或删除等异动数据的要求。当 $result 为
FALSE 时,表示这个存取动作是失败的;否则,它将会是一个编号(ID)。在「取出查询结果」的步骤,我们得靠它来识别这次的查询结果。
在使用 mysql_query( ) 时,Identifier 是可以省略不写的。若我们不加以指定的话,系统会自动选用最近一次被使用的 link identifier。
如果我们先前「选定欲存取的数据库」这个步骤略过的话,现在可以改用 mysql_db_query( )
来进行资料查询的动作。也就是说,mysql_db_query( ) 的功能等同于 mysql_select_db( ) 加上
mysql_query( )。
取出查询结果
取得货物以后,拆开来看吧!里头分装成一箱一箱的,我们可以算算有多少箱,也可以再把箱子拆开,取出里面的货品来。
在上个步骤中,若我们执行的是查询动作的话,MySQL 会将结果包装成一个 result set,并传回它的编号(ID),接下来要读取数据时,都少不了它。
$number_of_rows = mysql_num_rows($result);
藉由 mysql_num_rows( ) 函数,我们可以得知这个 result set 里头有多少个数据列(row)。
最后,再透过循环的运作,将 result set 里的每个资料列一一读出来。由于每个数据列可能含有多个字段,所以 $data
将会是一个数组;要一一显示个别字段内容的话,我们可以用 $data[0]、$data[1]、$data[2]、...... 的方式。
for ( $i=0; $iDB1: 50 web1->DB2: 50)!又从 web2 来了 50
个「顾客」,也做了同样的动作(web2->DB1: 50 web2->DB2:
50)。在此之后,还有「服务生」是闲着的吗?后续若从 web1 或 web2 同时涌入多于 50 位「顾客」时,谁来应付他们?
倘若您使用的是像 Apache 这类的 multi-process web server(一个 parent process 协调一组
children processes 运作),某个 children process 建立的「持续联机」,是不能分享给其它 children
process 来使用的(「服务生」只对先前接待过的「顾客」服务)。在这样的情况下,将会使得 MySQL 上闲置的 process
越积越多(很多「服务生」站在门口等着「老顾客」上门,而不理会「新顾客」)。
mysql_pconnect( ) 一定是最佳选择吗?我想未必尽然。
--------------------------------------------------------------------------------
说明:
「同时联机数」是有上限的,当所有联机都被占用时,后续的联机要求就会被拒绝。「同时联机数」能调整到多高,这与服务器本身的效能是息息相关的,因为调得愈高,所消耗的系统资源也就愈多。
透过网页存取数据库内容的程序,多半要遵循以下几个步骤来进行:
建立数据库联机
选定欲存取的数据库
执行查询动作
取出查询结果
中断数据库联机
以下将针对这几个步骤一一加以说明。
建立数据库联机
我们将存取数据库的过程,想象成一艘货轮要进港载货。首先,港务局(MySQL)会对我们进行身分验证,以确定是否为货物的拥有者。在通过身分验证之后,我们将会得到一张「识别证」。
一般而言,港务局会开放 3306 号港口(port)供我们上下货物,因此我们不必多费唇舌,可以直接驶入其中;否则,我们还要将货轮驶向特定的港口停放。
$link = mysql_connect(HOSTNAME, USERNAME, PASSWORD);
$link = mysql_connect(HOSTNAME:PORT, USERNAME, PASSWORD);
上面这行叙述在对 MySQL 表明存取者的身分。其中的 HOSTNAME 是「主机名称」,若 Web server 与 MySQL
同在一部机器上的话,可以写成「localhost」,否则请写数据库主机的名称或 IP。USERNAME 与 PASSWORD 所指的就是要存取
MySQL 的账号密码了。
一般的情况下,MySQL 会透过 3306 port 运作。若系统使用这项默认值的话,我们可以不用再加指定;否则请额外加入 PORT 参数来说明,如:「localhost:9000」。
透过 mysql_connect( ) 的运作,MySQL 可以确认数据存取者的身分。成功的话,将回传一个「link identifier」;否则传回 FALSE。
选定欲存取的数据库
取得通行许可之后,接着进入货物区。这里可能会有许多间货品仓库(数据库),我们还要向管理员出示「识别证」,并从中挑选一间仓库。
mysql_select_db(DBNAME);
mysql_select_db(DBNAME, Identifier);
上面的 DBNAME 指的是「数据库名称」,当面对单一数据库时,Identifier 可以省略不写。
由于存取每个数据库都需要一个个别的 link identifier,所以若我们想同时存取两个数据库时,必须建立两个 link
identifier ,并在 mysql_select_db( ) 里指明哪一个 link identifier 将对应到哪一个数据库。
执行查询动作
此时,无论是要将货物搬上船,或是将船上的货品存放到仓库中,请将工作清单(QueryString)拿出来,然后就可以开工了。
$result = mysql_query(QueryString);
$result = mysql_query(QueryString, Identifier);
$result = mysql_db_query(DBNAME, QueryString, Identifier);
QueryString 即我们对数据库的查询动作,它可能是一段数据查询的叙述,也可能是新增、修改或删除等异动数据的要求。当 $result 为
FALSE 时,表示这个存取动作是失败的;否则,它将会是一个编号(ID)。在「取出查询结果」的步骤,我们得靠它来识别这次的查询结果。
在使用 mysql_query( ) 时,Identifier 是可以省略不写的。若我们不加以指定的话,系统会自动选用最近一次被使用的 link identifier。
如果我们先前「选定欲存取的数据库」这个步骤略过的话,现在可以改用 mysql_db_query( )
来进行资料查询的动作。也就是说,mysql_db_query( ) 的功能等同于 mysql_select_db( ) 加上
mysql_query( )。
取出查询结果
取得货物以后,拆开来看吧!里头分装成一箱一箱的,我们可以算算有多少箱,也可以再把箱子拆开,取出里面的货品来。
在上个步骤中,若我们执行的是查询动作的话,MySQL 会将结果包装成一个 result set,并传回它的编号(ID),接下来要读取数据时,都少不了它。
$number_of_rows = mysql_num_rows($result);
藉由 mysql_num_rows( ) 函数,我们可以得知这个 result set 里头有多少个数据列(row)。
最后,再透过循环的运作,将 result set 里的每个资料列一一读出来。由于每个数据列可能含有多个字段,所以 $data
将会是一个数组;要一一显示个别字段内容的话,我们可以用 $data[0]、$data[1]、$data[2]、...... 的方式。
for ( $i=0; $iDB1: 50 web1->DB2: 50)!又从 web2 来了 50
个「顾客」,也做了同样的动作(web2->DB1: 50 web2->DB2:
50)。在此之后,还有「服务生」是闲着的吗?后续若从 web1 或 web2 同时涌入多于 50 位「顾客」时,谁来应付他们?
倘若您使用的是像 Apache 这类的 multi-process web server(一个 parent process 协调一组
children processes 运作),某个 children process 建立的「持续联机」,是不能分享给其它 children
process 来使用的(「服务生」只对先前接待过的「顾客」服务)。在这样的情况下,将会使得 MySQL 上闲置的 process
越积越多(很多「服务生」站在门口等着「老顾客」上门,而不理会「新顾客」)。
mysql_pconnect( ) 一定是最佳选择吗?我想未必尽然。
--------------------------------------------------------------------------------
说明:
「同时联机数」是有上限的,当所有联机都被占用时,后续的联机要求就会被拒绝。「同时联机数」能调整到多高,这与服务器本身的效能是息息相关的,因为调得愈高,所消耗的系统资源也就愈多。
相关阅读 更多 +
排行榜 更多 +