<?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>超群.com的博客 &#187; PHP</title>
	<atom:link href="http://www.fuchaoqun.com/tag/php/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.fuchaoqun.com</link>
	<description></description>
	<lastBuildDate>Thu, 22 Jul 2010 23:31:23 +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>PHP导出MySQL数据到Excel文件</title>
		<link>http://www.fuchaoqun.com/2010/05/php-export-mysql-excel/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-export-mysql-excel</link>
		<comments>http://www.fuchaoqun.com/2010/05/php-export-mysql-excel/#comments</comments>
		<pubDate>Wed, 12 May 2010 01:37:07 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[excel]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=352</guid>
		<description><![CDATA[经常会碰到需要从数据库中导出数据到Excel文件，用一些开源的类库，比如PHPExcel，确实比较容易实现，但对大量数据的支持很不好，很容易到达PHP内存使用上限。这里的方法是利用fputcsv写CSV文件的方法，直接向浏览器输出Excel文件。 &#60;?php // 输出Excel文件头，可把user.csv换成你要的文件名 header&#40;'Content-Type: application/vnd.ms-excel'&#41;; header&#40;'Content-Disposition: attachment;filename=&#34;user.csv&#34;'&#41;; header&#40;'Cache-Control: max-age=0'&#41;; &#160; // 从数据库中获取数据，为了节省内存，不要把数据一次性读到内存，从句柄中一行一行读即可 $sql = 'select * from tbl where ……'; $stmt = $db-&#62;query&#40;$sql&#41;; &#160; // 打开PHP文件句柄，php://output 表示直接输出到浏览器 $fp = fopen&#40;'php://output', 'a'&#41;; &#160; // 输出Excel列名信息 $head = array&#40;'姓名', '性别', '年龄', 'Email', '电话', '……'&#41;; foreach &#40;$head as $i =&#62; $v&#41; &#123; // CSV的Excel支持GBK编码，一定要转换，否则乱码 $head&#91;$i&#93; = iconv&#40;'utf-8', [...]]]></description>
			<content:encoded><![CDATA[<p>经常会碰到需要从数据库中导出数据到Excel文件，用一些开源的类库，比如<a href="http://phpexcel.codeplex.com/" target="_blank">PHPExcel</a>，确实比较容易实现，但对大量数据的支持很不好，很容易到达PHP内存使用上限。这里的方法是利用fputcsv写CSV文件的方法，直接向浏览器输出Excel文件。</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// 输出Excel文件头，可把user.csv换成你要的文件名</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-Type: application/vnd.ms-excel'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-Disposition: attachment;filename=&quot;user.csv&quot;'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Cache-Control: max-age=0'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 从数据库中获取数据，为了节省内存，不要把数据一次性读到内存，从句柄中一行一行读即可</span>
<span style="color: #000088;">$sql</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'select * from tbl where ……'</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$stmt</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$sql</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 打开PHP文件句柄，php://output 表示直接输出到浏览器</span>
<span style="color: #000088;">$fp</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'php://output'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'a'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 输出Excel列名信息</span>
<span style="color: #000088;">$head</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'姓名'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'性别'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'年龄'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'Email'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'电话'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'……'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$head</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #666666; font-style: italic;">// CSV的Excel支持GBK编码，一定要转换，否则乱码</span>
    <span style="color: #000088;">$head</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">iconv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'utf-8'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'gbk'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 将数据通过fputcsv写到文件句柄</span>
<span style="color: #990000;">fputcsv</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #000088;">$head</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 计数器</span>
<span style="color: #000088;">$cnt</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// 每隔$limit行，刷新一下输出buffer，不要太大，也不要太小</span>
<span style="color: #000088;">$limit</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">100000</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;">// 逐行取出数据，不浪费内存</span>
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$stmt</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch</span><span style="color: #009900;">&#40;</span>Zend_Db<span style="color: #339933;">::</span><span style="color: #004000;">FETCH_NUM</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
&nbsp;
    <span style="color: #000088;">$cnt</span> <span style="color: #339933;">++;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$limit</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$cnt</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> <span style="color: #666666; font-style: italic;">//刷新一下输出buffer，防止由于数据过多造成问题</span>
        <span style="color: #990000;">ob_flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$cnt</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$i</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">iconv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'utf-8'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'gbk'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$v</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #990000;">fputcsv</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>简单易用，非常节省内存，不依赖第三方类库。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2010/05/php-export-mysql-excel/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP处理Etag、lastModified和Expires</title>
		<link>http://www.fuchaoqun.com/2009/09/php_etag_lastmodified_expires/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php_etag_lastmodified_expires</link>
		<comments>http://www.fuchaoqun.com/2009/09/php_etag_lastmodified_expires/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 13:40:12 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Etag]]></category>
		<category><![CDATA[Expires]]></category>
		<category><![CDATA[lastModified]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=237</guid>
		<description><![CDATA[之前看到robbin基于资源的HTTP Cache的实现介绍，想到这是一个很有意思的功能，原理很简单，但很多人都会忽略，于是乎打算集成到ColaPHP框架中来，让浏览器缓存动态内容，对于一些由动态脚本生成、更新不频繁但又会被用户重复访问的页面内容，还是很有意义的。 如果在服务器端设置了Etag、lastModified和Expires之后，下次再访问同一资源的时候，一个典型的HTTP头是这样的： Host            127.0.0.1 User-Agent        Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 QQDownload/1.7 Accept            text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language        zh-cn,zh;q=0.5 Accept-Encoding        gzip,deflate Accept-Charset        GB2312,utf-8;q=0.7,*;q=0.7 Keep-Alive        300 Connection        keep-alive If-Modified-Since    Sat, 05 Sep 2009 12:44:56 GMT If-None-Match        foobar Cache-Control        max-age=0 关于lastModified、Etag和Expires的工作原理，可以参看http://longrujun.name/index.php/2009/03/04/etag%E5%92%8Cexpires/，简单来说： lastModified：设定一个最后修改时间，浏览器下次访问的时候，发送一个&#8221;If-Modified-Sinc&#8221;的头信息，如果内容在这个时间之后没有更新，服务器直接返回一个304 Not [...]]]></description>
			<content:encoded><![CDATA[<p>之前看到robbin<a href="http://robbin.javaeye.com/blog/462476" target="_blank">基于资源的HTTP Cache的实现介绍</a>，想到这是一个很有意思的功能，原理很简单，但很多人都会忽略，于是乎打算集成到<a href="http://code.google.com/p/colaphp/" target="_blank">ColaPHP</a>框架中来，让浏览器缓存动态内容，对于一些由动态脚本生成、更新不频繁但又会被用户重复访问的页面内容，还是很有意义的。</p>
<p>如果在服务器端设置了Etag、lastModified和Expires之后，下次再访问同一资源的时候，一个典型的HTTP头是这样的：</p>
<pre>Host            127.0.0.1
User-Agent        Mozilla/5.0 (Windows; U; Windows NT 5.1; zh-CN; rv:1.9.1.2) Gecko/20090729 Firefox/3.5.2 QQDownload/1.7
Accept            text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language        zh-cn,zh;q=0.5
Accept-Encoding        gzip,deflate
Accept-Charset        GB2312,utf-8;q=0.7,*;q=0.7
Keep-Alive        300
Connection        keep-alive
If-Modified-Since    Sat, 05 Sep 2009 12:44:56 GMT
If-None-Match        foobar
Cache-Control        max-age=0</pre>
<p>关于lastModified、Etag和Expires的工作原理，可以参看<a href="http://longrujun.name/index.php/2009/03/04/etag%E5%92%8Cexpires/" target="_blank">http://longrujun.name/index.php/2009/03/04/etag%E5%92%8Cexpires/</a>，简单来说：</p>
<p><strong>lastModified</strong>：设定一个最后修改时间，浏览器下次访问的时候，发送一个&#8221;If-Modified-Sinc&#8221;的头信息，如果内容在这个时间之后没有更新，服务器直接返回一个304 Not Modified而不传输详细内容，可以节省带宽。</p>
<p><strong>Etag</strong>：设定一个标记，浏览器下次访问时，发送一个&#8221;If-None-Match&#8221;的头信息，如果服务器内容还是这个标记没变，也直接返回一个304 Not Modified而不传输详细内容，同样可以节省带宽。</p>
<p><strong>Expires</strong>：设定一个过期时间，如果当前请求在这个过期时间之类，则<strong>不发送HTTP请求</strong>，不仅可以节约服务器带宽，还可以<strong>减少服务器HTTP请求数</strong>。</p>
<p>主要通过header函数来发送，比较简单，直接上代码：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> etag<span style="color: #009900;">&#40;</span><span style="color: #000088;">$etag</span><span style="color: #339933;">,</span> <span style="color: #000088;">$notModifiedExit</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$notModifiedExit</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_IF_NONE_MATCH'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$etag</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_IF_NONE_MATCH'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">statusCode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'304'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Etag: '</span> <span style="color: #339933;">.</span> <span style="color: #000088;">$etag</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> lastModified<span style="color: #009900;">&#40;</span><span style="color: #000088;">$modifiedTime</span><span style="color: #339933;">,</span> <span style="color: #000088;">$notModifiedExit</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$modifiedTime</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'D, d M Y H:i:s'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$modifiedTime</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' GMT'</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$notModifiedExit</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_IF_MODIFIED_SINCE'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">&amp;&amp;</span> <span style="color: #000088;">$modifiedTime</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$_SERVER</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'HTTP_IF_MODIFIED_SINCE'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">self</span><span style="color: #339933;">::</span><span style="color: #004000;">statusCode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'304'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Last-Modified: <span style="color: #006699; font-weight: bold;">$modifiedTime</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> static <span style="color: #000000; font-weight: bold;">function</span> expires<span style="color: #009900;">&#40;</span><span style="color: #000088;">$seconds</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1800</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000088;">$time</span> <span style="color: #339933;">=</span> <span style="color: #990000;">date</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'D, d M Y H:i:s'</span><span style="color: #339933;">,</span> <span style="color: #990000;">time</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$seconds</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">' GMT'</span><span style="color: #339933;">;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Expires: <span style="color: #006699; font-weight: bold;">$time</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>如果你是用<a href="http://code.google.com/p/colaphp/" target="_blank">ColaPHP</a>，可以直接在controller里面写上：</p>

<div class="wp_syntax"><div class="code"><pre class="php" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">// 设定最后修改时间，通常是数据库中内容修改时间</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">lastModified</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1252154696</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// 设定内容标记，自己可以按照一定的规则来生成，当然也可以用内容最后修改的时间戳</span>
 <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">helper</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">etag</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'foobar'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #666666; font-style: italic;">// 设定失效时间</span>
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">expires</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">10</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>PS：ColaPHP近期发0.3alpha，主要改进Model和DB设计，加入了一下小功能（比如验证码），以及bugfix。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/09/php_etag_lastmodified_expires/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ColaPHP-0.1-alpha发布</title>
		<link>http://www.fuchaoqun.com/2009/06/colaphp-01-alpha/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=colaphp-01-alpha</link>
		<comments>http://www.fuchaoqun.com/2009/06/colaphp-01-alpha/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 11:25:43 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[ColaPHP]]></category>
		<category><![CDATA[framework]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=227</guid>
		<description><![CDATA[非常简陋的一个PHP框架，只是把架子搭起来了，地址：http://code.google.com/p/colaphp/ 现在PHP框架已经很多了，为什么还要去&#8221;重复的发明轮子&#8221;？ 你和我一样不想重新学习一门&#8221;框架语言&#8221; 你和我一样希望规范的MVC开发 你和我一样希望一个高性能的框架 你和我一样不希望改变已有的PHP开发方式 现在，ColaPHP还很不成熟，暂且当做一个&#8221;玩具&#8221;试试，有兴趣的可以阅读一下代码，品味好的代码和指出坏味道的代码都是一个好的过程。 文档方面现在还很不全，我希望只用一个Tutorial就能讲明白，以后也不会有别的新的文档（文档越多，表明系统越复杂，学习成本也越高），当然，Tutorial会是一个持续完善的过程。 ColaPHP是写给PHP程序员的一个框架，信奉KISS的同学可以试试。]]></description>
			<content:encoded><![CDATA[<p>非常简陋的一个PHP框架，只是把架子搭起来了，地址：<a href="http://code.google.com/p/colaphp/" target="_blank">http://code.google.com/p/colaphp/</a></p>
<p>现在PHP框架已经很多了，为什么还要去&#8221;重复的发明轮子&#8221;？</p>
<ul>
<li>你和我一样不想重新学习一门&#8221;框架语言&#8221;</li>
<li>你和我一样希望规范的MVC开发</li>
<li>你和我一样希望一个高性能的框架</li>
<li>你和我一样不希望改变已有的PHP开发方式</li>
</ul>
<p>现在，ColaPHP还很不成熟，暂且当做一个&#8221;玩具&#8221;试试，有兴趣的可以阅读一下代码，品味好的代码和指出坏味道的代码都是一个好的过程。</p>
<p>文档方面现在还很不全，我希望只用一个<a href="http://code.google.com/p/colaphp/wiki/Tutorial_ZH_CN" target="_blank">Tutorial</a>就能讲明白，以后也不会有别的新的文档（文档越多，表明系统越复杂，学习成本也越高），当然，Tutorial会是一个持续完善的过程。</p>
<p>ColaPHP是写给PHP程序员的一个框架，信奉KISS的同学可以<a href="http://colaphp.googlecode.com/files/ColaPHP-0.1-alpha.zip" target="_blank">试试</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/06/colaphp-01-alpha/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>PHP SESSION解惑</title>
		<link>http://www.fuchaoqun.com/2009/02/php-session-confuse/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=php-session-confuse</link>
		<comments>http://www.fuchaoqun.com/2009/02/php-session-confuse/#comments</comments>
		<pubDate>Fri, 27 Feb 2009 18:38:14 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[session]]></category>

		<guid isPermaLink="false">http://chaoqun.17348.com/?p=171</guid>
		<description><![CDATA[一、PHP SESSION原理 我们知道，session是在服务器端保持用户会话数据的一种方法，对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议，服务器响应完之后就失去了与浏览器的联系，最早，Netscape将cookie引入浏览器，使得数据可以客户端跨页面交换，那么服务器是如何记住众多用户的会话数据呢？ 首先要将客户端和服务器端建立一一联系，每个客户端都得有一个唯一标识，这样服务器才能识别出来。建议唯一标识的方法有两种：cookie或者通过GET方式指定。默认配置的PHP使用session的时会建立一个名叫&#8221;PHPSESSID&#8221;的cookie（可以通过php.ini修改session.name值指定），如果客户端禁用cookie,你也可以指定通过GET方式把session id传到服务器（修改php.ini中session.use_trans_sid等参数）。 我们查看服务器端session.save_path目录会发现很多类似sess_vv9lpgf0nmkurgvkba1vbvj915这样的文件，这个其实就是session id &#8220;vv9lpgf0nmkurgvkba1vbvj915&#8243;对应的数据。 真相就在这里，服务器将session id传递到服务器，服务器根据session id找到对应的文件，读取的时候对文件内容进行反序列化就得到session的值，保存的时候先序列化再写入。 事实就是这样，所以如果服务器不支持session或者你想自定义session，完全可以DIY，通过PHP的uniqid生成永不重复的session id，然后找个地方存储session的内容即可，你也可以学flickr把session存储在MySQL数据库中。 二、使用session之前为什么必须先执行session_start()？ 了解的原理之后，所谓的session其实就是客户端一个session id服务器端一个session file，新建session之前执行session_start()是告诉服务器要种一个cookie以及准备好session文件，要不然你的session内容怎么存；读取session之前执行session_start()是告诉服务器，赶紧根据session id把session文件反序列化。 只有一个session函数可以在session_start()之前执行，session_nam()：读取或指定session名称（比如默认的就是&#8221;PHPSESSID&#8221;），这个当然要在session_start之前执行。 三、session影响系统性能 session在大访问量网站上确实影响系统性能，影响性能的原因之一由文件系统设计造成，在同一个目录下超过10000个文件时，文件的定位将非常耗时，PHP支持session目录hash，我们可以通过修改php.ini中session.save_path = &#8220;2;/path/to/session/dir&#8221;，那么session将存储在两级子目录中（修订：参见david回复），不过好像PHP session不支持创建目录，你需要事先把那么些目录创建好 。 还有一个问题就是小文件的效率问题，一般我们的session数据都不会太大（1～2K），如果有大量这样1～2K的文件在磁盘上，IO效率肯定会很差，PHP手册上建议使用Reiserfs文件系统，不过Reiserfs的前景堪忧，Reiserfs的作者把媳妇给杀了，SuSE也抛弃了Reiserfs。 其实还有很多中存储session的方式，可以通过php -i&#124;grep &#8220;Registered save handlers&#8221;查看，比如Registered save handlers =&#62; files user sqlite eaccelerator可以通过文件、用户、sqlite、eaccelerator来存，如果服务器装了memcached，还有会mmcache的选项。当然还有很多，比如MySQL、PostgreSQL等等。都是不错的选择。 四、session的同步 我们前端可能有很多台服务器，用户在A服务器上登录了，种下了session信息，然后访问网站的某些页面没准跳到B服务器上去了，如果这个时候B服务器上没有session信息又没有做特殊处理，可能就会出问题了。 session同步有很多种，如果你是存储在memcached或者MySQL中，那就很容易了，指定到同样的位置即可，如果是文件形式的，你可以用NFS统一存储。 还有一种方式是通过加密的cookie来实现，用户在A服务器上登录成功，在用户的浏览器上种上一个加密的cookie，当用户访问B服务器时，检查有无session，如果有当然没问题，如果没有，就去检验cookie是否有效，cookie有效的话就在B服务器上重建session。这种方法其实很有用，如果网站有很多个子频道，服务器也不在一个机房，session没办法同步又想做统一登录那就太有用了。 当然还有一种方法就是在负载均衡那一层保持会话，把访问者帮定在某个服务器上，他的所有访问都在那个服务器上就不需要session同步了，这些都是运维层面的东西。 就说这么多吧，根据自己的应用来选择使用session，不要因为大家都说session影响系统性能就畏首畏尾，知道问题，解决问题才是关键，惹不起躲得起不适合这里。]]></description>
			<content:encoded><![CDATA[<p>一、PHP SESSION原理</p>
<p>我们知道，session是在服务器端保持用户会话数据的一种方法，对应的cookie是在客户端保持用户数据。HTTP协议是一种无状态协议，服务器响应完之后就失去了与浏览器的联系，最早，Netscape将cookie引入浏览器，使得数据可以客户端跨页面交换，那么服务器是如何记住众多用户的会话数据呢？</p>
<p>首先要将客户端和服务器端建立一一联系，每个客户端都得有一个唯一标识，这样服务器才能识别出来。建议唯一标识的方法有两种：cookie或者通过GET方式指定。默认配置的PHP使用session的时会建立一个名叫&#8221;PHPSESSID&#8221;的cookie（可以通过php.ini修改session.name值指定），如果客户端禁用cookie,你也可以指定通过GET方式把session id传到服务器（修改php.ini中session.use_trans_sid等参数）。</p>
<p>我们查看服务器端session.save_path目录会发现很多类似sess_vv9lpgf0nmkurgvkba1vbvj915这样的文件，这个其实就是session id &#8220;vv9lpgf0nmkurgvkba1vbvj915&#8243;对应的数据。</p>
<p>真相就在这里，服务器将session id传递到服务器，服务器根据session id找到对应的文件，读取的时候对文件内容进行反序列化就得到session的值，保存的时候先序列化再写入。</p>
<p>事实就是这样，所以如果服务器不支持session或者你想自定义session，完全可以DIY，通过PHP的uniqid生成永不重复的session id，然后找个地方存储session的内容即可，你也可以学flickr把session存储在MySQL数据库中。</p>
<p>二、使用session之前为什么必须先执行session_start()？</p>
<p>了解的原理之后，所谓的session其实就是客户端一个session id服务器端一个session file，新建session之前执行session_start()是告诉服务器要种一个cookie以及准备好session文件，要不然你的session内容怎么存；读取session之前执行session_start()是告诉服务器，赶紧根据session id把session文件反序列化。</p>
<p>只有一个session函数可以在session_start()之前执行，session_nam()：读取或指定session名称（比如默认的就是&#8221;PHPSESSID&#8221;），这个当然要在session_start之前执行。</p>
<p>三、session影响系统性能</p>
<p>session在大访问量网站上确实影响系统性能，影响性能的原因之一由文件系统设计造成，在同一个目录下超过10000个文件时，文件的定位将非常耗时，PHP支持session目录hash，我们可以通过修改php.ini中session.save_path = &#8220;2;/path/to/session/dir&#8221;，那么session将存储在两级子目录中（修订：参见david回复），不过好像PHP session不支持创建目录，你需要事先把那么些目录创建好 。</p>
<p>还有一个问题就是小文件的效率问题，一般我们的session数据都不会太大（1～2K），如果有大量这样1～2K的文件在磁盘上，IO效率肯定会很差，PHP手册上建议使用<a href="http://zh.wikipedia.org/wiki/ReiserFS" target="_blank">Reiserfs</a>文件系统，不过Reiserfs的前景堪忧，Reiserfs的作者把媳妇给杀了，SuSE也抛弃了Reiserfs。</p>
<p>其实还有很多中存储session的方式，可以通过php -i|grep &#8220;Registered save handlers&#8221;查看，比如Registered save handlers =&gt; files user sqlite eaccelerator可以通过文件、用户、sqlite、eaccelerator来存，如果服务器装了memcached，还有会mmcache的选项。当然还有很多，比如MySQL、PostgreSQL等等。都是不错的选择。</p>
<p>四、session的同步</p>
<p>我们前端可能有很多台服务器，用户在A服务器上登录了，种下了session信息，然后访问网站的某些页面没准跳到B服务器上去了，如果这个时候B服务器上没有session信息又没有做特殊处理，可能就会出问题了。</p>
<p>session同步有很多种，如果你是存储在memcached或者MySQL中，那就很容易了，指定到同样的位置即可，如果是文件形式的，你可以用<a href="http://nio.infor96.com/sharing-php-session-data-between-servers" target="_blank">NFS统一存储</a>。</p>
<p>还有一种方式是通过加密的cookie来实现，用户在A服务器上登录成功，在用户的浏览器上种上一个加密的cookie，当用户访问B服务器时，检查有无session，如果有当然没问题，如果没有，就去检验cookie是否有效，cookie有效的话就在B服务器上重建session。这种方法其实很有用，如果网站有很多个子频道，服务器也不在一个机房，session没办法同步又想做统一登录那就太有用了。</p>
<p>当然还有一种方法就是在负载均衡那一层保持会话，把访问者帮定在某个服务器上，他的所有访问都在那个服务器上就不需要session同步了，这些都是运维层面的东西。</p>
<p>就说这么多吧，根据自己的应用来选择使用session，不要因为大家都说session影响系统性能就畏首畏尾，知道问题，解决问题才是关键，惹不起躲得起不适合这里。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/02/php-session-confuse/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Smarty到底怎么了?</title>
		<link>http://www.fuchaoqun.com/2009/02/how-is-php-smarty/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=how-is-php-smarty</link>
		<comments>http://www.fuchaoqun.com/2009/02/how-is-php-smarty/#comments</comments>
		<pubDate>Thu, 05 Feb 2009 02:23:21 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[smarty]]></category>

		<guid isPermaLink="false">http://chaoqun.17348.com/?p=150</guid>
		<description><![CDATA[早期的PHP开发者发现把PHP代码和HTML代码混在一起，维护起来非常的费劲，于是Smarty应运而生，将PHP代码和HTML代码分离，把MVC模式中的V(View显示)首先剥离，大大提高了程序的可阅读性和可维护性，于是有一大批的使用者，甚至到现在，如果你去找一份PHP的工作，如果不了解Smarty，估计够呛能拿到offer. Smarty，这个PHP模板引擎曾经的代名词，最近的日子貌似不太好过，3.0Alpha出来了，不过很多人认为换汤不换药，更有甚者用回光返照来形容，真是英雄末路。 国外甚至有个No Smarty的网站，数典Smarty的种种&#8221;罪行&#8221;，然后给出了很多种替代方案(基本上是主流的PHP框架)，个人觉得不太公平，一个PHP模板引擎和一个完备的MVC框架能有可比性？ 一个纯粹的PHP模板引擎在当前MVC当道的年代，难免不那么叫好，而且Smarty开发年代久远，有些设计确实不是太好，Smarty最早开发的时候估计是给页面制作人员(builder)来用的，以至于它的语法都和PHP不兼容，比如foreach语句，在Smarty里面就要用{foreach from=$foo item=bar}，可是套模板的工作基本上都是PHP程序员在做，不兼容PHP语法还需要重新去学习Smarty，而两种不同的风格足够让人抓狂。 如果是因为效率的问题放弃使用Smarty，大可不必，很多的网站还在用，比如我们，瓶颈不会出现在Smarty模板上，Smarty会把模板代码编译成PHP代码，下次调用的时候检测如果模板没有改动直接调用编译好的PHP代码，应该和原生的PHP代码差别不太大。而且Smarty自带了很多很有用的函数，比如转义，用起来还是很舒服的。 不过，最近Smarty项目已经从PHP官方移除了，访问http://smarty.php.net，提示Smarty is no longer a subproject of the PHP project, and has subsequently moved to its own domain: www.smarty.net，真是祸不单行。]]></description>
			<content:encoded><![CDATA[<p>早期的PHP开发者发现把PHP代码和HTML代码混在一起，维护起来非常的费劲，于是Smarty应运而生，将PHP代码和HTML代码分离，把MVC模式中的V(View显示)首先剥离，大大提高了程序的可阅读性和可维护性，于是有一大批的使用者，甚至到现在，如果你去找一份PHP的工作，如果不了解Smarty，估计够呛能拿到offer.</p>
<p>Smarty，这个PHP模板引擎曾经的代名词，最近的日子貌似不太好过，<a href="http://code.google.com/p/smarty-php/" target="_blank">3.0Alpha</a>出来了，不过很多人认为换汤不换药，更有<a href="http://blog.csdn.net/phphot/archive/2008/11/03/3209871.aspx" target="_blank">甚者</a>用回光返照来形容，真是英雄末路。</p>
<p>国外甚至有个<a href="http://nosmarty.net/" target="_blank">No Smarty</a>的网站，数典Smarty的种种&#8221;罪行&#8221;，然后给出了很多种替代方案(基本上是主流的PHP框架)，个人觉得不太公平，一个PHP模板引擎和一个完备的MVC框架能有可比性？</p>
<p>一个纯粹的PHP模板引擎在当前MVC当道的年代，难免不那么叫好，而且Smarty开发年代久远，有些设计确实不是太好，Smarty最早开发的时候估计是给页面制作人员(builder)来用的，以至于它的语法都和PHP不兼容，比如foreach语句，在Smarty里面就要用{foreach from=$foo item=bar}，可是套模板的工作基本上都是PHP程序员在做，不兼容PHP语法还需要重新去学习Smarty，而两种不同的风格足够让人抓狂。</p>
<p>如果是因为效率的问题放弃使用Smarty，大可不必，很多的网站还在用，比如<a href="http://music.sina.com.cn" target="_blank">我们</a>，瓶颈不会出现在Smarty模板上，Smarty会把模板代码编译成PHP代码，下次调用的时候检测如果模板没有改动直接调用编译好的PHP代码，应该和原生的PHP代码差别不太大。而且Smarty自带了很多很有用的函数，比如转义，用起来还是很舒服的。</p>
<p>不过，最近Smarty项目已经从PHP官方移除了，访问<a href="http://smarty.php.net" target="_blank">http://smarty.php.net</a>，提示Smarty is no longer a subproject of the PHP project, and has subsequently moved to its own domain: <a href="www.smarty.net" target="_blank">www.smarty.net</a>，真是祸不单行。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/02/how-is-php-smarty/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>OpenSlopeOne: An Open Source Project implementing Slope One in PHP&amp;MySQL</title>
		<link>http://www.fuchaoqun.com/2008/09/openslopeone-open-source-php-mysql/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=openslopeone-open-source-php-mysql</link>
		<comments>http://www.fuchaoqun.com/2008/09/openslopeone-open-source-php-mysql/#comments</comments>
		<pubDate>Fri, 12 Sep 2008 15:37:34 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[Data Mining]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Collaborative filtering]]></category>
		<category><![CDATA[openslopeone]]></category>
		<category><![CDATA[slope one]]></category>

		<guid isPermaLink="false">http://chaoqun.17348.com/?p=68</guid>
		<description><![CDATA[About OpenSlopeOne OpenSlopeOne is an implementation of Slope One based on PHP&#38;MySQL, it&#8217;s an open source project under GPL V3. It aims to a fast way to use Slope One with PHP&#38;MySQL, and it can handle tons of data. It&#8217;s localed on Google Code:     http://code.google.com/p/openslopeone/ You can get the latest code here:     svn [...]]]></description>
			<content:encoded><![CDATA[<p><strong>About OpenSlopeOne</strong></p>
<p>OpenSlopeOne is an implementation of Slope One based on PHP&amp;MySQL, it&#8217;s an open source project under GPL V3.</p>
<p>It aims to a fast way to use Slope One with PHP&amp;MySQL, and it can handle tons of data.</p>
<p>It&#8217;s localed on Google Code:</p>
<p>    <a href="http://code.google.com/p/openslopeone/" target="_blank">http://code.google.com/p/openslopeone/</a></p>
<p>You can get the latest code here:</p>
<p>    svn checkout https://openslopeone.googlecode.com/svn/trunk/openslopeone</p>
<p>it uses Zend_Db as its database layer.PHP5&amp;MySQL5 or higher.</p>
<p><strong>About Slope One</strong></p>
<p>Slope One is a family of algorithms used for <a href="http://en.wikipedia.org/wiki/Collaborative_filtering" target="_blank">Collaborative filtering</a> introduced in Slope One Predictors for Online Rating-Based Collaborative Filtering by <a href="http://www.daniel-lemire.com/fr/abstracts/SDM2005.html" target="_blank">Daniel Lemire</a> and Anna Maclachlan.</p>
<p>You can check <a href="http://en.wikipedia.org/wiki/Slope_One" target="_blank">http://en.wikipedia.org/wiki/Slope_One</a> to know more about Slope One.</p>
<p><strong>What&#8217;s the difference between OpenSlopeOne and Vogoo?</strong></p>
<p>As you know,there is also another implementation of Slope One based on PHP&amp;MySQL:<a href="http://sourceforge.net/projects/vogoo" target="_blank">Vogoo</a></p>
<p>What&#8217;s the difference?</p>
<p>OpenSlopeOne aims to a fast way to use Slope One with PHP&amp;MySQL, so it cares more about performance.</p>
<p>OpenSlopeOne has two modes to init the slope one table, one is based on pure PHP, the other is based on MySQL procedure, as you know, it will be much faster, and you can use it with any other programming language.</p>
<p>the bottleneck of Vogoo(read the source code of cronslope.php Line 70~Line 150, version 2.2) is to check whether the record exits or not. If there is tons of data, the performance is very bad.</p>
<p>In OpenSlopeOne, first I get distinct item ids, then foreach item id, i calculate the slope one of it. I do not have to check whether if it exits, and i am faster.</p>
<p><strong>Installation</strong></p>
<p>1. Modify the config ini file: config.ini.php</p>
<p>   ; &lt;?php exit; ?&gt; DO NOT REMOVE THIS LINE<br />
   [database]<br />
   host                 = localhost ; database host name or ip<br />
   username             = root      ; database user name<br />
   password             =           ; user password<br />
   dbname               =           ; database name<br />
   port                 = 3306      ; database host port,3306 as default<br />
   adapter              = PDO_MYSQL ; PDO_MYSQL or MYSQLI</p>
<p>2. Create user&#8217;s rating table:</p>
<p>    CREATE TABLE IF NOT EXISTS `oso_user_ratings` (<br />
      `user_id` int(11) NOT NULL,<br />
      `item_id` int(11) NOT NULL,<br />
      `rating` decimal(14,4) NOT NULL default &#8217;0.0000&#8242;,<br />
      KEY `item_id` (`item_id`),<br />
      KEY `user_id` (`user_id`,`item_id`)<br />
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;</p>
<p>there is a sample data file:sample.data, you can load it into the table</p>
<p>    load data infile &#8216;sample.data&#8217; into table oso_user_ratings;</p>
<p>3. Create slope one table:</p>
<p>    CREATE TABLE IF NOT EXISTS `oso_slope_one` (<br />
      `item_id1` int(11) NOT NULL,<br />
      `item_id2` int(11) NOT NULL,<br />
      `times` int(11) NOT NULL,<br />
      `rating` decimal(14,4) NOT NULL<br />
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;</p>
<p><strong>Usage<br />
</strong><br />
The main also the only PHP file is OpenSlopeOne.php, you must include it in your own PHP file:</p>
<p>    require &#8216;./OpenSlopeOne.php&#8217;;</p>
<p>    $openslopeone = new OpenSlopeOne();</p>
<p>1. Init the slope one table:</p>
<p>before you get the recommendtion, you must pre-computation the slope one table.</p>
<p>    $openslopeone-&gt;initSlopeOneTable($factory);</p>
<p>you can specify the mode use &#8216;PHP&#8217; or &#8216;MySQL&#8217;,If you user &#8216;PHP&#8217; mode, it&#8217;s a pure php implementation, and it might be very slow when there is tons of data.You can also use &#8216;MySQL&#8217; mode, it&#8217;s based on mysql procedure, and it will be mutch faster.</p>
<p>If you have tons of data to pre-computation, a good advice is that you do not index any colum on oso_slope_one before it done.</p>
<p>2. Get recommended items by item&#8217;s id</p>
<p>    $recommendedItems = $openslopeone-&gt;getRecommendedItemsById(9527);</p>
<p>3. Get recommended items by user&#8217;s id</p>
<p>    $recommendedItems = $openslopeone-&gt;getRecommendedItemsByUser(30002);<br />
<strong>About Author</strong></p>
<p>I am a PHP programmer in China, my blog:http://chaoqun.17348.com, mostly written in Chinese.</p>
<p>You can contack me with gtalk or mail:fuchaoqun@gmail.com</p>
<p>Welcom to any bug and advice.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2008/09/openslopeone-open-source-php-mysql/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->