<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>http://www.jackxiang.com/index.php</link> 
<description><![CDATA[赢在IT，Playin' with IT,Focus on Killer Application,Marketing Meets Technology.]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></copyright>
<item>
<link>http://www.jackxiang.com/post//</link>
<title><![CDATA[[实践OK]mysql_pconnect的水挺深,apache下的数据库长连接，PHP数据库长连接mysql_pconnect的细节。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[WEB2.0]]></category>
<pubDate>Sat, 17 Sep 2011 05:57:11 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	实践来自，后加上PHP数据库长连接mysql_pconnect的细节：<br/>http://my.oschina.net/louxin/blog/95436<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;apache的prefork模式(进程池),它不能保证每次客户端的请求都是在同一个进程,所以你不知道我的长连接该如何保持？<br/>下面就从另一个角度来讲这个长连接通过一个keepalive来实现，这样就让apache保持住了到mysql的连接句柄。<br/>对，其实都是伪连接，因为Mysql有一个默认值是38000吧？记不清了，就是长连接到这个时间后，Mysql就会断开的，你再：sutomysqliping....因为：超过 wait_timeout ，msyql就会主动断开，php 需要再进行长连接。<br/><br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;php的mysql持久化连接,美好的目标,却拥有糟糕的口碑,往往令人敬而远之。这到底是为啥么。近距离观察后发现，这家伙也不容易啊，要看apache的脸色，还得听mysql指挥。<br/>　　对于做为apache模块运行的php来说，要实现mysql持久化连接，首先得取决于apache这个web服务器是否支持Keep-Alive。<br/>　　Keep-Alive<br/>　　Keep-Alive是什么东西？它是http协议的一部分，让我们复习一下没有Keep-Alive的http请求，从客户在浏览器输入一个有效url地址开始，浏览器就会利用socket向url对应的web服务器发送一条tcp请求，这个请求成功一次就得需要来回握三次手才能确定，成功以后，浏览器利用socket tcp连接资源向web服务器请求http协议，发送以后就等着web服务器把http返回头和body发送回来，发回来后浏览器关闭socket连接，然后做http返回头和body的解析工作，最后呈现在浏览器上的就是漂亮的页面了。这里面有什么问题呢？tcp连接需要三次握手，也就是来回请求三次方能确定一个tcp请求是否成功，然后tcp关闭呢？来回需要4次请求才能完成!每次http请求就3次握手，4次拜拜，这来来回回的不嫌累啊，多少时间和资源都被浪费在socket连接关闭上了，能不能一次socket tcp连接发送多次http请求呢？于是Keep-Alive就应运而生,http/1.0里需要客户端自己在请求头加入Connection:Keep-alive方能实现，在这里我们只考虑http1.1了，只需要设置一下apache，让它默认就是Keep-Alive持久连接模式(apache必须1.2+才能支持Keep-Alive).在httpd.conf里找到KeepAive配置项，果断设置为On,MaxKeepAliveRequests果断为0(一个持久tcp最多允许的请求数，如果过小，很容易在tcp未过期的情况下，达到最大连接，那下次连接就又是新的tcp连接了,这里设置0表示不限制)，然后对于mysql_pconnect最重要的选项KeepAliveTimeout设置为15(表示15秒).<br/>　　好了，重启apache,测试一下，赶紧写行东西<br/><textarea name="code" class="html" rows="15" cols="100">
&lt;?php&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;Apache进程号:&quot;.getmypid();&nbsp;&nbsp;
?&gt;&nbsp;&nbsp;
</textarea><br/>显示:16636,怎么查看Apache的ID？如下：<br/>bogon:/usr/local/apache2/htdocs # ps aux&#124;grep http&#124;grep 16636 <br/>nobody&nbsp;&nbsp; 16636&nbsp;&nbsp;0.0&nbsp;&nbsp;7.3&nbsp;&nbsp;15056&nbsp;&nbsp;7868 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:11&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart<br/>很简单，获取当前php执行者(apache)的进程号，用浏览器浏览这个页面，看到什么？对,有看到一串进程号数字,15秒内,连续刷新页面,看看进程号有无变化?木有吧？现在把手拿开，交叉在胸前，度好时间，1秒，2秒，3,...15,16。好，过了15秒了，再去刷新页面,进程号有没有变化？变了！又是一个新的apache进程了，为什么15秒后就变成新的进程了?记得我们在apache里设置的KeepAliveTimeout吗？它的值就是15秒.现在我们应该大致清楚了,在web服务器默认打开KeepAlive的情况下，客户端第一次http成功请求后，apache不会立刻断开socket,而是一直监听来自这一客户端的请求，监听多久?根据KeepAliveTimeout选项配置的时间决定，一旦超过这一时间,apache就会断开socket了，那么下次同一客户端再次请求，apache就会新开一个进程来相应。所以我们之前15内不停的刷新页面，看到的进程号都是一致的，表明是浏览器请求给了同一个apache进程。<br/>　　浏览器是怎么知道不需要重新进行tcp连接就可以直接发送http请求呢？因为http返回头里就会带上Connection:keep-alive,Keep-alive:15两行，意思就是让客户端浏览器明白，这次socket连接我这边还没关闭呢，你可以在15内继续使用这个连接，并发送http请求，于是乎浏览器就知道应该怎么做了.<br/>　　php怎么做<br/>　　那么，php的mysql连接资源是怎么被hold住的呢，这需要查看php的mysql_pconnect的函数代码，我看了下，大概的做法就是根据当前apache进程号，生成hash key,找hash表内有无对应的连接资源，没有则推入hash表，有则直接使用。有些代码片段可以说明(具体可查看php5.3.8源码ext/mysql/php_mysql.c文件690行php_mysql_do_connect函数)<br/>view plain<br/>#1.生成hash key&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user=php_get_current_user();//获取当前php执行者(apache)的进程唯一标识号&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hashed_details_length = spprintf(&amp;hashed_details, 0, &quot;mysql__%s_&quot;, user);//hashed_details就是hash key&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;#2.如果未找到已有资源，就推入hash表，名字叫persistent_list，如果找到就直接使用&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* try to find if we already have this link in our persistent list */&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (zend_hash_find(&amp;EG(persistent_list), hashed_details, hashed_details_length+1, (void **) &amp;le)==FAILURE) &#123;&nbsp;&nbsp;/* we don&#039;t */&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/* hash it up(推入hash表) */&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Z_TYPE(new_le) = le_plink;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;new_le.ptr = mysql;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (zend_hash_update(&amp;EG(persistent_list), hashed_details, hashed_details_length+1, (void *) &amp;new_le, sizeof(zend_rsrc_list_entry), NULL)==FAILURE) &#123;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#125;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;else&#123;/* The link is in our list of persistent connections(连接已在hash表里)*/&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql = (php_mysql_conn *) le-&gt;ptr;//直接使用对应的sql连接资源&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;...&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;&nbsp;&nbsp;<br/>zend_hash_find比较容易看明白,原型是zend_hash_find(hash表，key名,key长,value);如果找到，value就有值了。<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mysql的wait_timeout和interactive_timeout<br/>　　说完Keep-Alive，该到mysql家串串门了，说的是mysql_pconnect，怎么能绕开mysql的设置。<br/>　　影响mysql_pconnect最重要的两个参数就是wait_timeout和interactive_timeout,它们是什么东西？先撇一边，首先让我们把上面的代码改动一下php代码<br/>view plain<br/>&lt;?php&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$conn = mysql_pconnect(&quot;localhost&quot;,&quot;root&quot;,&quot;123456&quot;) or die(&quot;Can not connect to mysql&quot;);&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;Mysql线程号:&quot;.mysql_thread_id($conn).&quot;&lt;br/&gt;&quot;;&nbsp;&nbsp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;echo &quot;Apache进程号&quot;.getmypid();&nbsp;&nbsp;<br/>?&gt;&nbsp;&nbsp;<br/>以上的代码没啥好解释的，让我们用浏览器浏览这个页面，看到什么？<br/>看到两个显眼的数字。一个是mysql线程号，一个是apache进程号,好了，15秒后再刷新这个页面,发现这两个id都变了,因为已经是新的apache进程了,进程id是新的,hash key就变了,php只好重新连接mysql,连接资源推入persistent list。<br/>如果15内刷新呢？apache进程肯定不变，mysql线程号会变吗？<br/>答案得问mysql了。首先这个mysql_thread_id是什么东西？shell方式登录mysql后执行命令&#039;show processlist&#039;，看到了什么？<br/>view plain<br/>mysql&gt; show processlist;&nbsp;&nbsp;<br/>+-----+------+-----------+------+---------+------+-------+------------------+&nbsp;&nbsp;<br/>&#124; Id&nbsp;&nbsp;&#124; User &#124; Host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; db&nbsp;&nbsp; &#124; Command &#124; Time &#124; State &#124; Info&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;<br/>+-----+------+-----------+------+---------+------+-------+------------------+&nbsp;&nbsp;<br/>&#124; 348 &#124; root &#124; localhost &#124; NULL &#124; Query&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;0 &#124; NULL&nbsp;&nbsp;&#124; show processlist &#124;&nbsp;&nbsp;<br/>&#124; 349 &#124; root &#124; localhost &#124; NULL &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;2 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;&nbsp;&nbsp;<br/>+-----+------+-----------+------+---------+------+-------+------------------+&nbsp;&nbsp;<br/>发现了很重要的信息，这个processlist列表就是记录了正在跑的线程，忽略Info列为show processlist那行,那行是你当前shell登录mysql的线程。php连接mysql的线程就是Id为349那行，如果读者自己做测试，应该知道这个Id=349在你的测试环境里是另外一个值，我们把这个值和网页里输出的mysql_thread_id($conn)做做比较，对！他们是一样的。接下来最重要的是观察Command列和Time列，Command = Sleep，表明什么？表明我们mysql_pconnect连接后就一直在sleep，Time字段就告诉我们，这个线程Sleep了多久,那么Sleep了多久这个线程才能作废呢？那就是wait_timeout或者interactive_timeout要做的工作了,他们默认的值都是8小时,天啊,太久了,所以如果说web服务器关掉KeepAlive支持,那个这个processlist很容易就被撑爆,就爆出那个Too many connections的错误了,max_connectiosns配置得再多也没用。为了观察这两个参数,我们可以在mysql配置文件my.cnf里设置这两个值,找到[mysqld]节点，在里面设置多两行<br/>view plain<br/>interactive_timeout = 60&nbsp;&nbsp;<br/>wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= 30&nbsp;&nbsp;<br/>配置完后，重启mysql,shell登录mysql,这时候show processlist可以发现只有当前线程。然后运行那个带有mysql_pconnect的php页面,再回来mysql端show processlist可发现，多了一个Commond为Sleep的线程,不停的show processlist(方向键上+enter键)观察Time列的变化2,5,10..14!，突然那个Sleep线程程被kill掉了,咋回事,还没到30秒呢,噢!忘了修改一下apache keepalive的参数了,把KeepAliveTimeOut从15改成120(只为观察,才这么改),重启apache.刷新那个页面,好,开始不停的show processlist,2..5..10..14,15,..20...26....28,29!线程被kill,这次是因为wait_timeout起了作用,浏览器那边停了30秒,30秒内如果浏览器刷新,那这个Time又会从0开始计时。这种连接不属于interactive connection(mysql shell登录那种连接就属于interactive connection)，所以采用了wait_timeout的值。如果mysql_pconnect的第4个参数改改呢<br/>view plain<br/>&lt;?php&nbsp;&nbsp;<br/>$conn = mysql_pconnect(&#039;localhost&#039;,&#039;root&#039;,&#039;123456&#039;,MYSQL_CLIENT_INTERACTIVE);&nbsp;&nbsp;<br/>echo &quot;Mysql线程号:&quot;.mysql_thread_id($conn).&quot;&lt;br/&gt;&quot;;&nbsp;&nbsp;<br/>echo &quot;Apache进程号:&quot;.getmypid();&nbsp;&nbsp;<br/>?&gt;&nbsp;&nbsp;<br/>刷新下页面,mysql那边开始刷show processlist，这回Time &gt; 30也不会被kill，&gt;60才被kill了,说明设置了MYSQL_CLIENT_INTERACTIVE,就会被mysql视为interactive connection,那么这次php的mysql连接在120秒内未刷新页面的情况下,何时作废将取决于mysql的interactive_timeout的配置值。<br/>　　总结<br/>　　#1.php的mysql_pconnect要达到功效,首先必须保证apache是支持keep alive的,然后KeepAliveTimeOut应该设置多久呢,要根据自身站点的访问情况做调整,时间太短,keep alive没啥意义,时间太长,就很可能为一个闲客户端连接牺牲很多服务器资源,毕竟hold住socket监听进程是要消耗cpu内存的.<br/>　　#2.apache的KeepAliveTimeOut配置得和mysql的time out配置要有个平衡点,联系以上的观察,假设mysql_pconnect未带上第4个参数,如果apache的KeepAliveTimeOut设置的秒数比wait_timeout小,那真正对mysql_pconnect起作用的是apache而不是mysql的配置.这时如果mysql的wait_timeout偏大,并发量大的情况下,很可能就一堆废弃的connection了,mysql这边如果不及时回收,那就很可能Too many connections了.可是如果KeepAliveTimeOut太大呢，又回到之前的问题，所以貌似Apache.KeepAliveTimeOu不要太大,但比Mysql.wait_timeout 稍大，或者相等是比较好的方案,这样可以保证keep alive过期后,废弃的mysql连接可以及时被回收. <br/>　　后记<br/>　　Pdo数据库的长连接机制是否和mysql_pconnect一样?经过试验观察和源码探究，发现也是一样的处理方式。<br/>来源及转载自：http://www.cnblogs.com/funlake/archive/2011/09/08/2171822.html<br/><br/>bogon:/usr/local/mysql/bin # ps aux&#124;grep httpd&#124;grep -v grep &#124;wc<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;9&nbsp;&nbsp;&nbsp;&nbsp; 117&nbsp;&nbsp;&nbsp;&nbsp; 945<br/><br/> mysql&gt; show processlist;<br/>+----+------+-----------+------+---------+------+-------+------------------+<br/>&#124; Id &#124; User &#124; Host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; db&nbsp;&nbsp; &#124; Command &#124; Time &#124; State &#124; Info&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+------+-----------+------+---------+------+-------+------------------+<br/>&#124;&nbsp;&nbsp;2 &#124; root &#124; localhost &#124; NULL &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp; 12 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; <br/>&#124;&nbsp;&nbsp;3 &#124; root &#124; localhost &#124; NULL &#124; Query&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;0 &#124; NULL&nbsp;&nbsp;&#124; show processlist &#124; <br/>&#124;&nbsp;&nbsp;4 &#124; root &#124; localhost &#124; NULL &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp;117 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; <br/>&#124;&nbsp;&nbsp;5 &#124; root &#124; localhost &#124; NULL &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp; 43 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; <br/>&#124;&nbsp;&nbsp;6 &#124; root &#124; localhost &#124; NULL &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp; 18 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; <br/>+----+------+-----------+------+---------+------+-------+------------------+<br/><br/> 重新启动Apache后：Mysql长连接没有了，重启动后，变为：<br/> Mysql线程号:7<br/>Apache进程号24664 ，<br/>mysql&gt; show processlist;<br/>+----+------+-----------+------+---------+------+-------+------------------+<br/>&#124; Id &#124; User &#124; Host&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; db&nbsp;&nbsp; &#124; Command &#124; Time &#124; State &#124; Info&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/>+----+------+-----------+------+---------+------+-------+------------------+<br/>&#124;&nbsp;&nbsp;3 &#124; root &#124; localhost &#124; NULL &#124; Query&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;0 &#124; NULL&nbsp;&nbsp;&#124; show processlist &#124; <br/>&#124;&nbsp;&nbsp;7 &#124; root &#124; localhost &#124; NULL &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;7 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; <br/>+----+------+-----------+------+---------+------+-------+------------------+<br/><br/>Mysql线程号:10<br/>Apache进程号24969<br/><br/>Mysql线程号:8<br/>Apache进程号24661<br/>。。。。<br/>一会又回来了：<br/>Mysql线程号:10<br/>Apache进程号24969<br/><textarea name="code" class="html" rows="15" cols="100">
&lt;?php
$dbConnection = mysql_pconnect( $myHostname, $myUsername, $myPassword&nbsp;&nbsp;);
if ( !mysql_ping( $dbConnection ) )
&#123;
&nbsp;&nbsp; $dbConnection = mysql_pconnect( $myHostname, $myUsername, $myPassword&nbsp;&nbsp;);
&#125;
?&gt;
</textarea><br/>Mysql线程号:8,Apache进程号24661,是一个对应的关系，少弄几个httpd进行测试证实确实如此：<br/><textarea name="code" class="html" rows="15" cols="100">
nobody&nbsp;&nbsp; 24661&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15172&nbsp;&nbsp;7944 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:31&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 24662&nbsp;&nbsp;0.0&nbsp;&nbsp;6.9&nbsp;&nbsp;15040&nbsp;&nbsp;7428 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:31&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 24663&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15176&nbsp;&nbsp;7936 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:31&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 24664&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15172&nbsp;&nbsp;7936 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:31&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 24665&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15176&nbsp;&nbsp;7944 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:31&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 24967&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15176&nbsp;&nbsp;7944 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:32&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 24968&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15176&nbsp;&nbsp;7944 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:32&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 24969&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15176&nbsp;&nbsp;7944 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:32&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 31185&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15176&nbsp;&nbsp;7936 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:48&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart
nobody&nbsp;&nbsp; 31293&nbsp;&nbsp;0.0&nbsp;&nbsp;7.4&nbsp;&nbsp;15176&nbsp;&nbsp;7932 ?&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S&nbsp;&nbsp;&nbsp;&nbsp;22:48&nbsp;&nbsp; 0:00 /usr/local/apache2/bin/httpd -k restart

show processlist;

&#124;&nbsp;&nbsp;7 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp; 22 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124;&nbsp;&nbsp;8 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp;&nbsp;&nbsp;3 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124;&nbsp;&nbsp;9 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp;104 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124; 10 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp;127 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124; 11 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp; 11 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124; 12 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp;472 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124; 13 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp;114 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124; 14 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp; 25 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124; 15 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp; 80 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;
&#124; 16 &#124; root &#124; localhost &#124; test &#124; Sleep&nbsp;&nbsp; &#124;&nbsp;&nbsp; 40 &#124;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; NULL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;

10个Apache进程和10个Mysql长连接，刚好一个httpd和一个Mysql连接对应。
</textarea><br/>是否选用长连接的判断：<br/>http://phpbk.blog.51cto.com/519758/110103
]]>
</description>
</item><item>
<link>http://www.jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]mysql_pconnect的水挺深,apache下的数据库长连接，PHP数据库长连接mysql_pconnect的细节。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>