-
Notifications
You must be signed in to change notification settings - Fork 102
/
persistconns.xml
141 lines (119 loc) · 3.67 KB
/
persistconns.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
139
140
141
<?xml version="1.0" encoding="utf-8"?>
<!-- $Revision$ -->
<!-- EN-Revision: a714378ed87cdbdbde3b10ded183e8df7b243cb4 Maintainer: yuanyuqiang Status: ready -->
<!-- CREDITS: mowangjuanzi -->
<chapter xml:id="mysqli.persistconns" xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
<title>mysqli 扩展和持久化连接</title>
<para>
持久化连接的目的在于重用客户端到服务器之间的连接,
而不是每次在需要的时候都重新建立一个连接。
由于持久化连接可以将已经建立的连接缓存起来,以备后续的使用,
所以省去了建立新的连接的开销,
因此可以带来性能上的提升。
</para>
<para>
不像 mysql 扩展,mysqli 没有提供一个特殊的方法用于打开持久化连接。
需要打开一个持久化连接时,你必须在
连接时在主机名前增加<literal>p:</literal>。
</para>
<para>
使用持久化连接也会存在一些风险,
因为在缓存中的连接可能处于一种不可预测的状态。
例如,如果客户端未能正常关闭连接,
可能在这个连接上残留了对库表的锁,
那么当这个连接被其他请求重用的时候,这个连接还是处于 <quote>有锁的状态</quote>。
所以,如果要很好的使用持久化连接,那么要求代码在和数据库进行交互的时候,
确保做好清理工作,保证被缓存的连接是一个干净的,没有残留的状态。
</para>
<para>
<literal>mysqli</literal> 扩展的持久化连接提供了内建的清理处理代码。
<literal>mysqli</literal>
所做的清理工作包括:
</para>
<itemizedlist>
<listitem>
<para>
回滚处于活动状态的事务
</para>
</listitem>
<listitem>
<para>
关闭并且删除临时表
</para>
</listitem>
<listitem>
<para>
对表解锁
</para>
</listitem>
<listitem>
<para>
重置会话变量
</para>
</listitem>
<listitem>
<para>
关闭预编译 SQL 语句(在PHP中经常发生)
</para>
</listitem>
<listitem>
<para>
关闭处理程序
</para>
</listitem>
<listitem>
<para>
释放通过 <function>GET_LOCK</function> 获得的锁
</para>
</listitem>
</itemizedlist>
<para>
这确保了将连接返回到连接池的时候,
它处于一种“干净”的状态,可以被其他客户端进程所使用。
</para>
<para>
<literal>mysqli</literal> 扩展
通过自动调用 C-API 函数
<literal>mysql_change_user()</literal> 来完成这个清理工作。
</para>
<para>
自动清理的特性有优点也有缺点。
优点是程序员不再需要担心附加的清理代码,
因为它们会自动调用。
然而缺点就是
性能 <emphasis>可能会</emphasis> 慢一点,
因为每次从连接池返回一个连接都需要执行这些清理代码。
</para>
<para>
这个自动清理的代码可以通过在编译 php 时定义
<constant>MYSQLI_NO_CHANGE_USER_ON_PCONNECT</constant>
来关闭。
</para>
<note>
<para>
<literal>mysqli</literal> 扩展在使用
MySQL Native Driver 或
Mysql Client Library(libmysql)时都支持持久化连接。
</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
-->