<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>&#22823;&#34430;&#30340;&#23398;&#20064;&#31354;&#38388; &#187; PHP语言学习</title>
	<atom:link href="http://blog.fabrichina.net/archives/category/php-%e5%ae%89%e8%a3%85%e6%9e%b6%e6%9e%84/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.fabrichina.net</link>
	<description>PHP SEO &#30005;&#23376;&#21830;&#21153;&#26550;&#26500;</description>
	<lastBuildDate>Mon, 06 Sep 2010 07:47:16 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>gearmand vs php的server&amp;client&amp;job安装，使用</title>
		<link>http://blog.fabrichina.net/archives/466</link>
		<comments>http://blog.fabrichina.net/archives/466#comments</comments>
		<pubDate>Mon, 06 Sep 2010 07:47:16 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=466</guid>
		<description><![CDATA[wget http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz tar zxvf gearmand-0.9.tar.gz cd gearmand-0.9/ ./configure make make install /sbin/ldconfig cd ../ wget http://pecl.php.net/get/gearman-0.7.0.tgz tar zxvf gearman-0.7.0.tgz cd gearman-0.7.0 /usr/local/php/bin/phpize ./configure &#8211;with-php-config=/usr/local/php/bin/php-config &#8211;with-gearman make make install cd ../ configure php的时候出现这个 configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers. http://sourceforge.net/projects/re2c/files/ wget http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download tar -zxvf re2c-0.13.5.tar.gz cd [...]]]></description>
			<content:encoded><![CDATA[<p>wget <a href="http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz" target="_blank">http://launchpad.net/gearmand/trunk/0.9/+download/gearmand-0.9.tar.gz</a><br />
tar zxvf gearmand-0.9.tar.gz<br />
cd gearmand-0.9/<br />
./configure<br />
make<br />
make install<br />
/sbin/ldconfig<br />
cd ../<br />
wget <a href="http://pecl.php.net/get/gearman-0.7.0.tgz">http://pecl.php.net/get/gearman-0.7.0.tgz</a><br />
tar zxvf gearman-0.7.0.tgz<br />
cd gearman-0.7.0<br />
/usr/local/php/bin/phpize<br />
./configure &#8211;with-php-config=/usr/local/php/bin/php-config &#8211;with-gearman<br />
make<br />
make install<br />
cd ../</p>
<p>configure php的时候出现这个<br />
configure: WARNING: You will need re2c 0.13.4 or later if you want to regenerate PHP parsers.<br />
<a href="http://sourceforge.net/projects/re2c/files/">http://sourceforge.net/projects/re2c/files/</a><br />
wget <a href="http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download">http://sourceforge.net/projects/re2c/files/re2c/0.13.5/re2c-0.13.5.tar.gz/download</a><br />
tar -zxvf re2c-0.13.5.tar.gz<br />
cd re2c-0.13.5<br />
./configure &amp;&amp; make &amp;&amp; make install</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/466/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php array占用内存测试</title>
		<link>http://blog.fabrichina.net/archives/464</link>
		<comments>http://blog.fabrichina.net/archives/464#comments</comments>
		<pubDate>Fri, 03 Sep 2010 08:43:34 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=464</guid>
		<description><![CDATA[&#60;?php function convert($size)  {     $unit=array(&#8216;b&#8217;,'kb&#8217;,'mb&#8217;,'gb&#8217;,'tb&#8217;,'pb&#8217;);     return @round($size/pow(1024,($i=floor(log($size,1024)))),2).&#8217; &#8216;.$unit[$i];  } $start=memory_get_usage(true); $test=array(); for($i=0;$i&#60;100000;$i++)         $test[md5($i)]=1; echo convert(memory_get_usage(true) &#8211; $start); 结果：17.25 mb 意思就是10万个32位的array key,占用内存17.25M]]></description>
			<content:encoded><![CDATA[<p>&lt;?php<br />
function convert($size)<br />
 {<br />
    $unit=array(&#8216;b&#8217;,'kb&#8217;,'mb&#8217;,'gb&#8217;,'tb&#8217;,'pb&#8217;);<br />
    return @round($size/pow(1024,($i=floor(log($size,1024)))),2).&#8217; &#8216;.$unit[$i];<br />
 }</p>
<p>$start=memory_get_usage(true);<br />
$test=array();<br />
for($i=0;$i&lt;100000;$i++)<br />
        $test[md5($i)]=1;<br />
echo convert(memory_get_usage(true) &#8211; $start);</p>
<p>结果：17.25 mb</p>
<p>意思就是10万个32位的array key,占用内存17.25M</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/464/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php利用syslog函数分布式将log集中到中央log服务器</title>
		<link>http://blog.fabrichina.net/archives/460</link>
		<comments>http://blog.fabrichina.net/archives/460#comments</comments>
		<pubDate>Thu, 02 Sep 2010 09:24:56 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=460</guid>
		<description><![CDATA[使用php的syslog函数，调用本地的syslog服务，然后从本地syslog发送到中央syslog服务器进行分析整理，配置如下 首先我们先写一个php的测试文件 &#60;?php define_syslog_variables(); openlog(&#8220;TextLog&#8221;, LOG_PID, LOG_LOCAL0); $data = date(&#8220;Y/m/d H:i:s&#8221;); syslog(LOG_DEBUG,&#8221;Messagge: $data&#8221;); closelog(); ?&#62; 注意，我们用local0这个openlog所以在本地的syslog.conf中需配置local0具体配置如下 vi /etc/syslog.conf local0.*                @index-server 保存退出以后/etc/init.d/syslog restart index-server是中央服务器的hostname也可以是IP地址 然后我们配置中央服务器的syslog vi /etc/sysconfig/syslog 将SYSLOGD_OPTIONS=&#8221;-m 0&#8243;改成SYSLOGD_OPTIONS=&#8221;-m 0 -r&#8221;  存盘退出 vi /etc/syslog.conf local0.*                        /var/log/php.log #这里就是从各个机器打过来的log放在哪个文件里。。这个文件可能会比较大，建议对这个文件作每日存档 #还有local0.debug 可以打在/var/log/php_debug.log中类似这种。。。可以自由发挥。。 存盘退出以后/etc/init.d/syslog restart 在远端机执行t.php Sep  2 04:17:58 app01 TextLog[2408]: Messagge: 2010/09/02 04:17:56 你看。。app01的log已经写入index-server的php.log文件中了！是不是很简单，很好用？？至于t.php如何封装一下，优化一下。。这个也太简单了。。自己琢磨吧！]]></description>
			<content:encoded><![CDATA[<p>使用php的syslog函数，调用本地的syslog服务，然后从本地syslog发送到中央syslog服务器进行分析整理，配置如下</p>
<p>首先我们先写一个php的测试文件</p>
<p>&lt;?php<br />
define_syslog_variables();<br />
openlog(&#8220;TextLog&#8221;, LOG_PID, LOG_LOCAL0);</p>
<p>$data = date(&#8220;Y/m/d H:i:s&#8221;);<br />
syslog(LOG_DEBUG,&#8221;Messagge: $data&#8221;);</p>
<p>closelog();<br />
?&gt;<br />
注意，我们用local0这个openlog所以在本地的syslog.conf中需配置local0具体配置如下</p>
<p>vi /etc/syslog.conf<br />
local0.*                @index-server<br />
保存退出以后/etc/init.d/syslog restart</p>
<p>index-server是中央服务器的hostname也可以是IP地址</p>
<p>然后我们配置中央服务器的syslog<br />
vi /etc/sysconfig/syslog<br />
将SYSLOGD_OPTIONS=&#8221;-m 0&#8243;改成SYSLOGD_OPTIONS=&#8221;-m 0 -r&#8221; <br />
存盘退出<br />
vi /etc/syslog.conf<br />
local0.*                        /var/log/php.log<br />
#这里就是从各个机器打过来的log放在哪个文件里。。这个文件可能会比较大，建议对这个文件作每日存档<br />
#还有local0.debug 可以打在/var/log/php_debug.log中类似这种。。。可以自由发挥。。<br />
存盘退出以后/etc/init.d/syslog restart</p>
<p>在远端机执行t.php<br />
Sep  2 04:17:58 app01 TextLog[2408]: Messagge: 2010/09/02 04:17:56<br />
你看。。app01的log已经写入index-server的php.log文件中了！是不是很简单，很好用？？至于t.php如何封装一下，优化一下。。这个也太简单了。。自己琢磨吧！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/460/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>和php的getmypid相关的一些函数，挺有用的</title>
		<link>http://blog.fabrichina.net/archives/456</link>
		<comments>http://blog.fabrichina.net/archives/456#comments</comments>
		<pubDate>Wed, 01 Sep 2010 06:38:21 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=456</guid>
		<description><![CDATA[&#60;?php /**  * Check for a current process by filename  * @param $file[optional] Filename  * @return Boolean  */ function processExists($file = false) {     $exists     = false;     $file       = $file ? $file : __FILE__;     // Check if file is in process list     exec(&#8220;ps -C $file -o pid=&#8221;, $pids);     [...]]]></description>
			<content:encoded><![CDATA[<p>&lt;?php</p>
<p>/**<br />
 * Check for a current process by filename<br />
 * @param $file[optional] Filename<br />
 * @return Boolean<br />
 */<br />
function processExists($file = false) {</p>
<p>    $exists     = false;<br />
    $file       = $file ? $file : __FILE__;</p>
<p>    // Check if file is in process list<br />
    exec(&#8220;ps -C $file -o pid=&#8221;, $pids);<br />
    if (count($pids) &gt; 1) {<br />
        $exists = true;<br />
    }<br />
    return $exists;<br />
}</p>
<p>?&gt;</p>
<p><code>&lt;?php<br />
/*</p>
<p>mixed getpidinfo(mixed pid [, string system_ps_command_options])</p>
<p>this function gets PID-info from system ps command and return it in useful assoc-array,<br />
or return false and trigger warning if PID doesn't exists</p>
<p>$pidifo=getpidinfo(12345);</p>
<p>print_r($pidifo);</p>
<p>Array<br />
(<br />
    [USER] =&gt; user<br />
    [PID] =&gt; 12345<br />
    [%CPU] =&gt; 0.0<br />
    [%MEM] =&gt; 0.0<br />
    [VSZ] =&gt; 1720<br />
    [RSS] =&gt; 8<br />
    [TT] =&gt; ??<br />
    [STAT] =&gt; Is<br />
    [STARTED] =&gt; 6:00PM<br />
    [TIME] =&gt; 0:00.01<br />
    [COMMAND] =&gt; php someproces.php &gt; logfile<br />
)</p>
<p>*/</p>
<p>//////////////////////////////////////////////</p>
<p>function getpidinfo($pid, $ps_opt="aux"){</p>
<p>   $ps=shell_exec("ps ".$ps_opt."p ".$pid);<br />
   $ps=explode("\n", $ps);<br />
  <br />
   if(count($ps)&lt;2){<br />
      trigger_error("PID ".$pid." doesn't exists", E_USER_WARNING);<br />
      return false;<br />
   }</p>
<p>   foreach($ps as $key=&gt;$val){<br />
      $ps[$key]=explode(" ", ereg_replace(" +", " ", trim($ps[$key])));<br />
   }</p>
<p>   foreach($ps[0] as $key=&gt;$val){<br />
      $pidinfo[$val] = $ps[1][$key];<br />
      unset($ps[1][$key]);<br />
   }<br />
  <br />
   if(is_array($ps[1])){<br />
      $pidinfo[$val].=" ".implode(" ", $ps[1]);<br />
   }<br />
   return $pidinfo;<br />
}</p>
<p>?&gt; </code></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/456/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>solr vs 中文分词</title>
		<link>http://blog.fabrichina.net/archives/453</link>
		<comments>http://blog.fabrichina.net/archives/453#comments</comments>
		<pubDate>Tue, 31 Aug 2010 09:29:24 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=453</guid>
		<description><![CDATA[solr本身内核是utf-8的，所以建立索引的时候中文可以正确进入索引，建立索引的时候用的中文分词器应该与读取索引时用的分词器一致]]></description>
			<content:encoded><![CDATA[<p>solr本身内核是utf-8的，所以建立索引的时候中文可以正确进入索引，建立索引的时候用的中文分词器应该与读取索引时用的分词器一致</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/453/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>php solr jetty 安装测试</title>
		<link>http://blog.fabrichina.net/archives/447</link>
		<comments>http://blog.fabrichina.net/archives/447#comments</comments>
		<pubDate>Mon, 30 Aug 2010 09:33:54 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=447</guid>
		<description><![CDATA[php中比较大的问题还是搜索问题，pecl开放了solr的包，应用起来应该比较靠谱 安装solr需要先有一个java webserver..我们选用jetty http://dist.codehaus.org/jetty/jetty-6.1.25/jetty-6.1.25.zip unzip jetty-6.1.25.zip java -jar start.jar etc/jetty.xml 把它起来。。 后来我发现自己弄jetty太累了，solr自己启动的时候自动就是jetty 的，自己装有病不是。。 java -Xms2048m -Xmx2048m -server -jar start.jar (在solr的example目录下） 分配内存一定是1024的倍数 完了以后，看http://host:8983/solr/admin/ 安装php solr的pecl phpize ./configure &#8211;with-php-config=.. &#38;&#38; make &#38;&#38; make install vi php.ini 加载上solr.so 打开phpinfo()看看 solr Solr Extension Version 0.9.11 Solr Extension Revision Id $Revision: 300493 $ Last Build Date Aug 30 2010 Last [...]]]></description>
			<content:encoded><![CDATA[<p>php中比较大的问题还是搜索问题，pecl开放了solr的包，应用起来应该比较靠谱</p>
<p>安装solr需要先有一个java webserver..我们选用jetty</p>
<p><a href="http://dist.codehaus.org/jetty/jetty-6.1.25/jetty-6.1.25.zip">http://dist.codehaus.org/jetty/jetty-6.1.25/jetty-6.1.25.zip</a></p>
<p>unzip jetty-6.1.25.zip</p>
<p>java -jar start.jar etc/jetty.xml</p>
<p>把它起来。。</p>
<p>后来我发现自己弄jetty太累了，solr自己启动的时候自动就是jetty 的，自己装有病不是。。</p>
<p>java -Xms2048m -Xmx2048m -server -jar start.jar (在solr的example目录下）</p>
<p>分配内存一定是1024的倍数</p>
<p>完了以后，看http://host:<a href="http://192.168.1.72:8983/solr/admin/">8983/solr/admin/</a></p>
<p>安装php solr的pecl</p>
<p>phpize</p>
<p>./configure &#8211;with-php-config=.. &amp;&amp; make &amp;&amp; make install</p>
<p>vi php.ini 加载上solr.so<br />
打开phpinfo()看看<br />
<a name="module_solr">solr</a></p>
<table border="0" cellpadding="3" width="600">
<tbody>
<tr>
<th>Solr Extension Version</th>
<th>0.9.11</th>
</tr>
<tr>
<td>Solr Extension Revision Id</td>
<td>$Revision: 300493 $</td>
</tr>
<tr>
<td>Last Build Date</td>
<td>Aug 30 2010</td>
</tr>
<tr>
<td>Last Build Time</td>
<td>17:11:02</td>
</tr>
<tr>
<td>SolrObject</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrDocument</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrDocumentField</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrInputDocument</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrClient</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrParams</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrQuery</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrModifiableParams</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrResponse</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrQueryResponse</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrUpdateResponse</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrPingResponse</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrGenericResponse</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrUtils</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrException</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrIllegalOperationException</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrIllegalArgumentException</td>
<td>enabled</td>
</tr>
<tr>
<td>SolrClientException</td>
<td>enabled</td>
</tr>
</tbody>
</table>
<p>搞定接下来，连连试试呗</p>
<p>&lt;?php</p>
<p>$options = array<br />
(<br />
    &#8216;hostname&#8217; =&gt; &#8216;localhost&#8217;,<br />
    &#8216;port&#8217;     =&gt; 8983,<br />
);</p>
<p>$client = new SolrClient($options);</p>
<p>$doc = new SolrInputDocument();</p>
<p>$doc-&gt;addField(&#8216;id&#8217;, 334455);<br />
$doc-&gt;addField(&#8216;cat&#8217;, &#8216;Software&#8217;);<br />
$doc-&gt;addField(&#8216;cat&#8217;, &#8216;Lucene&#8217;);</p>
<p>$updateResponse = $client-&gt;addDocument($doc);</p>
<p>print_r($updateResponse-&gt;getResponse());</p>
<p>执行后，返回</p>
<p>SolrObject Object<br />
(<br />
    [responseHeader] =&gt; SolrObject Object<br />
        (<br />
            [status] =&gt; 0<br />
            [QTime] =&gt; 62<br />
        )</p>
<p>)</p>
<p>恩，看来这东西。。又是白菜一样的简单了。。。一个指令启服务，安装个.so就能用了。。。性能测试了一下还是不错的。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/447/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>nginx 关闭 Transfer-Encoding:chunked</title>
		<link>http://blog.fabrichina.net/archives/445</link>
		<comments>http://blog.fabrichina.net/archives/445#comments</comments>
		<pubDate>Sat, 28 Aug 2010 15:27:23 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=445</guid>
		<description><![CDATA[发现怎么关也关不了，但是用http 1.0的请求还是可以 不过用了http 1.0去请求nginx往后发的时候用的也是1.0,导致后端服务器不返回cotent-length&#8230; 这个。。只好去改后端的服务了。。 最后我看，nginx对http1.1-&#62;http 1.0是不支持的，他只支持http1.1-&#62;http1.1 和http1.0-&#62;http1.0 而Transfer-Encoding:chunked是在http 1.1上包办出现的，想他不出现都不行。。。不过我就奇怪了，我的2台nginx-&#62;nginx的静态文件服务器，也是用的http1.1但是结果就是没有Transfer-Encoding:chunked而且content-length也出来了，真没搞明白为什么~~~从文件头上看，都完全一样，不知道为什么就是不行。。]]></description>
			<content:encoded><![CDATA[<p>发现怎么关也关不了，但是用http 1.0的请求还是可以</p>
<p>不过用了http 1.0去请求nginx往后发的时候用的也是1.0,导致后端服务器不返回cotent-length&#8230;</p>
<p>这个。。只好去改后端的服务了。。</p>
<p>最后我看，nginx对http1.1-&gt;http 1.0是不支持的，他只支持http1.1-&gt;http1.1 和http1.0-&gt;http1.0</p>
<p>而Transfer-Encoding:chunked是在http 1.1上包办出现的，想他不出现都不行。。。不过我就奇怪了，我的2台nginx-&gt;nginx的静态文件服务器，也是用的http1.1但是结果就是没有Transfer-Encoding:chunked而且content-length也出来了，真没搞明白为什么~~~从文件头上看，都完全一样，不知道为什么就是不行。。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/445/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一个简单高效的分词方法</title>
		<link>http://blog.fabrichina.net/archives/436</link>
		<comments>http://blog.fabrichina.net/archives/436#comments</comments>
		<pubDate>Wed, 25 Aug 2010 02:50:00 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=436</guid>
		<description><![CDATA[$u=preg_split(&#8220;/[^0-9a-z-]/i&#8221;,strtolower($str)); foreach($u as $key=>$val) { if(strlen($val)$val) { if(strlen($val)]]></description>
			<content:encoded><![CDATA[<p>$u=preg_split(&#8220;/[^0-9a-z-]/i&#8221;,strtolower($str));<br />
  foreach($u as $key=>$val)<br />
  {<br />
    if(strlen($val)<2) unset($u[$key]);<br />
  }<br />
  return implode('-',$u);<br />
小于两个字符的，不算词。</p>
<p>$u=preg_split("/[^0-9a-z-]/i",strtolower($str));<br />
$b=array();<br />
  foreach($u as $key=>$val)<br />
  {<br />
    if(strlen($val)<2) unset($u[$key]);<br />
    else $b[$val]=1;<br />
        }<br />
$b=array_keys($b);<br />
sort($b);<br />
echo  implode(&#8216;_&#8217;,$b);<br />
echo &#8220;\r\n&#8221;.md5(implode(&#8216;_&#8217;,$b)).&#8221;\r\n&#8221;;<br />
这个呢。。是把重复的单词滤掉。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/436/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>memcachedb 运用&#8217;db_archive&#8217;指令清除log</title>
		<link>http://blog.fabrichina.net/archives/434</link>
		<comments>http://blog.fabrichina.net/archives/434#comments</comments>
		<pubDate>Tue, 24 Aug 2010 08:33:17 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=434</guid>
		<description><![CDATA[实际上memcachedb就有清除db的指令 telnet localhost 21201 db_archive 运行之前的 -rw-r&#8211;r&#8211; 1 www www 8192 Aug 24 03:10 data.db -rw-r&#8212;&#8211; 1 www www 10485760 Aug 24 02:10 log.0000000001 -rw-r&#8212;&#8211; 1 www www 10485760 Aug 24 03:10 log.0000000002 运行之后 -rw-r&#8211;r&#8211; 1 www www 8192 Aug 24 03:10 data.db -rw-r&#8212;&#8211; 1 www www 10485760 Aug 24 03:10 log.0000000002 说明还是生效的~~~]]></description>
			<content:encoded><![CDATA[<p>实际上memcachedb就有清除db的指令<br />
telnet localhost 21201<br />
db_archive<br />
运行之前的<br />
-rw-r&#8211;r&#8211; 1 www www     8192 Aug 24 03:10 data.db<br />
-rw-r&#8212;&#8211; 1 www www 10485760 Aug 24 02:10 log.0000000001<br />
-rw-r&#8212;&#8211; 1 www www 10485760 Aug 24 03:10 log.0000000002<br />
运行之后<br />
-rw-r&#8211;r&#8211; 1 www www     8192 Aug 24 03:10 data.db<br />
-rw-r&#8212;&#8211; 1 www www 10485760 Aug 24 03:10 log.0000000002</p>
<p>说明还是生效的~~~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/434/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>memcachedb 日志文件归档处理php脚本</title>
		<link>http://blog.fabrichina.net/archives/430</link>
		<comments>http://blog.fabrichina.net/archives/430#comments</comments>
		<pubDate>Tue, 24 Aug 2010 08:21:44 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=430</guid>
		<description><![CDATA[memcachedb最大的问题就是数据库的归档log太大了！google code上有一个php的归档脚本，拿来用用。。 &#60;?php class Approach implements IApproach {     public function run($sPath) {         $nRemains = 10;         $aFiles = scandir($sPath, 1);         $aDestPaths = array();         $aDestFiles = array();         $i = 0;         if($aFiles) foreach($aFiles as $f) {             $p = $sPath . DIRECTORY_SEPARATOR . $f;             if(is_dir($p)                 &#124;&#124; strtolower(substr($f, 0, 4)) [...]]]></description>
			<content:encoded><![CDATA[<p>memcachedb最大的问题就是数据库的归档log太大了！google code上有一个php的归档脚本，拿来用用。。</p>
<pre lang=php>
&lt;?php
class Approach implements IApproach {
    public function run($sPath) {
        $nRemains = 10;
        $aFiles = scandir($sPath, 1);
        $aDestPaths = array();
        $aDestFiles = array();
        $i = 0;
        if($aFiles) foreach($aFiles as $f) {
            $p = $sPath . DIRECTORY_SEPARATOR . $f;
            if(is_dir($p)
                || strtolower(substr($f, 0, 4)) != "log."
                || strtolower(pathinfo($p, PATHINFO_EXTENSION)) == "gz") {
                continue;
            }

            if($i &lt; $nRemains) {
                $i++;
                continue;
            }

            $aDestPaths[] = $p;
            $aDestFiles[] = $f;
        }

        // pack
        if($aDestFiles) {
            $sDestFiles = implode(" ", $aDestFiles);
            $sArchivePath = $sPath . DIRECTORY_SEPARATOR . strftime("log.%Y%m%d%H%M%S.tar.gz");
            $sCommand = "tar -C $sPath -zcvf $sArchivePath $sDestFiles";
            system($sCommand, $tmp);
        }

        // remove
        if($aDestPaths) foreach($aDestPaths as $p) {
            unlink($p);
        }
    }

    public function getName() {
        return "MemcacheDB日志清理";
    }

    public function getDescription() {
        return "针对MemcacheDB的日志设计的清理及备份方案。";
    }
}
?&gt;
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/430/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>memcachedb 安装/测试 VS TokyoTyrant 性能差</title>
		<link>http://blog.fabrichina.net/archives/426</link>
		<comments>http://blog.fabrichina.net/archives/426#comments</comments>
		<pubDate>Tue, 24 Aug 2010 08:11:34 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=426</guid>
		<description><![CDATA[svn checkout http://memcachedb.googlecode.com/svn/trunk/ memcachedb-read-only http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html http://download.oracle.com/otn/berkeley-db/db-5.0.26.tar.gz tar -zxvf db-5.0.26.tar.tar cd db-5.0.26 cd build_unix/ ../dist/configure make &#38;&#38; make install cd ../../ cd memcachedb-read-only/ ./configure &#8211;enable-threads -with-bdb=/usr/local/BerkeleyDB.5.0/ make &#38;&#38; make install cd .. memcachedb -u -p 21201 -t 8 -d -r -H /data/memcachedb -N -v -E -X -m 512 -L 8MB -C 20 -T 60 &#62;/dev/null &#38; [...]]]></description>
			<content:encoded><![CDATA[<p>svn checkout <a href="http://memcachedb.googlecode.com/svn/trunk/">http://memcachedb.googlecode.com/svn/trunk/</a> memcachedb-read-only</p>
<p><a href="http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html">http://www.oracle.com/technetwork/database/berkeleydb/overview/index.html</a><br />
<a href="http://download.oracle.com/otn/berkeley-db/db-5.0.26.tar.gz">http://download.oracle.com/otn/berkeley-db/db-5.0.26.tar.gz</a><br />
tar -zxvf db-5.0.26.tar.tar<br />
cd db-5.0.26<br />
cd build_unix/<br />
../dist/configure<br />
make &amp;&amp; make install<br />
cd ../../</p>
<p>cd memcachedb-read-only/<br />
./configure &#8211;enable-threads -with-bdb=/usr/local/BerkeleyDB.5.0/<br />
make &amp;&amp; make install<br />
cd ..<br />
memcachedb -u -p 21201 -t 8 -d -r -H /data/memcachedb -N -v -E -X -m 512 -L 8MB -C 20 -T 60 &gt;/dev/null &amp;<br />
&gt;/data/memcachedb/memcachedb.log 2&gt;&amp;1<br />
memcachedb -p21201 -d -r -H /data/memcachedb -N -R 127.0.0.1:31201 -M -n 2 -v &gt;/data/memcachedb/memcachedb.log 2&gt;&amp;1</p>
<p>用php测试memcachedb和tokyoDb，他们的差别</p>
<p>[root@Index-Server dataget]# /usr/local/php/bin/php tts.php<br />
Did nothing in 0.65564799308777 seconds<br />
value[root@Index-Server dataget]# /usr/local/php/bin/php mem.php<br />
Did nothing in 0.73450708389282 seconds<br />
test[root@Index-Server dataget]# /usr/local/php/bin/php tts.php<br />
Did nothing in 0.85011577606201 seconds<br />
value[root@Index-Server dataget]# /usr/local/php/bin/php tts.php<br />
Did nothing in 0.92772603034973 seconds<br />
value[root@Index-Server dataget]# /usr/local/php/bin/php tts.php<br />
Did nothing in 0.99560403823853 seconds<br />
value[root@Index-Server dataget]# /usr/local/php/bin/php tts.php<br />
Did nothing in 1.0420861244202 seconds<br />
value[root@Index-Server dataget]# /usr/local/php/bin/php tts.php<br />
Did nothing in 0.89272093772888 seconds<br />
value[root@Index-Server dataget]# /usr/local/php/bin/php tts.php<br />
Did nothing in 1.04558801651 seconds<br />
value[root@Index-Server dataget]# /usr/local/php/bin/php tts.php<br />
Did nothing in 0.81222891807556 seconds<br />
value[root@Index-Server dataget]# /usr/local/php/bin/php mem.php<br />
Did nothing in 0.68305706977844 seconds<br />
test[root@Index-Server dataget]# /usr/local/php/bin/php mem.php<br />
Did nothing in 0.68526387214661 seconds<br />
test[root@Index-Server dataget]# /usr/local/php/bin/php mem.php<br />
Did nothing in 0.69543099403381 seconds<br />
test[root@Index-Server dataget]# /usr/local/php/bin/php mem.php<br />
Did nothing in 0.67856597900391 seconds<br />
test[root@Index-Server dataget]# /usr/local/php/bin/php mem.php<br />
Did nothing in 0.67917394638062 seconds<br />
test[root@Index-Server dataget]# /usr/local/php/bin/php mem.php<br />
Did nothing in 0.682452917099 seconds<br />
test[root@Index-Server dataget]#</p>
<p>可以看出tokyoDb的性能不是太稳定，memcachedb还是要稳定很多的。速度上也是memcachedb来的更快。</p>
<p>TokyoTyrant 我用的是tbh 优化了xmsize应该是他比较优化的性能了，和memcachedb还是有一些差距的。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/426/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql 添加用户 一组IP 一组表</title>
		<link>http://blog.fabrichina.net/archives/424</link>
		<comments>http://blog.fabrichina.net/archives/424#comments</comments>
		<pubDate>Mon, 23 Aug 2010 15:02:28 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=424</guid>
		<description><![CDATA[通配符就是%设置表和IP都可以使用% 比如 192.168.1.% 就是 192.168.1.* 比如XX% 就是所有xx开头的表的权限。 TestTab 192.168.1.% 是 USAGE 否 数据库 权限 授权 按表指定权限 操作 TestTab% SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, REFERENCES, INDEX, ALTER, CREATE TEMPORARY TABLES, CREATE VIEW, EVENT, TRIGGER, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE 否 否]]></description>
			<content:encoded><![CDATA[<p>通配符就是%设置表和IP都可以使用%</p>
<p>比如 192.168.1.% 就是 192.168.1.*</p>
<p>比如XX% 就是所有xx开头的表的权限。</p>
<table id="tableuserrights">
<tbody>
<tr>
<td><label for="checkbox_sel_users_5">TestTab</label></td>
<td>192.168.1.%</td>
<td>是</td>
<td><tt><dfn title="无权限。">USAGE</dfn> </tt></td>
<td>否</td>
<td align="center"><a href="http://phpmyadmin.factory.dhgate.com/server_privileges.php?server=2&amp;token=a7f51a089394b6d808820f2ac1eaeef7&amp;username=HGGJ&amp;hostname=192.168.1.%25&amp;dbname=&amp;tablename="><img title="编辑权限" src="http://phpmyadmin.factory.dhgate.com/themes/original/img/b_usredit.png" alt="编辑权限" width="16" height="16" /></a></td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>数据库</th>
<th>权限</th>
<th>授权</th>
<th>按表指定权限</th>
<th colspan="2">操作</th>
</tr>
</thead>
<tbody>
<tr>
<td>TestTab%</td>
<td><tt><dfn title="允许读取数据。">SELECT</dfn>, <dfn title="允许插入和替换数据。">INSERT</dfn>, <dfn title="允许修改数据。">UPDATE</dfn>, <dfn title="允许删除数据。">DELETE</dfn>, <dfn title="允许创建新数据库和数据表。">CREATE</dfn>, <dfn title="允许删除数据库和数据表。">DROP</dfn>, <dfn title="在此版本的 MySQL 中无效。">REFERENCES</dfn>, <dfn title="允许创建和删除索引。">INDEX</dfn>, <dfn title="允许修改现有数据表的结构。">ALTER</dfn>, <dfn title="允许创建临时表。">CREATE TEMPORARY TABLES</dfn>, <dfn title="允许创建视图。">CREATE VIEW</dfn>, <dfn title="允许为事件触发器设置事件">EVENT</dfn>, <dfn title="允许创建和删除触发器">TRIGGER</dfn>, <dfn title="允许执行 SHOW CREATE VIEW 查询。">SHOW VIEW</dfn>, <dfn title="允许创建存储过程。">CREATE ROUTINE</dfn>, <dfn title="允许修改或删除储存过程。">ALTER ROUTINE</dfn>, <dfn title="允许运行存储过程。">EXECUTE</dfn> </tt></td>
<td>否</td>
<td>否</td>
<td><a href="http://phpmyadmin.factory.dhgate.com/server_privileges.php?server=2&amp;token=a7f51a089394b6d808820f2ac1eaeef7&amp;username=HGGJ&amp;hostname=192.168.1.%25&amp;dbname=HGGJ%25&amp;tablename="><img title="编辑权限" src="http://phpmyadmin.factory.dhgate.com/themes/original/img/b_usredit.png" alt="编辑权限" width="16" height="16" /></a></td>
</tr>
</tbody>
</table>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/424/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ssh 信任关系（无密码）</title>
		<link>http://blog.fabrichina.net/archives/420</link>
		<comments>http://blog.fabrichina.net/archives/420#comments</comments>
		<pubDate>Mon, 23 Aug 2010 05:38:37 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=420</guid>
		<description><![CDATA[:::::::::::::: ssh.sh :::::::::::::: #!/bin/bash #for 249 login others with no passwd #by shao for i in $@ do if [ ! -f /home/www/.ssh/id_dsa.pub ];then     ssh-keygen -t dsa fi scp /home/www/.ssh/id_dsa.pub www@$i:/tmp/ echo &#8220;copied&#8221; ssh -l www www@$i &#8221; [ -e /home/www/.ssh ] &#124;&#124; mkdir /home/www/.ssh&#8221; ssh -l www www@$i &#8220;cat /tmp/id_dsa.pub &#62;&#62; /home/www/.ssh/authorized_keys&#8221; echo [...]]]></description>
			<content:encoded><![CDATA[<p>::::::::::::::<br />
ssh.sh<br />
::::::::::::::<br />
#!/bin/bash<br />
#for 249 login others with no passwd<br />
#by shao<br />
for i in $@</p>
<p>do</p>
<p>if [ ! -f /home/www/.ssh/id_dsa.pub ];then<br />
    ssh-keygen -t dsa<br />
fi</p>
<p>scp /home/www/.ssh/id_dsa.pub <a href="mailto:www@$i:/tmp/">www@$i:/tmp/</a><br />
echo &#8220;copied&#8221;<br />
ssh -l www <a href="mailto:www@$i">www@$i</a> &#8221; [ -e /home/www/.ssh ] || mkdir /home/www/.ssh&#8221;<br />
ssh -l www <a href="mailto:www@$i">www@$i</a> &#8220;cat /tmp/id_dsa.pub &gt;&gt; /home/www/.ssh/authorized_keys&#8221;<br />
echo &#8220;attaphed&#8221;<br />
echo &#8220;$i is done!&#8221;<br />
ssh -l www <a href="mailto:www@$i">www@$i</a> &#8220;rm -f  /tmp/id_dsa.pub&#8221;<br />
done</p>
<p>用户目录权限为 755 或者 700，就是不能是77x<br />
.ssh目录权限必须为755<br />
rsa_id.pub 及authorized_keys权限必须为644或600<br />
rsa_id权限必须为600</p>
<p>rsa_id.pub 在生成 authorized_keys后即可以删除。<br />
rsa_id为私钥，也应该从服务器上删除</p>
<p>如果还不对的话 ssh -v <a href="mailto:user@host">user@host</a> 看一下</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/420/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql-proxy 配置</title>
		<link>http://blog.fabrichina.net/archives/409</link>
		<comments>http://blog.fabrichina.net/archives/409#comments</comments>
		<pubDate>Fri, 20 Aug 2010 10:39:32 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=409</guid>
		<description><![CDATA[./mysql-proxy: error while loading shared libraries: libmysql-chassis.so.0: cannot open shared object file: No such file or directory  cd /usr/lib cp /usr/local/mysql-proxy/lib/libmysql-* . ln -s了一堆so以后 ** ERROR **: GLib version too old (micro mismatch), got: lib=2.12.3, headers=2.16.6 这个可真是头疼了！ wget http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz tar zvfx glib-2.18.4.tar.gz cd glib-2.18.4 ./configure &#8211;prefix=/usr &#8211;libdir=/usr/lib make make install ./configure &#8211;prefix=/usr &#8211;libdir=/usr/lib 很重要，否则没用！我白编译了一遍~~ 然后记得在/etc/ld.so.conf中加上/usr/local/lib [...]]]></description>
			<content:encoded><![CDATA[<p>./mysql-proxy: error while loading shared libraries: libmysql-chassis.so.0: cannot open shared object file: No such file or directory</p>
<p> cd /usr/lib</p>
<p>cp /usr/local/mysql-proxy/lib/libmysql-* .</p>
<p>ln -s了一堆so以后</p>
<p>** ERROR **: GLib version too old (micro mismatch), got: lib=2.12.3, headers=2.16.6</p>
<p>这个可真是头疼了！</p>
<p>wget <a href="http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz">http://ftp.gnome.org/pub/gnome/sources/glib/2.18/glib-2.18.4.tar.gz</a><br />
tar zvfx glib-2.18.4.tar.gz<br />
cd glib-2.18.4<br />
./configure &#8211;prefix=/usr &#8211;libdir=/usr/lib<br />
make<br />
make install</p>
<p>./configure &#8211;prefix=/usr &#8211;libdir=/usr/lib 很重要，否则没用！我白编译了一遍~~</p>
<p>然后记得在/etc/ld.so.conf中加上/usr/local/lib 然后ldconfig，这才终于算是可以用到新版本的glib了！</p>
<p>./mysql-proxy &#8211;daemon &#8211;keepalive &#8211;basedir=/usr/local/mysql-proxy/ &#8211;proxy-address=192.168.1.180:3306 &#8211;proxy-backend-addresses=db01:3306 &#8211;proxy-read-only-backend-addresses=db02:3306 &#8211;proxy-lua-script=lib/mysql-proxy/lua/proxy/ &#8211;log-file=/var/log/mysql-proxy.log &#8211;log-level=debug</p>
<p>启动了这个以后去看log</p>
<p>010-08-20 08:31:00: (message) proxy listening on port 192.168.1.180:3306<br />
2010-08-20 08:31:00: (message) added read/write backend: db01:3306<br />
2010-08-20 08:31:00: (message) added read-only backend: db02:3306<br />
2010-08-20 08:31:22: (debug) abs wait-for-event::done            usec=       0<br />
2010-08-20 08:31:22: (debug) abs lua-exec::done                  usec=       0</p>
<p>这就是成功了！o ye ~~</p>
<p>不过我现在用的是blance </p>
<p>=/usr/local/share/mysql-proxy/rw-splitting.lua 用这个的话是读写分离的lua不过我吧debug打开以后发现他还会将大量的读打到我设置的主写服务器，估计是什么地方弄错了？？<br />
/usr/local/mysql-proxy/libexec/mysql-proxy &#8211;daemon &#8211;keepalive &#8211;basedir=/usr/local/mysql-proxy/ &#8211;proxy-address=192.168.1.180:3306 &#8211;proxy-backend-addresses=db01:3306 &#8211;proxy-read-only-backend-addresses=db02:3306 &#8211;proxy-lua-script=share/doc/mysql-proxy/rw-splitting.lua &#8211;log-file=/var/log/mysql-proxy.log &#8211;log-level=debug</p>
<p>测试了一下中文，直接连库没问题，通过mysql-proxy就会悲剧。。。</p>
<div id="_mcePaste">default-character-set = utf8<br />
skip-character-set-client-handshake<br />
character-set-server = utf8<br />
collation-server = utf8_general_ci<br />
#init-connect = SET NAMES utf8</div>
<div>把这个加到2台服务器的my.conf中再试试吧。。</div>
<div>不过我也是觉得最后这句有点问题，每个connect都发一个set name实在不怎么样，好在我去了以后也没问题，索性我就去了最后一行，效率应该能好些！</div>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/409/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql my.cnf 含义</title>
		<link>http://blog.fabrichina.net/archives/406</link>
		<comments>http://blog.fabrichina.net/archives/406#comments</comments>
		<pubDate>Fri, 20 Aug 2010 10:01:45 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=406</guid>
		<description><![CDATA[MySQL資料庫5.0的my.cnf配置選項概述: mysqld程序–目錄和文件 basedir = path 使用給定目錄作為根目錄(安裝目錄)。 character-sets-dir = path 給出存放著字符集的目錄。 datadir = path 從給定目錄讀取資料庫文件。 pid-file = filename 為mysqld程序指定一個存放進程ID的文件(僅適用於UNIX/Linux系統) Init-V腳本需要使用這個文件裡的進程ID結束mysqld進程。 socket = filename 為MySQL客戶程序與服務器之間的本地通信指定一個套接字文件 (僅適用於UNIX/Linux系統; 默認設置一般是/var/lib/mysql/mysql.sock文件)。 在Windows環境下，如果MySQL客戶與服務器是通過命名管道進行通信的，–sock選項給出的將是該命名管道的名字(默認設置是MySQL)。 lower_case_table_name = 1/0 新目錄和資料表的名字是否只允許使用小寫字母; 這個選項在Windows環境下的默認設置是1(只允許使用小寫字母)。 mysqld程序–語言設置 character-sets-server = name 新資料庫或資料表的默認字符集。為了與MySQL的早期版本保持兼容，這個字符集也可以用–default-character-set選項給出; 但這個選項已經顯得有點過時了。 collation-server = name 新資料庫或資料表的默認排序方式。 lanuage = name 用指定的語言顯示出錯信息。 mysqld程序–通信、網絡、信息安全 enable-named-pipes 允許Windows 2000/XP環境下的客戶和服務器使用命名管道(named pipe)進行通信。這個命名管道的默認名字是MySQL，但可以用–socket選項來改變。 local-infile [=0] 允許/禁止使用LOAD DATA LOCAL語句來處理本地文件。 [...]]]></description>
			<content:encoded><![CDATA[<p>MySQL資料庫5.0的my.cnf配置選項概述:<br />
<strong></strong></p>
<p><strong>mysqld程序–目錄和文件</strong><br />
<strong>basedir</strong> = path 使用給定目錄作為根目錄(安裝目錄)。<br />
<strong>character-sets-dir</strong> = path 給出存放著字符集的目錄。<br />
<strong>datadir</strong> = path 從給定目錄讀取資料庫文件。<br />
<strong>pid-file</strong> = filename 為mysqld程序指定一個存放進程ID的文件(僅適用於UNIX/Linux系統)<br />
Init-V腳本需要使用這個文件裡的進程ID結束mysqld進程。<br />
<strong>socket</strong> = filename 為MySQL客戶程序與服務器之間的本地通信指定一個套接字文件<br />
(僅適用於UNIX/Linux系統; 默認設置一般是/var/lib/mysql/mysql.sock文件)。<br />
在Windows環境下，如果MySQL客戶與服務器是通過命名管道進行通信的，–sock選項給出的將是該命名管道的名字(默認設置是MySQL)。<br />
<strong>l</strong><strong>ower_case_table_name</strong> = 1/0 新目錄和資料表的名字是否只允許使用小寫字母; 這個選項在Windows環境下的默認設置是1(只允許使用小寫字母)。<br />
<strong></strong></p>
<p><strong>mysqld程序–語言設置</strong><br />
<strong>character-sets-server</strong> = name 新資料庫或資料表的默認字符集。為了與MySQL的早期版本保持兼容，這個字符集也可以用–default-character-set選項給出; 但這個選項已經顯得有點過時了。<br />
<strong>collation-server</strong> = name 新資料庫或資料表的默認排序方式。<br />
<strong>lanuage</strong> = name 用指定的語言顯示出錯信息。<br />
<strong></strong></p>
<p><strong>mysqld程序–通信、網絡、信息安全</strong><br />
<strong>enable-named-pipes</strong> 允許Windows 2000/XP環境下的客戶和服務器使用命名管道(named pipe)進行通信。這個命名管道的默認名字是MySQL，但可以用–socket選項來改變。<br />
<strong>local-infile</strong> [=0] 允許/禁止使用LOAD DATA LOCAL語句來處理本地文件。<br />
<strong>myisam-recover</strong> [=opt1, opt2, ...] 在啟動時自動修復所有受損的MyISAM資料表。這個選項的可取值有4種EFAULT、BACKUP、QUICK和FORCE; 它們與myisamchk程序的同名選項作用相同。<br />
<strong>old-passwords</strong> 使用MySQL 3.23和4.0版本中的老算法來加密mysql資料庫裡的密碼(默認使用MySQL 4.1版本開始引入的新加密算法)。<br />
<strong>port</strong> = n 為MySQL程序指定一個TCP/IP通信端口(通常是3306端口)。<br />
<strong>safe-user-create</strong> 只有在mysql.user資料庫表上擁有INSERT權限的用戶才能使用GRANT命令; 這是一種雙保險機制(此用戶還必須具備GRANT權限才能執行GRANT命令)。<br />
<strong>shared-memory</strong> 允許使用記憶體(shared memory)進行通信(僅適用於Windows)。<br />
<strong>shared-memory-base-name</strong> = name 給共享記憶體塊起一個名字(默認的名字是MySQL)。<br />
<strong>skip-grant-tables</strong> 不使用mysql資料庫裡的信息來進行訪問控制(警告:這將允許用戶任何用戶去修改任何資料庫)。<br />
<strong>skip-host-cache</strong> 不使用高速緩存區來存放主機名和IP地址的對應關係。<br />
<strong>skip-name-resovle</strong> 不把IP地址解析為主機名; 與訪問控制(mysql.user資料表)有關的檢查全部通過IP地址行進。<br />
<strong>skip-networking</strong> 只允許通過一個套接字文件(Unix/Linux系統)或通過命名管道(Windows系統)進行本地連接，不允許ICP/IP連接; 這提高了安全性，但阻斷了來自網絡的外部連接和所有的Java客戶程序(Java客戶即使在本地連接裡也使用TCP/IP)。<br />
<strong>user</strong> = name mysqld程序在啟動後將在給定UNIX/Linux賬戶下執行; mysqld必須從root賬戶啟動才能在啟動後切換到另一個賬戶下執行; mysqld_safe腳本將默認使用–user=mysql選項來啟動mysqld程序。<br />
<strong></strong></p>
<p><strong>mysqld程序–記憶體管理、優化、查詢緩存區</strong><br />
<strong>bulk_insert_buffer_size</strong> = n 為一次插入多條新記錄的INSERT命令分配的緩存區長度(默認設置是8M)。<br />
<strong>key_buffer_size</strong> = n 用來存放索引區塊的RMA值(默認設置是8M)。<br />
<strong>join_buffer_size</strong> = n 在參加JOIN操作的數據列沒有索引時為JOIN操作分配的緩存區長度(默認設置是128K)。<br />
<strong>max_heap_table_size</strong> = n HEAP資料表的最大長度(默認設置是16M); 超過這個長度的HEAP資料表將被存入一個臨時文件而不是駐留在記憶體裡。<br />
<strong>max_connections</strong> = n MySQL服務器同時處理的資料庫連接的最大數量(默認設置是100)。<br />
<strong>query_cache_limit</strong> = n 允許臨時存放在查詢緩存區裡的查詢結果的最大長度(默認設置是1M)。<br />
<strong>query_cache_size</strong> = n 查詢緩存區的最大長度(默認設置是0，不開闢查詢緩存區)。<br />
<strong>query_cache_type</strong> = 0/1/2 查詢緩存區的工作模式:0, 禁用查詢緩存區; 1，啟用查詢緩存區(默認設置); 2，’按需分配’模式，只響應SELECT SQL_CACHE命令。<br />
<strong>read_buffer_size</strong> = n 為從資料表順序讀取數據的讀操作保留的緩存區的長度(默認設置是128KB); 這個選項的設置值在必要時可以用SQL命令SET SESSION read_buffer_size = n命令加以改變。<br />
<strong>read_rnd_buffer_size</strong> = n 類似於read_buffer_size選項，但針對的是按某種特定順序(比如使用了ORDER BY子句的查詢)輸出的查詢結果(默認設置是256K)。<br />
<strong>sore_buffer</strong> = n 為排序操作分配的緩存區的長度(默認設置是2M); 如果這個緩存區太小，則必須創建一個臨時文件來進行排序。<br />
<strong>table_cache</strong> = n 同時打開的資料表的數量(默認設置是64)。<br />
<strong>tmp_table_size</strong> = n 臨時HEAP資料表的最大長度(默認設置是32M); 超過這個長度的臨時資料表將被轉換為MyISAM資料表並存入一個臨時文件。<br />
<strong></strong></p>
<p><strong>mysqld程序–日誌</strong><br />
<strong>log</strong> [= file] 把所有的連接以及所有的SQL命令記入日誌(通用查詢日誌); 如果沒有給出file參數，MySQL將在資料庫目錄裡創建一個hostname.log文件作為這種日誌文件(hostname是服務器的主機名)。<br />
<strong>log-slow-queries</strong> [= file] 把執行用時超過long_query_time變量值的查詢命令記入日誌(慢查詢日誌); 如果沒有給出file參數，MySQL將在資料庫目錄裡創建一個hostname-slow.log文件作為這種日誌文件(hostname是服務器主機 名)。<br />
<strong>long_query_time</strong> = n 慢查詢的執行用時上限(默認設置是10s)。<br />
<strong>long_queries_not_using_indexs</strong> 把慢查詢以及執行時沒有使用索引的查詢命令全都記入日誌(其餘同–log-slow-queries選項)。<br />
<strong>log-bin</strong> [= filename] 把對數據進行修改的所有SQL命令(也就是INSERT、UPDATE和DELETE命令)以二進制格式記入日誌(二進制變更日誌，binary update log)。這種日誌的文件名是filename.n或默認的hostname.n，其中n是一個6位數字的整數(日誌文件按順序編號)。<br />
<strong>log-bin-index</strong> = filename 二進制日誌功能的索引文件名。在默認情況下，這個索引文件與二進制日誌文件的名字相同，但後綴名是.index而不是.nnnnnn。<br />
<strong>max_binlog_size</strong> = n 二進制日誌文件的最大長度(默認設置是1GB)。在前一個二進制日誌文件裡的信息量超過這個最大長度之前，MySQL服務器會自動提供一個新的二進制日誌文件接續上。<br />
<strong>binlog-do-db</strong> = dbname 只把給定資料庫裡的變化情況記入二進制日誌文件，其他資料庫裡的變化情況不記載。如果需要記載多個資料庫裡的變化情況，就必須在配置文件使用多個本選項來設置，每個資料庫一行。<br />
<strong>binlog-ignore-db</strong> = dbname 不把給定資料庫裡的變化情況記入二進制日誌文件。<br />
<strong>sync_binlog</strong> = n 每經過n次日誌寫操作就把日誌文件寫入硬盤一次(對日誌信息進行一次同步)。n=1是最安全的做法，但效率最低。默認設置是n=0，意思是由操作系統來負責二進制日誌文件的同步工作。<br />
<strong>log-update</strong> [= file] 記載出錯情況的日誌文件名(出錯日誌)。這種日誌功能無法禁用。如果沒有給出file參數，MySQL會使用hostname.err作為種日誌文件的名字。<br />
<strong></strong></p>
<p><strong>mysqld程序–鏡像(主控鏡像服務器)</strong><br />
<strong>server-id</strong> = n 給服務器分配一個獨一無二的ID編號; n的取值範圍是1~2的32次方啟用二進制日誌功能。<br />
<strong>log-bin</strong> = name 啟用二進制日誌功能。這種日誌的文件名是filename.n或默認的hostname.n，其中的n是一個6位數字的整數(日誌文件順序編號)。<br />
<strong>binlog-do/ignore-db</strong> = dbname 只把給定資料庫裡的變化情況記入二進制日誌文件/不把給定的資料庫裡的變化記入二進制日誌文件。<br />
<strong></strong></p>
<p><strong>mysqld程序–鏡像(從屬鏡像服務器)</strong><br />
<strong>server-id</strong> = n 給服務器分配一個唯一的ID編號<br />
<strong>log-slave-updates</strong> 啟用從屬服務器上的日誌功能，使這台計算機可以用來構成一個鏡像鏈(A-&gt;B-&gt;C)。<br />
<strong>master-host</strong> = hostname 主控服務器的主機名或IP地址。如果從屬服務器上存在mater.info文件(鏡像關係定義文件)，它將忽略此選項。<br />
<strong>master-user</strong> = replicusername 從屬服務器用來連接主控服務器的用戶名。如果從屬服務器上存在mater.info文件，它將忽略此選項。<br />
<strong>master-password</strong> = passwd 從屬服務器用來連接主控服務器的密碼。如果從屬服務器上存在mater.info文件，它將忽略此選項。<br />
<strong>master-port</strong> = n 從屬服務器用來連接主控服務器的TCP/IP端口(默認設置是3306端口)。<br />
<strong>master-connect-retry</strong> = n 如果與主控服務器的連接沒有成功，則等待n秒(s)後再進行管理方式(默認設置是60s)。如果從屬服務器存在mater.info文件，<br />
它將忽略此選項。<br />
<strong>master-ssl-xxx</strong> = xxx 對主、從服務器之間的SSL通信進行配置。<br />
<strong>read-only</strong> = 0/1 0: 允許從屬服務器獨立地執行SQL命令(默認設置); 1: 從屬服務器只能執行來自主控服務器的SQL命令。<br />
<strong>read-log-purge</strong> = 0/1 1: 把處理完的SQL命令立刻從中繼日誌文件裡刪除(默認設置); 0: 不把處理完的SQL命令立刻從中繼日誌文件裡刪除。<br />
<strong>replicate-do-table</strong> = dbname.tablename 與–replicate-do-table選項的含義和用法相同，但資料庫和資料表名字裡允許出現通配符’%’</p>
<p>(例如: test%.%–對名字以’test’開頭的所有資料庫裡的所以資料庫表進行鏡像處理)。<br />
<strong>replicate-do-db</strong> = name 只對這個資料庫進行鏡像處理。</p>
<p><strong>replicate-ignore-table</strong> = dbname.tablename 不對這個資料表進行鏡像處理。<br />
<strong>replicate-wild-ignore-table</strong> = dbn.tablen 不對這些資料表進行鏡像處理。<br />
<strong>replicate-ignore-db</strong> = dbname 不對這個資料庫進行鏡像處理。<br />
<strong>replicate-rewrite-db</strong> = db1name &gt; db2name 把主控資料庫上的db1name資料庫鏡像處理為從屬服務器上的db2name資料庫。<br />
<strong>report-host</strong> = hostname 從屬服務器的主機名; 這項信息只與SHOW SLAVE HOSTS命令有關–主控服務器可以用這條命令生成一份從屬服務器的名單。<br />
<strong>slave-compressed-protocol</strong> = 1 主、從服務器使用壓縮格式進行通信–如果它們都支持這麼做的話。<br />
<strong>slave-skip-errors</strong> = n1, n2, …或all 即使發生出錯代碼為n1、n2等的錯誤，鏡像處理工作也繼續進行(即不管發生什麼錯誤，鏡像處理工作也繼續進行)。<br />
如果配置得當，從屬服務器不應該在執行SQL命令時發生錯誤(在主控服務器上執行出錯的SQL命令不會被發送到從屬服務器上做鏡像處理); 如果不使用<br />
slave-skip-errors選項，從屬服務器上的鏡像工作就可能人為發生錯誤而中斷，中斷後需要有人工參與才能繼續進行。<br />
<strong></strong></p>
<p><strong>mysqld–InnoDB–基本設置、表空間文件</strong><br />
<strong>skip-innodb</strong> 不加載InnoDB資料表驅動程序–如果用不著InnoDB資料表，可以用這個選項節省一些記憶體。<br />
<strong>innodb-file-per-table</strong> 為每一個新資料表創建一個表空間文件而不是把資料表都集中保存在中央表空間裡(後者是默認設置)。該選項始見於MySQL 4.1。<br />
<strong>innodb-open-file</strong> = n InnoDB資料表驅動程序最多可以同時打開的文件數(默認設置是300)。如果使用了innodb-file-per-table選項並且需要同時打開很多<br />
資料表的話，這個數字很可能需要加大。<br />
<strong>innodb_data_home_dir</strong> = p InnoDB主目錄，所有與InnoDB資料表有關的目錄或文件路徑都相對於這個路徑。在默認的情況下，這個主目錄就是MySQL的數據目錄。<br />
<strong>innodb_data_file_path</strong> = ts 用來容納InnoDB為資料表的表空間: 可能涉及一個以上的文件; 每一個表空間文件的最大長度都必須以字節(B)、兆字節(MB)或<br />
千兆字節(GB)為單位給出; 表空間文件的名字必須以分號隔開; 最後一個表空間文件還可以帶一個autoextend屬性和一個最大長度(max:n)。<br />
例如，ibdata1:1G; ibdata2:1G:autoextend:max:2G的意思是: 表空間文件ibdata1的最大長度是1GB，ibdata2的最大長度也是1G，但允許它擴充到2GB。<br />
除文件名外，還可以用硬盤分區的設置名來定義表空間，此時必須給表空間的最大初始長度值加上newraw關鍵字做後綴，給表空間的最大擴充長度值加上<br />
raw關鍵字做後綴(例如/dev/hdb1:20Gnewraw或/dev/hdb1:20Graw); MySQL 4.0及更高版本的默認設置是ibdata1:10M:autoextend。<br />
<strong>innodb_autoextend_increment</strong> = n 帶有autoextend屬性的表空間文件每次加大多少兆字節(默認設置是8MB)。這個屬性不涉及具體的資料表文件，那些文件的<br />
增大速度相對是比較小的。<br />
<strong>innodb_lock_wait_timeout</strong> = n 如果某個事務在等待n秒(s)後還沒有獲得所需要的資源，就使用ROLLBACK命令放棄這個事務。這項設置對於發現和處理未能被<br />
InnoDB資料表驅動程序識別出來的死鎖條件有著重要的意義。這個選項的默認設置是50s。<br />
<strong>innodb_fast_shutdown</strong> 0/1 是否以最快的速度關閉InnoDB，默認設置是1，意思是不把緩存在INSERT緩存區的數據寫入資料表，那些數據將在MySQL服務器下次<br />
啟動時再寫入(這麼做沒有什麼風險，因為INSERT緩存區是表空間的一個組成部分，數據不會丟失)。把這個選項設置為0反面危險，因為在計算機關閉時，<br />
InnoDB驅動程序很可能沒有足夠的時間完成它的數據同步工作，操作系統也許會在它完成數據同步工作之前強行結束InnoDB，而這會導致數據不完整。<br />
<strong></strong></p>
<p><strong>mysqld程序–InnoDB–日誌</strong><br />
<strong>innodb_log_group_home_dir</strong> = p 用來存放InnoDB日誌文件的目錄路徑(如ib_logfile0、ib_logfile1等)。在默認的情況下，InnoDB驅動程序將使用MySQL數據目<br />
錄作為自己保存日誌文件的位置。<br />
<strong>innodb_log_files_in_group</strong> = n 使用多少個日誌文件(默認設置是2)。InnoDB資料表驅動程序將以輪轉方式依次填寫這些文件; 當所有的日誌文件都寫滿以後，<br />
之後的日誌信息將寫入第一個日誌文件的最大長度(默認設置是5MB)。這個長度必須以MB(兆字節)或GB(千兆字節)為單位進行設置。<br />
<strong>innodb_flush_log_at_trx_commit</strong> = 0/1/2 這個選項決定著什麼時候把日誌信息寫入日誌文件以及什麼時候把這些文件物理地寫(術語稱為’同步’)到硬盤上。<br />
設置值0的意思是每隔一秒寫一次日誌並進行同步，這可以減少硬盤寫操作次數，但可能造成數據丟失; 設置值1(設置設置)的意思是在每執行完一條COMMIT<br />
命令就寫一次日誌並進行同步，這可以防止數據丟失，但硬盤寫操作可能會很頻繁; 設置值2是一般折衷的辦法，即每執行完一條COMMIT命令寫一次日誌，<br />
每隔一秒進行一次同步。<br />
<strong>innodb_flush_method</strong> = x InnoDB日誌文件的同步辦法(僅適用於UNIX/Linux系統)。這個選項的可取值有兩種: fdatasync，用fsync()函數進行同步; O_DSYNC，<br />
用O_SYNC()函數進行同步。<br />
<strong>innodb_log_archive</strong> = 1 啟用InnoDB驅動程序的archive(檔案)日誌功能，把日誌信息寫入ib_arch_log_n文件。啟用這種日誌功能在InnoDB與MySQL一起使用時沒有<br />
多大意義(啟用MySQL服務器的二進制日誌功能就足夠用了)。<br />
<strong></strong></p>
<p><strong>mysqld程序–InnoDB–緩存區的設置和優化</strong><br />
<strong>innodb_log_buffer_pool_size</strong> = n 為InnoDB資料表及其索引而保留的RAM記憶體量(默認設置是8MB)。這個參數對速度有著相當大的影響，如果計算機上只運行有<br />
MySQL/InnoDB資料庫服務器，就應該把全部記憶體的80%用於這個用途。<br />
<strong>innodb_log_buffer_size</strong> = n 事務日誌文件寫操作緩存區的最大長度(默認設置是1MB)。<br />
<strong>innodb_additional_men_pool_size</strong> = n 為用於內部管理的各種數據結構分配的緩存區最大長度(默認設置是1MB)。<br />
<strong>innodb_file_io_threads</strong> = n I/O操作(硬盤寫操作)的最大線程個數(默認設置是4)。<br />
<strong>innodb_thread_concurrency</strong> = n InnoDB驅動程序能夠同時使用的最大線程個數(默認設置是8)。<br />
<strong></strong></p>
<p><strong>mysqld程序–其它選項</strong><br />
<strong>bind-address</strong> = ipaddr MySQL服務器的IP地址。如果MySQL服務器所在的計算機有多個IP地址，這個選項將非常重要。<br />
<strong>default-storage-engine</strong> = type 新資料表的默認資料表類型(默認設置是MyISAM)。這項設置還可以通過–default-table-type選項來設置。<br />
<strong>default-timezone</strong> = name 為MySQL服務器設置一個地理時區(如果它與本地計算機的地理時區不一樣)。<br />
<strong>ft_min_word_len</strong> = n 全文索引的最小單詞長度工。這個選項的默認設置是4，意思是在創建全文索引時不考慮那些由3個或更少的字符構建單詞。<br />
<strong>Max-allowed-packet</strong> = n 客戶與服務器之間交換的數據包的最大長度，這個數字至少應該大於客戶程序將要處理的最大BLOB塊的長度。這個選項的默認設置是1MB。<br />
<strong>Sql-mode</strong> = model1, mode2, … MySQL將運行在哪一種SQL模式下。這個選項的作用是讓MySQL與其他的資料庫系統保持最大程度的兼容。這個選項的可取值包括<br />
ansi、db2、oracle、no_zero_date、pipes_as_concat。<br />
注意：如果在配置文件裡給出的某個選項是mysqld無法識別的(如，因為犯了一個愚蠢的打字錯誤)，MySQL服務器將不啟動。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/406/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql proxy 安装</title>
		<link>http://blog.fabrichina.net/archives/404</link>
		<comments>http://blog.fabrichina.net/archives/404#comments</comments>
		<pubDate>Fri, 20 Aug 2010 10:01:23 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=404</guid>
		<description><![CDATA[  下面这个包是一个编译好的。。直接copy过去就行了 http://dev.mysql.com/get/Downloads/MySQL-Proxy/mysql-proxy-0.8.0-linux-rhel5-x86-64bit.tar.gz/from/http://mysql.he.net/ http://www.lua.org/ftp/lua-5.1.4.tar.gz install Here is a how-to: cd /usr/local wget lua.tar.gz wget mysql-proxy.tar.gz tar xzf lua.tar.gz tar xzf mysql-proxy.tar.gz cd lua* In Makefile change INSTALL_TOP= /opt/lua vi Makefile make linux make install cd.. cd mysql-proxy* yum install libevent-devel glib2-devel ./configure &#8211;prefix=/usr/local/mysql-proxy &#8211;with-lua LDFLAGS=&#8221;-lm -ldl&#8221; LUA_CFLAGS=&#8221;-I/opt/lua/lib/&#8221; LUA_LIBS=/opt/lua/lib/liblua.la make make install Now, it&#8217;s time to [...]]]></description>
			<content:encoded><![CDATA[<p> </p>
<p>下面这个包是一个编译好的。。直接copy过去就行了</p>
<p><a href="http://dev.mysql.com/get/Downloads/MySQL-Proxy/mysql-proxy-0.8.0-linux-rhel5-x86-64bit.tar.gz/from/http://mysql.he.net/">http://dev.mysql.com/get/Downloads/MySQL-Proxy/mysql-proxy-0.8.0-linux-rhel5-x86-64bit.tar.gz/from/http://mysql.he.net/</a></p>
<p><a href="http://www.lua.org/ftp/lua-5.1.4.tar.gz">http://www.lua.org/ftp/lua-5.1.4.tar.gz</a><br />
install<br />
Here is a how-to:</p>
<p>cd /usr/local<br />
wget lua.tar.gz<br />
wget mysql-proxy.tar.gz<br />
tar xzf lua.tar.gz<br />
tar xzf mysql-proxy.tar.gz<br />
cd lua*<br />
In Makefile change INSTALL_TOP= /opt/lua</p>
<p>vi Makefile<br />
make linux<br />
make install<br />
cd..<br />
cd mysql-proxy*</p>
<p>yum install libevent-devel glib2-devel<br />
./configure &#8211;prefix=/usr/local/mysql-proxy &#8211;with-lua LDFLAGS=&#8221;-lm -ldl&#8221; LUA_CFLAGS=&#8221;-I/opt/lua/lib/&#8221; LUA_LIBS=/opt/lua/lib/liblua.la<br />
make<br />
make install</p>
<p>Now, it&#8217;s time to put mysql-proxy on init:</p>
<p>cat &gt;/etc/init.d/mysql-proxy<br />
Paste here MySQL Proxy init contents CTRL+D to save</p>
<p>chmod 0755 /etc/init.d/mysql-proxy<br />
chkconfig mysql-proxy on</p>
<p>cat &gt;/etc/sysconfig/mysql-proxy<br />
# Options to mysql-proxy<br />
# do not remove &#8211;daemon<br />
PROXY_OPTIONS=&#8221;&#8211;daemon&#8221;</p>
<p>/etc/init.d/mysql-proxy<br />
Only change PROXY_PATH=/opt/mysql-proxy/sbin var to directory where mysql-proxy bin is located.</p>
<p>#!/bin/sh<br />
#<br />
# mysql-proxy This script starts and stops the mysql-proxy daemon<br />
#<br />
# chkconfig: &#8211; 78 30<br />
# processname: mysql-proxy<br />
# description: mysql-proxy is a proxy daemon to mysql</p>
<p># Source function library.<br />
. /etc/rc.d/init.d/functions</p>
<p>PROXY_PATH=/opt/mysql-proxy/sbin</p>
<p>prog=&#8221;mysql-proxy&#8221;</p>
<p># Source networking configuration.<br />
. /etc/sysconfig/network</p>
<p># Check that networking is up.<br />
[ ${NETWORKING} = "no" ] &amp;&amp; exit 0</p>
<p># Set default mysql-proxy configuration.<br />
PROXY_OPTIONS=&#8221;&#8211;daemon&#8221;<br />
PROXY_PID=/var/run/mysql-proxy.pid</p>
<p># Source mysql-proxy configuration.<br />
if [ -f /etc/sysconfig/mysql-proxy ] ; then<br />
        . /etc/sysconfig/mysql-proxy<br />
fi</p>
<p>PATH=$PATH:/usr/bin:/usr/local/bin:$PROXY_PATH</p>
<p># By default it&#8217;s all good<br />
RETVAL=0</p>
<p># See how we were called.<br />
case &#8220;$1&#8243; in<br />
  start)<br />
        # Start daemon.<br />
        echo -n $&#8221;Starting $prog: &#8221;<br />
        daemon $NICELEVEL $PROXY_PATH/mysql-proxy $PROXY_OPTIONS &#8211;pid-file $PROXY_PID<br />
        RETVAL=$?<br />
        echo<br />
        if [ $RETVAL = 0 ]; then<br />
                touch /var/lock/subsys/mysql-proxy<br />
        fi<br />
        ;;<br />
  stop)<br />
        # Stop daemons.<br />
        echo -n $&#8221;Stopping $prog: &#8221;<br />
        killproc $prog<br />
        RETVAL=$?<br />
        echo<br />
        if [ $RETVAL = 0 ]; then<br />
                rm -f /var/lock/subsys/mysql-proxy<br />
                rm -f $PROXY_PID<br />
        fi<br />
        ;;<br />
  restart)<br />
        $0 stop<br />
        sleep 3<br />
        $0 start<br />
        ;;<br />
  condrestart)<br />
       [ -e /var/lock/subsys/mysql-proxy ] &amp;&amp; $0 restart<br />
       ;;<br />
  status)<br />
        status mysql-proxy<br />
        RETVAL=$?<br />
        ;;<br />
  *)<br />
        echo &#8220;Usage: $0 {start|stop|restart|status|condrestart}&#8221;<br />
        RETVAL=1<br />
        ;;<br />
esac</p>
<p>exit $RETVAL<br />
[edit] /etc/sysconfig/mysql-proxy<br />
Here you set mysql-proxy parameters</p>
<p># Options to mysql-proxy<br />
# do not remove &#8211;daemon<br />
PROXY_OPTIONS=&#8221;&#8211;daemon&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/404/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>编译lua报错luaconf.h:275:31: error: readline/readline.h: No such file or directory</title>
		<link>http://blog.fabrichina.net/archives/401</link>
		<comments>http://blog.fabrichina.net/archives/401#comments</comments>
		<pubDate>Fri, 20 Aug 2010 09:32:54 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=401</guid>
		<description><![CDATA[wget ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz tar -zxvf readline-6.1.tar.gz cd ~~ ./configure &#38;&#38; make &#38;&#38; make install ldconfig 回到lua里面make linux ;搞定！]]></description>
			<content:encoded><![CDATA[<p>wget <a href="ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz">ftp://ftp.cwru.edu/pub/bash/readline-6.1.tar.gz</a></p>
<p>tar -zxvf readline-6.1.tar.gz</p>
<p>cd ~~ ./configure &amp;&amp; make &amp;&amp; make install</p>
<p>ldconfig</p>
<p>回到lua里面make linux ;搞定！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/401/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>设置mysql slave Master_Log_File</title>
		<link>http://blog.fabrichina.net/archives/399</link>
		<comments>http://blog.fabrichina.net/archives/399#comments</comments>
		<pubDate>Fri, 20 Aug 2010 07:03:53 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=399</guid>
		<description><![CDATA[mysql&#62; show master status; +&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+ &#124; File          &#124; Position &#124; Binlog_Do_DB                                               &#124; Binlog_Ignore_DB &#124; +&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+ &#124; binlog.000003 &#124;      107 &#124; HGGJDATAS01,HGGJDATAS02,HGGJDATAS03,HGGJDATAS04,HGGJGLOBAL &#124;                  &#124; +&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+ 1 row in set (0.00 sec) file在0003 pos是107 在slave机器上 CHANGE master TO master_host=&#8217;db01&#8242;, master_port=3306, master_user=&#8217;root&#8217;, master_password=&#8217;dhgatefactory&#8217;, master_log_file=&#8217;binlog.000003&#8242;, master_log_pos=107; 如果以前启动过slave可以先stop slave;然后执行完了start slave; 最后用show slave status;看一下如何 用phpmyadmin看一下 Slave_IO_State Waiting for master to send [...]]]></description>
			<content:encoded><![CDATA[<p>mysql&gt; show master status;<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| File          | Position | Binlog_Do_DB                                               | Binlog_Ignore_DB |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
| binlog.000003 |      107 | HGGJDATAS01,HGGJDATAS02,HGGJDATAS03,HGGJDATAS04,HGGJGLOBAL |                  |<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;-+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
1 row in set (0.00 sec)</p>
<p>file在0003 pos是107</p>
<p>在slave机器上</p>
<p>CHANGE master TO master_host=&#8217;db01&#8242;, master_port=3306, master_user=&#8217;root&#8217;, master_password=&#8217;dhgatefactory&#8217;, master_log_file=&#8217;binlog.000003&#8242;, master_log_pos=107;</p>
<p>如果以前启动过slave可以先stop slave;然后执行完了start slave;</p>
<p>最后用show slave status;看一下如何</p>
<p>用phpmyadmin看一下</p>
<table id="serverslavereplicationsummary">
<tbody>
<tr>
<td>Slave_IO_State</td>
<td>Waiting for master to send event</td>
</tr>
</tbody>
</table>
<p>基本上就OK~~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/399/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>网络IP地址算法&#8217;/&#8217; 的用法</title>
		<link>http://blog.fabrichina.net/archives/396</link>
		<comments>http://blog.fabrichina.net/archives/396#comments</comments>
		<pubDate>Wed, 18 Aug 2010 08:03:16 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=396</guid>
		<description><![CDATA[xxx.xxx.xxx.xxx/32 这表示前面这个ip xxx.xxx.xxx.xxx/31 标示前面这个ip后面2个 都是按照32-实际数字 作为2的次方来算的必然24就是2的8次方 就是256个ip就是一个C段，如果16就是2个 比如192.168.1.0/24 就是192168.1.0-192.168.1.255 192.168.0.0/16 就是192.168.0.0 -192.168.255.255 依此类推！]]></description>
			<content:encoded><![CDATA[<p>xxx.xxx.xxx.xxx/32 这表示前面这个ip</p>
<p>xxx.xxx.xxx.xxx/31 标示前面这个ip后面2个</p>
<p>都是按照32-实际数字 作为2的次方来算的必然24就是2的8次方 就是256个ip就是一个C段，如果16就是2个</p>
<p>比如192.168.1.0/24 就是192168.1.0-192.168.1.255</p>
<p>192.168.0.0/16 就是192.168.0.0 -192.168.255.255</p>
<p>依此类推！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/396/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tokyo Cabinet及Tokyo Tyrant  tcb tch 类型差异</title>
		<link>http://blog.fabrichina.net/archives/390</link>
		<comments>http://blog.fabrichina.net/archives/390#comments</comments>
		<pubDate>Wed, 18 Aug 2010 02:15:47 +0000</pubDate>
		<dc:creator>Albert</dc:creator>
				<category><![CDATA[PHP语言学习]]></category>

		<guid isPermaLink="false">http://blog.fabrichina.net/?p=390</guid>
		<description><![CDATA[　　TC(Tokyo Cabinet )是日本人 平林幹雄 开发的一款 Key-Value 键值数据库，该数据库读写非常快，哈希模式写入100万条数据只需0.402秒，读取100万条数据只需0.334秒。 　　TT(Tokyo Tyrant )是由同一作者开发的 Tokyo Cabinet 数据库网络接口。它拥有自己的协议，并支持Memcached兼容协议，也可以通过HTTP协议进行数据交换。哈希数据库读写速度大约在50000次/秒。 　　TC和TT目前运行在日本最大的SNS网站MIXI，在国内也有大量的生产环境应用。 　　 　　图：TT、Memcached、MySQL比较 　　Tokyo Cabinet的数据库类型分为：TCHDB 哈希数据库、TCBDB B+Tree数据库、TCFDB 定长数据库、TCTDB 表格数据库、TCMDB 内存哈希数据库、TCNDB 内存B+Tree数据库。 　　很多人反应TT/TC插入数据超过一定数量后，性能会大幅度下降?先对TC做个测试：写入100万条：tchtest write test.tch 1000000，时间: 0.732秒 速度：1366120条/秒，写入200万条：tchtest write test.tch 2000000，时间: 1.718秒 速度：1164144条/秒，写入500万条：tchtest write test.tch 5000000，时间: 21.529秒 速度：232244条/秒，从测试来看，写入500万条数据，性能确实降低。但是，原因呢? 　　修改参数后，再测试：写入100万条： tchtest write -xm 536870912 test.tch 1000000 5000000，时间: 0.580秒 速度： 1724137条/秒，写入200万条： tchtest write -xm 536870912 [...]]]></description>
			<content:encoded><![CDATA[<p>　　TC(Tokyo Cabinet )是日本人 平林幹雄 开发的一款 Key-Value 键值数据库，该数据库读写非常快，哈希模式写入100万条数据只需0.402秒，读取100万条数据只需0.334秒。</p>
<p>　　TT(Tokyo Tyrant )是由同一作者开发的 Tokyo Cabinet 数据库<a title="网络" href="http://net.it168.com/" target="_blank">网络</a>接口。它拥有自己的协议，并支持Memcached兼容协议，也可以通过HTTP协议进行数据交换。哈希数据库读写速度大约在50000次/秒。</p>
<p>　　TC和TT目前运行在日本最大的SNS网站MIXI，在国内也有大量的生产环境应用。<span id="more-390"></span></p>
<p>　　<img src="http://image4.it168.com/2010/4/19/bfa881bb-4c9e-45bf-9122-ada08f31fed1.jpg" alt="" width="500" height="400" /></p>
<p>　　图：TT、Memcached、MySQL比较</p>
<p>　　Tokyo Cabinet的数据库类型分为：TCHDB 哈希数据库、TCBDB B+Tree数据库、TCFDB 定长数据库、TCTDB 表格数据库、TCMDB <a title="内存" href="http://product.it168.com/list/b/0205_1.shtml" target="_blank">内存</a>哈希数据库、TCNDB 内存B+Tree数据库。</p>
<p>　　很多人反应TT/TC插入数据超过一定数量后，性能会大幅度下降?先对TC做个测试：写入100万条：tchtest write test.tch 1000000，时间: 0.732秒 速度：1366120条/秒，写入200万条：tchtest write test.tch 2000000，时间: 1.718秒 速度：1164144条/秒，写入500万条：tchtest write test.tch 5000000，时间: 21.529秒 速度：232244条/秒，从测试来看，写入500万条数据，性能确实降低。但是，原因呢?</p>
<p>　　修改参数后，再测试：写入100万条： tchtest write -xm 536870912 test.tch 1000000 5000000，时间: 0.580秒 速度： 1724137条/秒，写入200万条： tchtest write -xm 536870912 test.tch 2000000 5000000，时间: 1.105秒 速度： 1809954条/秒，写入500万条： tchtest write -xm 536870912 test.tch 5000000 5000000，时间: 2.737秒 速度： 1826817条/秒，可见，性能提升了不少，随着写入数据量地增加，速度依旧不减。</p>
<p>　　关键参数(C API)：bool tchdbsetxmsiz(TCHDB *hdb, int64_t xmsiz);Xmsiz指定了TCHDB的扩展MMAP内存大小，默认值为67108864，也就是64M，如果数据库文件超过64M，则只有前部分会映射在内存中，所以写入性能会下降。其他参数(C API) ：bool tchdbtune(TCHDB *hdb, int64_t bnum, int8_t apow, int8_t fpow, uint8_t opts);bnum指定了 bucket array的数量。推荐设置bnum为预计存储总记录数的0.5~4倍，使key的哈希分布更均匀，减少在bucket内二分查找的时间复杂度。</p>
<p>　　如果存储的.tch“数据库文件大小”&lt;=“MMAP内存大小”，TCHDB哈希数据库是个不错的选择。TCHDB查找速度非常快，但是对内存的要求相对较高。</p>
<p>　　实例：Tokyo Tyrant 的哈希数据库，优化参数如下，bnum设置为2000万条，xmsiz设置为1GB：</p>
<p>　　ttserver -host 10.19.1.195 -port 11211 -thnum 4 -dmn -pid /data0/ttserver/ttserver.pid -log /data0/ttserver/ttserver.log -le -ulog /data0/ttserver/ -ulim 128m -sid 195 -rts /data0/ttserver/ttserver.rts /data0/ttserver/database.tch#bnum=20000000#xmsiz= 1073741824</p>
<p><img src="http://image4.it168.com/2010/4/19/802a7f06-42f5-4c1a-a7ff-0f6c337d379e.jpg" alt="" /></p>
<p>图：TCHDB bucket array</p>
<p>　　做个测试：写入100万条：tcbtest write test.tcb 1000000，时间: 0.994秒 速度：1006036条/秒;写入200万条：tcbtest write test.tcb 2000000，时间: 2.028秒 速度： 986193条/秒;写入500万条：tcbtest write test.tcb 5000000，时间: 5.276秒 速度： 947687条/秒。</p>
<p>　　从测试来看，TCBDB写入速度虽然比TCHDB低45%左右，但可以看出，写入500万条数据时，B+Tree的写入速度保持稳定。</p>
<p>　　修改参数后，再测试：写入100万条： tcbtest write test.tcb 1000000 1024 2048 5000000，时间: 0.981秒 速度： 1019367条/秒;写入200万条： tcbtest write test.tcb 2000000 1024 2048 5000000，时间: 1.856秒 速度： 1077586条/秒;写入500万条： tcbtest write test.tcb 5000000 1024 2048 5000000，时间: 4.448秒 速度： 1124101条/秒。</p>
<p>　　TCBDB没有开启xmsiz扩展MMAP内存，写入大量数据时，速度仍然能够得以保证。</p>
<p>　　性能微调参数(C API)：</p>
<p>　　bool tcbdbtune(TCBDB *bdb, int32_t lmemb, int32_t nmemb, int64_t bnum, int8_t apow, int8_t fpow, uint8_t opts);</p>
<p>　　lmemb 用于指定被缓存的页级节点数</p>
<p>　　nmemb 用于指定被缓存的非页级节点数，通常为页级节点数的两倍</p>
<p>　　bnum 用于指定bucket array的数量。bnum的数量应该大于存储总记录数的1/128。</p>
<p>　　TCBDB(查找的时间复杂度为“O(log n)”)虽然速度比TCHDB (查找的时间复杂度为“O(1)”)慢一些，但是，它对内存的依赖度要比TCHDB小得多，随着数据量增大，写入速度也稳定，适合存储大量数据。</p>
<p>　　生产环境，我们存储7GB的数据， TCBDB只使用了160M的内存缓存，而TCHDB则需要设置7GB xmsiz内存才能保证速度。</p>
<p>　　实例：Tokyo Tyrant 的B+Tree数据库，优化参数如下：</p>
<p>　　ttserver -host 10.19.1.195 -port 11211 -thnum 4 -dmn -pid /data0/ttserver/ttserver.pid -log /data0/ttserver/ttserver.log -le -ulog /data0/ttserver/ -ulim 128m -sid 195 -rts /data0/ttserver/ttserver.rts /data0/ttserver/database.tcb#lmemb=1024#nmemb=2048#bnum=20000000</p>
<p><img src="http://image4.it168.com/2010/4/19/33ceddbd-a1a2-4d32-a711-1787ee557909.jpg" alt="" /></p>
<p>图：TCBDB B tree index</p>
<p>　　参数设置(C API)：</p>
<p>　　bool tcfdbtune(TCFDB *fdb, int32_t width, int64_t limsiz);</p>
<p>　　width用于设置每条记录的长度(字节数);</p>
<p>　　limsiz用于设置总长度(字节数)，存储的总数据字节数不能超过limsiz设定的值。</p>
<p>　　TCFDB定长数据库读写速度快，但是存储的数据量有限。数据库文件必须在内存中完全映射。</p>
<p><img src="http://image4.it168.com/2010/4/19/0785bceb-99b2-4e28-82d9-7cc045678bf6.jpg" alt="" /></p>
<p>图：TCFDB Array</p>
<p>　　TCTDB是在 TCHDB哈希数据库的基础上，对 value 部分做的增强，因此，性能优化参数跟TCHDB类似。</p>
<p>　　TCTDB中，key相当于关系型数据库中的主键ID，name相当于字段名，value相当于字段值。</p>
<p><img src="http://image4.it168.com/2010/4/19/0a199d23-2e28-418d-94ff-31923700fb69.jpg" alt="" /></p>
<p><img src="http://image4.it168.com/2010/4/19/74d45eb2-546f-49b2-a6b2-74d66892fedf.jpg" alt="" /></p>
<p>图：TCTDB bucket array</p>
<p>　　1、可以根据“字段”检索出符合条件的key(C API)：</p>
<p>　　void tctdbqryaddcond(TDBQRY *qry, const char *name, int op, const char *expr);</p>
<p>　　Name即字段名，op代表操作类型，expr为操作对象。</p>
<p>　　Op操作类型可以分为两类：字符型运算和数值型运算。</p>
<p>　　<strong>数值型运算符：</strong></p>
<p>　　NUMEQ：表示等于操作对象的数值(=)。</p>
<p>　　NUMGT：表示比操作对象的数值要大(&gt;)。</p>
<p>　　NUMGE：表大于或等于操作对象的数值(&gt;=)。</p>
<p>　　NUMLT：表示比操作对象的数值要小(&lt;)。</p>
<p>　　NUMLE：表示小于或等于操作对象的数值(&lt;=)。</p>
<p>　　NUMBT：表示其大小处于操作对象文字段中被逗号分开的两个数值的中间(between 100 and 200)。</p>
<p>　　NUMOREQ：表示同操作对象文字段中被逗号分开的多个数值中的其中一个是相同的( IN (100,200,278)) 。</p>
<p>　　<strong>文本型运算符：</strong></p>
<p>　　STREQ：表示与操作对象的文字内容完全相同(=)。</p>
<p>　　STRINC：表示含有操作对象文字的内容(LIKE ‘%文字%’)。</p>
<p>　　STRBW：表示以操作对象的文字行列开始(LIKE ‘文字%’)。</p>
<p>　　STREW：表示到操作对象的文字行列结束(LIKE ‘%文字’) 。</p>
<p>　　STRAND：表示包含操作对象的文字行列中右逗号分开部分的字段的全部(name LIKE ‘%文字㈠%’ AND name LIKE ‘%文字㈡%’)。</p>
<p>　　STROR：表示包含操作对象文字段中逗号分开部分的其中一部分(name LIKE ‘%文字㈠%’ OR name LIKE ‘%文字㈡%’) 。</p>
<p>　　STROREQ：表示与操作对象文字段中逗号分开部分的其中某部分完全相同( name = ‘文字㈠’ OR name =‘文字㈡’ )。</p>
<p>　　2、可以对“字段”建立索引，支持UTF-8全文检索(C API)：</p>
<p>　　bool tctdbsetindex(TCTDB *tdb, const char *name, int type);</p>
<p>　　type为索引类型，值如下：</p>
<p>　　TDBITLEXICAL：创建文本型索引</p>
<p>　　TDBITDECIMAL：创建数值型索引</p>
<p>　　TDBITTOKEN：创建标记倒排索引</p>
<p>　　TDBITQGRAM：创建q-gram倒排索引</p>
<p>　　TDBITOPT：优化索引</p>
<p>　　TDBITVOID：删除索引</p>
<p>　　<img src="http://image4.it168.com/2010/4/19/4571b55e-baa8-406e-a032-19c59ae4381c.jpg" alt="" width="374" height="275" /></p>
<p>　　3、支持按“字段”排序(C API)：</p>
<p>　　void tctdbqrysetorder(TDBQRY *qry, const char *name, int type);</p>
<p>　　type为排序类型，值如下：</p>
<p>　　STRASC：表示按照文本型字段内的文本内容在字典中排列顺序的升序。</p>
<p>　　STRDESC：表示按照文本型字段内的文本内容在字典中排列顺序的降序。</p>
<p>　　NUMASC：表示按照数值大小的升序。</p>
<p>　　NUMDESC：表示按照数值大小的降序。</p>
<p>　　4、支持检索结果数量限制(C API)：</p>
<p>　　void tctdbqrysetlimit(TDBQRY *qry, int max, int skip);</p>
<p>　　相当于SQL语句中的“limit skip, max”</p>
<p>　　<strong>TCTDB表格型数据库的不足之处：</strong></p>
<p>　　1、功能的增强，也就意味着要牺牲一些性能。TCTDB表格型数据库的平均读取速度大约在40万条/秒，相比TCHDB哈希数据库的180万条/秒和TCBDB B+Tree数据库的100万条/秒要慢一些。</p>
<p>　　2、TCTDB虽然可以建立数值型索引，但是它是将所有value数据都当成字符型来处理的，无法区分value类型。</p>
<p>　　3、TCTDB单数据库文件存储的记录数上亿条后，性能会有比较明显的下降。</p>
<p>　　4、没有可扩展的能力，如果单机无法满足要求，只能通过主从复制的方式扩展。</p>
<p>　　5、UPDATE更新方式效率低。</p>
<p>　　TCSQL是金山逍遥网在Tokyo Cabinet TCTDB的基础上，结合Key-Value对象缓存，借鉴SQL语句的SELECT、INSERT、UPDATE、DELETE思想与功能开发的分布式实时列表缓存数据库，可实现对列表页数据、记录条数的实时缓存。</p>
<p>　　TCSQL采用HTTP GET/POST协议+JSON数据交换格式在客户端、<a title="服务器" href="http://server.it168.com/" target="_blank">服务器</a>端之间进行数据交互。</p>
<p>　　TCSQL实时列表缓存数据库单机能够支撑1万以上的并发连接。1万并发连接下，QPS(每秒查询率)能够达到8000～15000次。</p>
<p>　　TCSQL拥有了MySQL数据库单表具备的大部分功能。</p>
<p>　　TCSQL的select查询示例：</p>
<p>　　curl “http://127.0.0.1:3888/?command=select&amp;type=*&amp;where=pkey:NUMGE:0|title:STRINC:keyword&amp;order_by=pkey&amp;order_sort=NUMDESC&amp;limit_skip=0&amp;limit_max=10”</p>
<p>　　等同于MySQL的SQL查询语句：</p>
<p>　　SELECT * FROM table WHERE pkey &gt;= 0 AND title LIKE ‘%keyword%’ ORDER BY pkey DESC LIMIT 0,10;跟MySQL的LIKE全表扫描不同的是，TCSQL支持创建倒排索引，STRINC使用的是全文检索。</p>
<p>　　通过PHP Client操作TCSQL：&lt;!–p</p>
<div id="div_code">
<div>　　$tcsql = new Tcsql(); </div>
<p>　　//INSERT插入</p>
<p>　　$result = $tcsql-&gt;insert($server_host, $server_port, $array_data);</p>
<p>　　//SELECT查询</p>
<p>　　$result = $tcsql-&gt;select($server_host, $server_port, “type=*&amp;where=uid: NUMOREQ:1,7,29,43&amp;order_by=pkey&amp;order_by=NUMDESC&amp;limit_skip=0&amp;limit_max=10“);</p>
<p>　　//UPDATE更新</p>
<p>　　$result = $tcsql-&gt;update($server_host, $server_port, $array_data, “where=name:STREQ:张三|sex:NUMEQ:1“);</p>
<p>　　//DELETE删除</p>
<p>　　$result = $tcsql-&gt;delete($server_host, $server_port, $array_data, “where=uid:NUMEQ:5“);</p>
</div>
<p> </p>
<p>　　1、刚才已经提到，TCTDB表格型数据库的读取性能相对于TCHDB哈希数据库、TCBDB B+Tree数据库而言，要低许多。</p>
<p>　　2、TCSQL采用内存热点记录缓存、TCBDB B+Tree数据库永久缓存相结合的方式，将TCTDB的读取性能提升了两倍。TCTDB中的一条Key-Value数据只要一次被读取，就会永久缓存，直到更新、删除该记录时，才会删除缓存内容。</p>
<p>　　<img src="http://image4.it168.com/2010/4/20/06572bdc-6381-470c-9836-70dbfd6039f7.jpg" alt="" width="500" height="463" /></p>
<p>　　TCSQL的内存缓存、TCBDB B+Tree数据库联合缓存机制命中率非常高，比如按照时间倒叙显示50条记录，第一次查询就会将记录数据缓存在内存中，如果第二次查询时已经新增了3条记录(或者修改了3条记录)，第二次查询只会从TCTDB表格型数据库中取出3条记录，剩余47条从内存缓存或TCBDB中取出，大大加快了读取速度。</p>
<p>　　1、针对TCTDB无法区分value类型的问题，TCSQL增加了对字段设置数据类型的功能，它支持JSON所拥有的6种数据类型：</p>
<p>　　<img src="http://image4.it168.com/2010/4/20/f57f0773-f5c6-4d14-aa9a-6db34b5200cb.jpg" alt="" width="551" height="262" /></p>
<p>图：TCSQL支持的六种数据类型</p>
<p>　　一个PHP的数组，经过json_encode()后，写入TCSQL后再读取出来，数组类型仍然能够保持原样不变：&lt;!–p</p>
<p>　　$array_data['uid'] = 1234;</p>
<p>　　$array_data['ip'] = ‘192.168.138.1′;</p>
<p>　　$array_data['passport'] = ‘kingsoft’;</p>
<p>　　$array_data[‘nickname’] = ‘测试账号’;</p>
<p>　　$array_data[‘num1'] = 5996273.9334;</p>
<p>　　$array_data[‘num2'] = -123456789012345;</p>
<p>　　$array_data['u1'] = True;</p>
<p>　　$array_data['u2'] = array(”aaa”, “bbb”, “ccc”);</p>
<p>　　$array_data['u3'] = null;</p>
<p>　　$array_data['u4'][‘test'] = array(”aaa”, “bbb”, “ccc”);</p>
<p>　　$json_data = json_encode($array_data); //准备写入到TCSQL的数据</p>
<p>　　1、TCSQL采用分片、并行计算的结构，解决了TCTDB单数据库文件存储的记录数上亿条后，性能会明显下降的不足之处。</p>
<p>　　2、TCSQL增强了TCTDB的可扩展能力。</p>
<p>　　3、适合解决Web 2.0应用中单表数据量无限增大的问题。</p>
<p><img src="http://image4.it168.com/2010/4/20/892ebc15-bbcd-42e7-b6e2-44680408d4b5.jpg" alt="" /></p>
<p>图：TCSQL的分片、分布式并行查询过程</p>
<p>　　借助MySQL触发器，以及为MySQL 5.1 编写的扩展插件函数，来让TCSQL当MySQL的从库：</p>
<p>　　json_object()、 urlencode()、http_post()</p>
<p>　　接下来是一个示例：通过MySQL命令行连接到MySQL<a title="服务器" href="http://product.it168.com/list/b/0402_1.shtml" target="_blank">服务器</a>，执行以下SQL，对sns_feed表创建三个MySQL触发器：sns_feed_insert、sns_feed_update、sns_feed_delete，当MySQL的sns_feed表发生增、删、改操作时，自动将修改的记录内容通过HTTP POST到TCSQL数据库(192.168.8.34:3888)。</p>
<p>　　<strong>TCSQL“从库”Insert触发器</strong></p>
<div id="div_code">
<div>　　DELIMITER | </div>
<p>　　DROP TRIGGER IF EXISTS sns_feed_insert;</p>
<p>　　CREATE TRIGGER sns_feed_insert</p>
<p>　　AFTER INSERT ON sns_feed</p>
<p>　　FOR EACH ROW BEGIN</p>
<p>　　SET @tcsql_result_json = (SELECT json_object(feedid as pkey,appid,icon,uid,username,dateline,friend,hash_template,hash_data,title_template,title_data,body_template,body_data,body_general,image_1,image_1_link,image_2,image_2_link,image_3,image_3_link,image_4,image_4_link,target_ids,id,idtype,hot) FROM sns_feed WHERE feedid = NEW.feedid limit 1);</p>
<p>　　SET @tcsql_result_eval = (SELECT http_post(‘192.168.8.34′, ‘3888′, ‘command=insert’, urlencode(@tcsql_result_json)));</p>
<p>　　END |</p>
<p>　　DELIMITER ;</p>
</div>
<p>　　<strong>TCSQL“从库”update触发器</strong></p>
<div id="div_code">
<div>　　DELIMITER | </div>
<p>　　DROP TRIGGER IF EXISTS sns_feed_update;</p>
<p>　　CREATE TRIGGER sns_feed_update</p>
<p>　　AFTER UPDATE ON sns_feed</p>
<p>　　FOR EACH ROW BEGIN</p>
<p>　　SET @tcsql_result_json = (SELECT json_object(feedid as pkey,appid,icon,uid,username,dateline,friend,hash_template,hash_data,title_template,title_data,body_template,body_data,body_general,image_1,image_1_link,image_2,image_2_link,image_3,image_3_link,image_4,image_4_link,target_ids,id,idtype,hot) FROM sns_feed WHERE feedid = OLD.feedid limit 1);</p>
<p>　　SET @tcsql_result_eval = (SELECT http_post(‘192.168.8.34′, ‘3888′, ‘command=insert’, urlencode(@tcsql_result_json)));</p>
<p>　　END |</p>
<p>　　DELIMITER ;</p>
</div>
<p>　　<strong>TCSQL“从库”delete触发器</strong></p>
<div id="div_code">
<div>　　DELIMITER | </div>
<p>　　DROP TRIGGER IF EXISTS sns_feed_delete;</p>
<p>　　CREATE TRIGGER sns_feed_delete</p>
<p>　　AFTER DELETE ON sns_feed</p>
<p>　　FOR EACH ROW BEGIN</p>
<p>　　SET @tcsql_result_eval = (SELECT http_post(‘192.168.8.34′, ‘3888′, concat(’command=delete&amp;where=pkey:NUMEQ:’, OLD.feedid), ”));</p>
<p>　　END |</p>
<p>　　DELIMITER ;</p>
</div>
<p>　　<strong>TCSQL的数据update更新优化</strong></p>
<p>　　TCTDB+Tokyo Tyrant时，如果只更新一条记录中的某个字段的值，PHP客户端需要先读回Tokyo Tyrant中该记录的全部字段内容到一个PHP数组，再修改此数组中该字段的值，最后再将该数组写回Tokyo Tyrant ，来回通过网络传输记录全部字段内容，速度慢、效率低。</p>
<p>　　TCSQL可以对部分字段内容进行更新，在TCSQL内部处理完成修改操作，没有不必要的TCP传输。</p>
<p>　<strong>　一般数据库缓存分为四种：</strong></p>
<p>　　1、Key/Value单个对象缓存，技术不难，Memcached、Squid均能实现。</p>
<p>　　2、列表缓存，就像论坛里帖子的列表、SNS中的Feed信息，要求实时更新。</p>
<p>　　3、记录条数的缓存，比如一个论坛板块里有多少个帖子，这样才方便实现分页。</p>
<p>　　4、复杂一点的group，sum，count查询，比如一个论坛里按点击数排名的最HOT的帖子列表。</p>
<p>　　TCSQL主要用于解决上页提到的第2、3类应用，即带条件的列表页、列表页记录数的实时缓存。</p>
<p>　　TCSQL在金山逍遥网的典型应用：</p>
<p>　　游戏论坛：原版Discuz!论坛使用的MySQL内存表存放Session，在线5万人的时候，大量的并发update操作导致内存表锁死。后改用TCSQL，轻松解决了这个问题。从MySQL改为TCSQL，迁移成本也非常低。</p>
<p>　　SNS社区：Feed信息采用从MySQL同步到TCSQL的方式，利用TCSQL来解决好友动态的查询压力。</p>
<p>　　用户行为分析：需要按UID、通行证、昵称、时间等条件查询基础用户信息表，采用TCSQL来存储超过2亿条数据，每次页面访问将有一次select查询。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fabrichina.net/archives/390/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
