<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[向东博客 专注WEB应用 构架之美 --- 构架之美，在于尽态极妍 | 应用之美，在于药到病除]]></title> 
<link>https://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>https://jackxiang.com/post//</link>
<title><![CDATA[[实践OK]Mysql客户端连接和PHP连接时interactive_timeout和wait_timeout的一个关系，以及在Mysql做一些超长的处理时mysql gone away的原因。]]></title> 
<author>jack &lt;xdy108@126.com&gt;</author>
<category><![CDATA[数据库技术]]></category>
<pubDate>Tue, 14 Nov 2017 08:17:20 +0000</pubDate> 
<guid>https://jackxiang.com/post//</guid> 
<description>
<![CDATA[ 
	interactive_timeout ：连接空闲超时时间。与服务器端无交互状态的连接，直到被服务器端强制关闭而等待的时间。<br/>&nbsp;&nbsp;&nbsp;&nbsp;interactive_timeout和wait_timeout意义虽然相同，但是有使用对象有本质的区别。interactive_timeout针对交互式连接（比如通过mysql客户端连接数据库），wait_timeout针对非交互式连接（比如一般在PHP中使用PDO连接数据库，当然你可以设置CLIENT_INTERACTIVE选项来改变）。所谓的交互式连接，即在mysql_real_connect()函数中使用了CLIENT_INTERACTIVE选项。<br/>wait_timeout：连接空闲超时时间。与服务器端无交互状态的连接，直到被服务器端强制关闭而等待的时间。可以认为是服务器端连接空闲的时间，空闲超过这个时间将自动关闭。<br/><br/>交互连接：<br/>interactive_timeout 需在mysql_connect()设置CLIENT_INTERACTIVE选项后起作用，并被赋值为wait_timeout；&nbsp;&nbsp;#Mysql自己的客户端mysql命令。<br/>mysql&gt;set global wait_timeout = 60; 对当前交互链接有效； (由于mysql的BUG所有这边必须加global)<br/>mysql&gt;set global interactive_timeout = 60; 对后续起的交互链接有效；<br/><br/><br/>解决MySQL server has gone away <br/>应用程序（比如PHP）长时间的执行批量的MYSQL语句。最常见的就是采集或者新旧数据转化。 <br/>解决方案： <br/>在my.cnf文件中添加或者修改以下两个变量： <br/>wait_timeout=2880000 <br/>interactive_timeout = 2880000 <br/>关于两个变量的具体说明可以google或者看官方手册。如果不能修改my.cnf，则可以在连接数据库的时候设置CLIENT_INTERACTIVE，比如： <br/>sql = &quot;set interactive_timeout=24*3600&quot;; <br/>mysql_real_query(...) <br/><br/>wait_timeout过大有弊端，其体现就是MySQL里大量的SLEEP进程无法及时释放，拖累系统性能，不过也不能把这个指设置的过小，否则你可能会遭遇到“MySQL has gone away”之类的问题，通常来说，我觉得把wait_timeout设置为10是个不错的选择，但某些情况下可能也会出问题，比如说有一个CRON脚本，其中两次SQL查询的间隔时间大于10秒的话，那么这个设置就有问题了（当然，这也不是不能解决的问题，你可以在程序里时不时mysql_ping一下，以便服务器知道你还活着，重新计算wait_timeout时间）<br/><br/>本质：<br/>变量wait_timeout：服务器关闭非交互连接之前等待活动的秒数。也就是说你PHP获取一次数据后作计算了，并没有释放Mysql连接句柄，而你处理完后，继续获取数据，这个中间等待的秒数。&nbsp;&nbsp;为了防止出现这个问题，用了mysql_ping:https://mo2g.com/view/128/<br/>问题：这个秒数，DBA一般写10秒，能否突破和Mysql的Client一样，让它的值和interactive_timeout一样呢？<br/><br/>From:http://www.04007.cn/article/292.html<br/>============================================================================================<br/>总之，Mysql的原生客户端，在设置其wait_timeout的值时不受全局的设置限制，均等于全局（/etc/my.cnf）interactive_timeout的值,而PHP则并不改变全局的值，而是里面配置wait_timeout多少，此次连接就是多少，当然，也提供了类似Mysql自带客户端的参数。<br/><br/>my.cnf:<br/>interactive_timeout = 28800<br/>wait_timeout = 28800<br/><br/>mysql&gt; show variables like &#039;%timeout%&#039;;<br/>&#124; interactive_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 28800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>&#124; wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 28800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/><br/>修改一下重新启动Mysql后，直接用Mysql客户端连接？如下：<br/>interactive_timeout = 29800<br/>wait_timeout = 28800<br/><br/>mysql<br/>mysql&gt; show variables like &#039;%timeout%&#039;;<br/><br/>&#124; wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 29800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>&#124; interactive_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 29800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/><br/>而Show全局变量呢，还是显示my.cnf里设置的，但这儿会被个性的mysql在连接时作了设置而覆盖：<br/>mysql&gt; show global variables like &quot;%timeout%&quot;;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br/>&#124; interactive_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 29800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>&#124; wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 28800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/><br/>PDO连接和Mysqlli连接结果都一样：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php&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;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;$dsn = &quot;mysql:host=localhost;dbname=mysql&quot;;
&nbsp;&nbsp;$db = new PDO($dsn, &#039;root&#039;, &#039;*******&#039;);
&nbsp;&nbsp;echo&nbsp;&nbsp;&quot;show variables like &#039;%wait_timeout%&#039;&#92;n&#92;n&quot;;
&nbsp;&nbsp;$db-&gt;query(&#039;set names utf8;&#039;); //你可能会用到的utf-8,哈哈
&nbsp;&nbsp;$rs = $db-&gt;query(&quot;show variables like &#039;interactive_timeout&#039;&quot;);
&nbsp;&nbsp;$result_arr = $rs-&gt;fetchAll();
&nbsp;&nbsp;print_r($result_arr);
&nbsp;&nbsp;$rs = $db-&gt;query(&quot;show variables like &#039;wait_timeout&#039;&quot;);
&nbsp;&nbsp;$result_arr = $rs-&gt;fetchAll();
&nbsp;&nbsp;print_r($result_arr);
&nbsp;&nbsp;echo&nbsp;&nbsp;&quot;show global variables like &#039;%wait_timeout%&#039;&#92;n&#92;n&quot;;
&nbsp;&nbsp;$rs = $db-&gt;query(&quot;show global variables like &#039;interactive_timeout&#039;&quot;);
&nbsp;&nbsp;$result_arr = $rs-&gt;fetchAll();
&nbsp;&nbsp;print_r($result_arr);
&nbsp;&nbsp;$rs = $db-&gt;query(&quot;show global variables like &#039;wait_timeout&#039;&quot;);
&nbsp;&nbsp;$result_arr = $rs-&gt;fetchAll();
&nbsp;&nbsp;print_r($result_arr);
</textarea><br/><br/>Mysqlli：<br/><textarea name="code" class="php" rows="15" cols="100">
&nbsp;&nbsp;$mysqli = new mysqli(&quot;localhost&quot;, &quot;root&quot;, &quot;******&quot;, &quot;mysql&quot;);
&nbsp;&nbsp;$query=&quot;show variables like &#039;%timeout%&#039;&quot;;
&nbsp;&nbsp;$result=$mysqli-&gt;query($query);
&nbsp;&nbsp;if ($result) &#123;
&nbsp;&nbsp;&nbsp;&nbsp; if($result-&gt;num_rows&gt;0)&#123;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while($row =$result-&gt;fetch_array() )&#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print_r($row);
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&nbsp;&nbsp; &#125;
&nbsp;&nbsp;&#125;else &#123;
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo &quot;查询失败&quot;;
&nbsp;&nbsp;&#125;
&nbsp;&nbsp;$result-&gt;free();
&nbsp;&nbsp;$mysqli-&gt;close();
&nbsp;&nbsp;die;
</textarea><br/>php /tmp/mysql.php<br/><br/>说明其PHP客户端并没有像mysql的命令行一样修改客户端的，而值都为配置的值：<br/>&#124; interactive_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124; 28800&nbsp;&nbsp;&nbsp;&nbsp;&#124;<br/>&#124; wait_timeout&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&#124; 10&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &#124;<br/><br/>PHP7不支持Mysql的mysql_connect驱动啦：<br/><textarea name="code" class="php" rows="15" cols="100">
&lt;?php
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_server_name=&quot;localhost&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_username=&quot;root&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_password=&quot;*******&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$mysql_database=&quot;mysql&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$conn=mysql_connect($mysql_server_name, $mysql_username,
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$mysql_password);
&nbsp;&nbsp;&nbsp;&nbsp;$strsql=&quot;show variables like &#039;%timeout%&#039;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$result=mysql_db_query($mysql_database, $strsql, $conn);
&nbsp;&nbsp;&nbsp;&nbsp;while($row=mysql_fetch_row($result))&#123;//一定要循环，指针下移。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print_r($row);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;
&nbsp;&nbsp;&nbsp;&nbsp;$strsql=&quot;show global variables like &#039;%timeout%&#039;&quot;;
&nbsp;&nbsp;&nbsp;&nbsp;$result=mysql_db_query($mysql_database, $strsql, $conn);
&nbsp;&nbsp;&nbsp;&nbsp;while($row=mysql_fetch_row($result))&#123;//一定要循环，指针下移。
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; print_r($row);
&nbsp;&nbsp;&nbsp;&nbsp;&#125;&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;&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;&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;&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;&nbsp;&nbsp;&nbsp;&nbsp;
&nbsp;&nbsp;&nbsp;&nbsp;die;
</textarea><br/> Call to undefined function mysql_connect() in /tmp/mysql.php:6<br/>Stack trace:<br/>#0 &#123;main&#125;<br/>&nbsp;&nbsp;thrown in /tmp/mysql.php on line 6<br/><br/> Call to undefined function mysql_real_connect() in /tmp/mysql.php:6<br/>Stack trace:<br/>#0 &#123;main&#125;<br/>&nbsp;&nbsp;thrown in /tmp/mysql.php on line 6<br/>================================================================================<br/>mysql_connect/mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。现在PHP7已经废弃上面这两个Mysql的连接函数了。<br/>新的PDO直接用设置了，更灵活：<br/>mysql server 的配置wait_timeout如果过小，就会导致PDO出现mysql has gone away错误。<br/>解决办法，设置较长的会话超时时间。<br/>$pdo-&gt;exec(&#039;set session wait_timeout=10000&#039;);<br/>但这样一来，可能会导致更多的mysql睡眠连接。
]]>
</description>
</item><item>
<link>https://jackxiang.com/post//#blogcomment</link>
<title><![CDATA[[评论] [实践OK]Mysql客户端连接和PHP连接时interactive_timeout和wait_timeout的一个关系，以及在Mysql做一些超长的处理时mysql gone away的原因。]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>https://jackxiang.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>