/
connections.xml
138 lines (135 loc) · 5.08 KB
/
connections.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: d861a1bcea24f05e52e4938c1ecdf9d70326d7aa Maintainer: ichenshy Status: ready -->
<!-- CREDITS: mowangjuanzi -->
<chapter xml:id="pdo.connections" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>连接与连接管理</title>
<para>
连接是通过创建 PDO 基类的实例而建立的。使用哪种驱动程序并不重要,始终都会用 PDO
类名。构造函数接受用于指定数据库源(也称为 DSN)以及可选的用户名和密码(如果有)的参数。
</para>
<para>
<example>
<title>连接到 MySQL</title>
<programlisting role="php">
<![CDATA[
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
?>
]]>
</programlisting>
</example>
</para>
<para>
如果有任何连接错误,将抛出 <literal>PDOException</literal> 对象。如果想处理错误状态,可以捕获异常,或者选择将其留给
<function>set_exception_handler</function> 设置的应用程序全局异常处理程序。
</para>
<para>
<example><title>处理连接错误</title>
<programlisting role="php">
<![CDATA[
<?php
try {
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
} catch (PDOException $e) {
// 对于示例,尝试在超时后重新连接
}
]]>
</programlisting>
</example>
</para>
<warning>
<para>
就像其它任一 <link linkend="language.exceptions">exception</link> 一样,<classname>PDOException</classname>
可以通过 &catch; 语句手动捕获,也可以通过 <function>set_exception_handler</function> 自动捕获。否则,默认行为是将未捕获的异常转换为
<constant>E_FATAL_ERROR</constant>。fatal 错误可能会包含泄漏连接详情的 backtrace。因此,生产服务器上的 &php.ini;
选项 <link linkend="ini.display-errors"><literal>display_errors</literal></link> 应设置为 <literal>0</literal>。
</para>
</warning>
<para>
连接数据库成功后,返回 PDO 类的实例给脚本。此连接在 PDO
对象的生存周期中保持有效状态。要关闭连接,需要确保删除它的所有剩余引用来销毁对象——可以通过对对象变量赋值 &null;
来实现。如果没有明确这么做,PHP 在脚本结束时会自动关闭连接。
</para>
<note>
<simpara>
如果还有其它对此 PDO 实例的引用(比如来自 PDOStatement 实例,或来自其它同一 PDO 实例的其它变量),也必须删除这些引用(例如,通过将
&null; 赋值给引用 PDOStatement 的变量)。
</simpara>
</note>
<para>
<example>
<title>关闭连接</title>
<programlisting role="php">
<![CDATA[
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass);
// 在此使用连接
$sth = $dbh->query('SELECT * FROM foo');
// 使用完毕,关闭连接
$sth = null;
$dbh = null;
?>
]]>
</programlisting>
</example>
</para>
<para>
很多 web
应用程序通过与数据库建立持久连接获得好处。持久连接不会在脚本结束时关闭,而是会缓存,且当另一个脚本使用相同凭证请求连接时重用。持久连接缓存可以避免每次脚本需要与数据库通信时建立新连接的开销,从而让
web 应用程序更快。
</para>
<para>
<example>
<title>持久化连接</title>
<programlisting role="php">
<![CDATA[
<?php
$dbh = new PDO('mysql:host=localhost;dbname=test', $user, $pass, array(
PDO::ATTR_PERSISTENT => true
));
?>
]]>
</programlisting>
</example>
</para>
<para>
<constant>PDO::ATTR_PERSISTENT</constant> 选项的值转换为 &boolean;(启用/禁用持久连接),除非它不是数字
&string;,在这种情况下允许使用多个持久连接池。如果不同的链接使用不兼容的设置,非常有用,例如
<constant>PDO::MYSQL_ATTR_USE_BUFFERED_QUERY</constant> 的值不同。
</para>
<note>
<para>
如果想使用持久连接,必须在传递给 PDO 构造函数的驱动程序选项数组中设置
<constant>PDO::ATTR_PERSISTENT</constant>。如果在对象实例化后用
<methodname>PDO::setAttribute</methodname> 设置此属性,驱动程序将不会使用持久连接。
</para>
</note>
<note>
<para>
如果使用 PDO ODBC 驱动程序且 ODBC 库支持 ODBC 连接池(有 unixODBC 和 Windows 是其中的两个;可能会有更多),建议不要使用持久
PDO 连接,而是把连接缓存留给 ODBC 连接池层。ODBC 连接池在进程中与其它模块共享;如果 PDO 缓存连接,则此连接永远不会被返回到
ODBC 连接池,从而导致创建额外的连接来服务其它模块。
</para>
</note>
</chapter>
<!-- Keep this comment at the end of the file
Local variables:
mode: sgml
sgml-omittag:t
sgml-shorttag:t
sgml-minimize-attributes:nil
sgml-always-quote-attributes:t
sgml-indent-step:1
sgml-indent-data:t
indent-tabs-mode:nil
sgml-parent-document:nil
sgml-default-dtd-file:"~/.phpdoc/manual.ced"
sgml-exposed-tags:nil
sgml-local-catalogs:nil
sgml-local-ecat-files:nil
End:
vim600: syn=xml fen fdm=syntax fdl=2 si
vim: et tw=78 syn=sgml
vi: ts=1 sw=1
-->