<?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; 默认分类</title>
	<atom:link href="http://www.fuchaoqun.com/category/%e9%bb%98%e8%ae%a4%e5%88%86%e7%b1%bb/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>基于MongoDb的S3实现</title>
		<link>http://www.fuchaoqun.com/2010/05/s3-on-mongodb-with-php/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=s3-on-mongodb-with-php</link>
		<comments>http://www.fuchaoqun.com/2010/05/s3-on-mongodb-with-php/#comments</comments>
		<pubDate>Fri, 07 May 2010 10:15:11 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>
		<category><![CDATA[ColaPHP]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[S3]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=344</guid>
		<description><![CDATA[原理是利用MongoDb的GridFS，伸展性方面交由MongoDb的auto sharding去实现，这里用PHP给MongoDb绑了个S3出来，支持选择文件存储节点，支持文件分目录存储，这样的好处是对于一些受时间影响比较明显的文件，可以按照年月的形式存储，减轻历史包袱。 首先，配置MongoDb GridFS节点信息： &#60;?php $s3Config = array&#40; 'foo' =&#62; array&#40; 'server' =&#62; '127.0.0.1', 'database' =&#62; 'test', 'user' =&#62; 'test', 'password' =&#62; 'foobar', 'domain' =&#62; 'http://s3.foobar.com' &#41;, &#160; 'bar' =&#62; array&#40; 'server' =&#62; '127.0.0.1', 'database' =&#62; 'test', 'user' =&#62; 'test', 'password' =&#62; 'foobar', 'domain' =&#62; 'http://s3.foobar.com' &#41;, &#41;; MongoDb的S3绑定： &#60;?php /** * 统一文件存储 * */ [...]]]></description>
			<content:encoded><![CDATA[<p>原理是利用MongoDb的GridFS，伸展性方面交由MongoDb的auto sharding去实现，这里用PHP给MongoDb绑了个S3出来，支持选择文件存储节点，支持文件分目录存储，这样的好处是对于一些受时间影响比较明显的文件，可以按照年月的形式存储，减轻历史包袱。</p>
<p>首先，配置MongoDb GridFS节点信息：</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: #000088;">$s3Config</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
    <span style="color: #0000ff;">'foo'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'server'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'127.0.0.1'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'database'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'test'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'user'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'test'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'foobar'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'domain'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'http://s3.foobar.com'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
&nbsp;
    <span style="color: #0000ff;">'bar'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
        <span style="color: #0000ff;">'server'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'127.0.0.1'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'database'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'test'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'user'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'test'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'password'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'foobar'</span><span style="color: #339933;">,</span>
        <span style="color: #0000ff;">'domain'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'http://s3.foobar.com'</span>
    <span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>MongoDb的S3绑定：</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: #009933; font-style: italic;">/**
 * 统一文件存储
 *
 */</span>
<span style="color: #000000; font-weight: bold;">class</span> Api_S3
<span style="color: #009900;">&#123;</span>
    protected <span style="color: #000088;">$_node</span><span style="color: #339933;">;</span>
&nbsp;
    protected <span style="color: #000088;">$_dir</span><span style="color: #339933;">;</span>
&nbsp;
    protected <span style="color: #000088;">$_config</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 构造函数
     *
     * @param string $node
     * @param string $dir
     * @param array $config
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> __construct<span style="color: #009900;">&#40;</span><span style="color: #000088;">$node</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dir</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <span style="color: #000088;">$config</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_config <span style="color: #339933;">=</span> <span style="color: #000088;">$config</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">path</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$node</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dir</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 设置文件路径
     *
     * @param string $node
     * @param string $dir
     * @return Api_S3
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> path<span style="color: #009900;">&#40;</span><span style="color: #000088;">$node</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dir</span><span style="color: #339933;">,</span> <span style="color: #000088;">$connect</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;">$this</span><span style="color: #339933;">-&gt;</span>_node <span style="color: #339933;">=</span> <span style="color: #000088;">$node</span><span style="color: #339933;">;</span>
        <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_dir <span style="color: #339933;">=</span> <span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$dir</span><span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">'fs'</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$dir</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_config<span style="color: #009900;">&#91;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_node<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            throw <span style="color: #000000; font-weight: bold;">new</span> Cola_Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Api_S3: invalidate node'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$connect</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * GridFS
     *
     * @return MongDbGridFS
     */</span>
    protected <span style="color: #000000; font-weight: bold;">function</span> _gridFS<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$mongo</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Cola_Com_Mongo<span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_config<span style="color: #009900;">&#91;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_node<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$mongo</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">gridFS</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_dir<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 获得文件句柄
     *
     * @param string $name
     * @return MongoGridFSFile
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</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: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #339933;">-&gt;</span><span style="color: #004000;">findOne</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'filename'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 获得文件内容
     *
     * @param string $name
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> read<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 写入文件
     *
     * @param string $name
     * @param string $data
     * @param array $extra
     * @param boolean $overWrite
     * @return boolean
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> write<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extra</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$overWrite</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$extra</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span><span style="color: #000088;">$extra</span> <span style="color: #339933;">+</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'filename'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">basename</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$filetype</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_type<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$extra</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'filetype'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$filetype</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$extra</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'filename'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</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;">$overWrite</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$extra</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'filename'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
                throw <span style="color: #000000; font-weight: bold;">new</span> Cola_Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Api_S3: file exists'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #339933;">-&gt;</span><span style="color: #004000;">storeBytes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extra</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 复制系统文件
     *
     * @param string $file
     * @param array $extra
     * @param boolean $overWrite
     * @return boolean
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> <span style="color: #990000;">copy</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extra</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span> <span style="color: #000088;">$overWrite</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$extra</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#41;</span><span style="color: #000088;">$extra</span> <span style="color: #339933;">+</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'filename'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">basename</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$filetype</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_type<span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$extra</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'filetype'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$filetype</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$extra</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'filename'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</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;">$overWrite</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">delete</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$extra</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'filename'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
                throw <span style="color: #000000; font-weight: bold;">new</span> Cola_Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Api_S3: file exists'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #339933;">-&gt;</span><span style="color: #004000;">storeFile</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #000088;">$extra</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 删除文件
     *
     * @param string $name
     * @return boolean
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> delete<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</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: #990000;">empty</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #b1b100;">return</span>  <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #339933;">-&gt;</span><span style="color: #004000;">remove</span><span style="color: #009900;">&#40;</span><span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'filename'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 获得文件地址
     *
     * @param string $name
     * @param string $default
     * @return string
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getUrl<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$default</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span>
            <span style="color: #0000ff;">'domain'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">rtrim</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_config<span style="color: #009900;">&#91;</span><span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_node<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'domain'</span><span style="color: #009900;">&#93;</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: #0000ff;">'path'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_node <span style="color: #339933;">.</span> <span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'fs'</span> <span style="color: #339933;">==</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_dir<span style="color: #009900;">&#41;</span> ? <span style="color: #0000ff;">''</span> <span style="color: #339933;">:</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_dir<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
            <span style="color: #0000ff;">'name'</span>   <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$name</span>
        <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span>  <span style="color: #990000;">implode</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 设置文件属性
     *
     * @param string $name
     * @param array $attr
     * @return boolean
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setAttr<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #000088;">$attr</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: #339933;">!</span><span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            throw <span style="color: #000000; font-weight: bold;">new</span> Cola_Exception<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Api_S3: file not exists'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
&nbsp;
        <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$attr</span> <span style="color: #339933;">+</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #339933;">;</span>
&nbsp;
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_gridFS<span style="color: #339933;">-&gt;</span><span style="color: #004000;">save</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 获得文件属性
     *
     * @param string $name
     * @return array
     */</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> getAttr<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #009933; font-style: italic;">/**
     * 获得文件类型
     *
     * @param string $file
     * @return string
     */</span>
    protected <span style="color: #000000; font-weight: bold;">function</span> _type<span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> <span style="color: #990000;">mime_content_type</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></div></div>

<p>文件存入，支持自选节点，自定义目录，自定义文件名，可以自动添加文件类型：</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: #000088;">$s3</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Api_S3<span style="color: #009900;">&#40;</span><span style="color: #000088;">$node</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dir</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s3Config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$s3</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">copy</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'filename'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$name</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'filetype'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$type</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>文件读取，以&#8221;http://s3.foobar.com/foo/201005/foobar.jpg&#8221;为例，foo映射到节点名，201005映射到目录名，foobar.jpg映射到文件名：</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: #000088;">$s3</span> <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Api_S3<span style="color: #009900;">&#40;</span><span style="color: #000088;">$node</span><span style="color: #339933;">,</span> <span style="color: #000088;">$dir</span><span style="color: #339933;">,</span> <span style="color: #000088;">$s3Config</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$s3</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
Cola_Response<span style="color: #339933;">::</span><span style="color: #004000;">lastModified</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'uploadDate'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">sec</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Cola_Response<span style="color: #339933;">::</span><span style="color: #004000;">etag</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'md5'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">file</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'filetype'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Type: <span style="color: #006699; font-weight: bold;">{$file-&gt;file['filetype']}</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">echo</span> <span style="color: #000088;">$file</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getBytes</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>注意到我们利用了文件的修改时间设置http头的last modified，以及用文件的md5信息设置etag值，这样的好处是可以大大减少带宽使用，当然，你也可以设置expire时间来减少重复请求。</p>
<p>关于性能问题，可以在PHP读取的上一层，加一个Squid之类的反向代理服务，基本上就不会有问题。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2010/05/s3-on-mongodb-with-php/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>ColaPHP 0.5beta发布</title>
		<link>http://www.fuchaoqun.com/2010/01/colaphp-0-5-beta/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=colaphp-0-5-beta</link>
		<comments>http://www.fuchaoqun.com/2010/01/colaphp-0-5-beta/#comments</comments>
		<pubDate>Sun, 24 Jan 2010 05:31:54 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>
		<category><![CDATA[ColaPHP]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=298</guid>
		<description><![CDATA[ColaPHP的第一个beta版本,代号：Practice，已经实践的优化，可以适量应用在实际项目中，相比较0.4alpha，比较大的修改如下： 增加字符串加密助手，支持XOR、mcrypt加密，支持混淆 增加分页类 重构了HTTP请求类，可定制性更强 重构了Validate类，增加批量校验 其他代码重构以及bug fix 下载ColaPHP 0.5beta，阅读ColaPHP文档，访问ColaPHP项目。 下一个版本0.6beta开发代号：Easy，将在易用性方面进一步优化。]]></description>
			<content:encoded><![CDATA[<p>ColaPHP的第一个beta版本,代号：Practice，已经实践的优化，可以适量应用在实际项目中，相比较0.4alpha，比较大的修改如下：</p>
<ul>
<li>增加字符串加密助手，支持XOR、mcrypt加密，支持混淆</li>
<li>增加分页类</li>
<li>重构了HTTP请求类，可定制性更强</li>
<li>重构了Validate类，增加批量校验</li>
<li>其他代码重构以及bug fix </li>
</ul>
<p>下载<a href="http://colaphp.googlecode.com/files/ColaPHP-0.5-beta.zip" target="_blank">ColaPHP 0.5beta</a>，阅读<a href="http://code.google.com/p/colaphp/w/list" target="_blank">ColaPHP文档</a>，访问<a href="http://code.google.com/p/colaphp/" target="_blank">ColaPHP项目</a>。</p>
<p>下一个版本0.6beta开发代号：Easy，将在易用性方面进一步优化。 </p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2010/01/colaphp-0-5-beta/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>MongoDb In Action</title>
		<link>http://www.fuchaoqun.com/2010/01/mongodb-in-action/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mongodb-in-action</link>
		<comments>http://www.fuchaoqun.com/2010/01/mongodb-in-action/#comments</comments>
		<pubDate>Sat, 23 Jan 2010 05:15:38 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>
		<category><![CDATA[mongodb]]></category>
		<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=294</guid>
		<description><![CDATA[This slide will tell you how to use MongoDb as MySQL in your application.]]></description>
			<content:encoded><![CDATA[<div style="width:425px;text-align:left" id="__ss_2976022"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodbinaction-100122230824-phpapp01&#038;rel=0&#038;stripped_title=mongodb-in-action-2976022" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=mongodbinaction-100122230824-phpapp01&#038;rel=0&#038;stripped_title=mongodb-in-action-2976022" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p>This slide will tell you how to use MongoDb as MySQL in your application.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2010/01/mongodb-in-action/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Python处理MP3的歌词和图片</title>
		<link>http://www.fuchaoqun.com/2010/01/python-mp3-id3v2-lyrics-attached_picture/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=python-mp3-id3v2-lyrics-attached_picture</link>
		<comments>http://www.fuchaoqun.com/2010/01/python-mp3-id3v2-lyrics-attached_picture/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 14:51:31 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>
		<category><![CDATA[attached picture]]></category>
		<category><![CDATA[id3v2]]></category>
		<category><![CDATA[lyrics]]></category>
		<category><![CDATA[mp3]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=289</guid>
		<description><![CDATA[一些MP3播放器（包括iphone、ipod、itouch、blackberry等）可以在播放mp3的时候显示专辑图片、歌词等信息而不需要额外的图片文件和歌词文件，仅仅一个mp3文件就搞定，比较有意思。除了用专门的软件（比如itunes）来制作这样的mp3，我们还可以用程序来批量生成。 查阅mp3头信息ID3V2的技术文档，发现可以往ID3信息里面加入歌词和图片信息（可以在页面上查找Lyrics、Attached picture就能发现相应的内容）。有了官方格式上的支持，我们要做的就是把歌词和图片加入到MP3文件中去。 测试一些开源的软件包，发现一个比较可靠的：eyeD3，由python语言编写，直接上代码： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 #coding=utf-8 import eyeD3 import re &#160; # mp3文件 mp3_file = '/path/to/foobar.mp3' # lrc歌词文件 lrc_file = '/path/to/foobar.lrc' # [...]]]></description>
			<content:encoded><![CDATA[<p>一些MP3播放器（包括iphone、ipod、itouch、blackberry等）可以在播放mp3的时候显示专辑图片、歌词等信息而不需要额外的图片文件和歌词文件，仅仅一个mp3文件就搞定，比较有意思。除了用专门的软件（比如itunes）来制作这样的mp3，我们还可以用程序来批量生成。</p>
<p>查阅mp3头信息<a href="http://www.id3.org/d3v2.3.0" target="_blank">ID3V2的技术文档</a>，发现可以往ID3信息里面加入歌词和图片信息（可以在页面上查找Lyrics、Attached picture就能发现相应的内容）。有了官方格式上的支持，我们要做的就是把歌词和图片加入到MP3文件中去。</p>
<p>测试一些开源的软件包，发现一个比较可靠的：<a href="http://eyed3.nicfit.net/" target="_blank">eyeD3</a>，由python语言编写，直接上代码：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#coding=utf-8</span>
<span style="color: #ff7700;font-weight:bold;">import</span> eyeD3
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">re</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># mp3文件</span>
mp3_file = <span style="color: #483d8b;">'/path/to/foobar.mp3'</span>
<span style="color: #808080; font-style: italic;"># lrc歌词文件</span>
lrc_file = <span style="color: #483d8b;">'/path/to/foobar.lrc'</span>
<span style="color: #808080; font-style: italic;"># 专辑图片</span>
pic_file = <span style="color: #483d8b;">'/path/to/foobar.jpg'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 实例化eyeD3</span>
tag = eyeD3.<span style="color: black;">Tag</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 绑定到mp3文件</span>
tag.<span style="color: black;">link</span><span style="color: black;">&#40;</span>mp3_file<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 去掉原文件中可能存在的图片</span>
tag.<span style="color: black;">removeImage</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 去掉原文件中可能存在的歌词</span>
tag.<span style="color: black;">removeLyrics</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 设定编码,非常重要，否则不支持中文</span>
tag.<span style="color: black;">encoding</span> = <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\x</span>01'</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 添加图片</span>
tag.<span style="color: black;">addImage</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span>, pic_file, u<span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 添加歌词，注意要utf-8编码，去掉lrc中时间信息</span>
tag.<span style="color: black;">addLyrics</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">re</span>.<span style="color: black;">sub</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'(<span style="color: #000099; font-weight: bold;">\[</span>.*?<span style="color: #000099; font-weight: bold;">\]</span>[<span style="color: #000099; font-weight: bold;">\n</span>]*)+'</span>, <span style="color: #483d8b;">''</span>, <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span>lrc_file, <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 更新到文件</span>
tag.<span style="color: black;">update</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>代码非常简单，需要注意的是设定编码，不然歌词就乱码了。有了eyeD3之后，可以写个爬虫，从网上抓下歌词和图片直接灌进MP3文件里面，剩下的就是享受了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2010/01/python-mp3-id3v2-lyrics-attached_picture/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>还在路上</title>
		<link>http://www.fuchaoqun.com/2009/12/my-2009/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=my-2009</link>
		<comments>http://www.fuchaoqun.com/2009/12/my-2009/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 03:54:10 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=284</guid>
		<description><![CDATA[又是一年算账的时候，去年的今天写了2009年的一些计划：网络(socket)/桌面(gui)编程；一个精巧的PHP框架；数据挖掘；多一些好朋友。socket/gui编程算是稍稍入门吧；PHP框架(ColaPHP)已经发了4个alpha版本，目前从实际项目中看表现还可以，可能下一个版本就进入beta阶段，beta意味着ColaPHP逐步趋于稳定；数据挖掘前半年做的比较多，进展不算太大；好朋友多了一些，此事甚为欣慰。 2009年技术上主要是代码方面的成长，重构的事情做的比较多，已不太相信过于花哨的玩意。脾气方面，&#8221;骄躁&#8221;二字少了些。回过头来看2009，不觉太多收获，亦不觉浮度。 2010年想要做的一些事情：学一门新语言；ColaPHP发一个GA版本；数据挖掘，做一个开源的推荐系统；更多的好朋友。 希望春天能在2010年到来。]]></description>
			<content:encoded><![CDATA[<p>又是一年算账的时候，去年的今天写了<a href="http://www.fuchaoqun.com/2008/12/my-2008/" target="_blank">2009年的一些计划</a>：网络(socket)/桌面(gui)编程；一个精巧的PHP框架；数据挖掘；多一些好朋友。socket/gui编程算是稍稍入门吧；PHP框架(<a href="http://code.google.com/p/colaphp/" target="_blank">ColaPHP</a>)已经发了4个alpha版本，目前从实际项目中看表现还可以，可能下一个版本就进入beta阶段，beta意味着ColaPHP逐步趋于稳定；数据挖掘前半年做的比较多，进展不算太大；好朋友多了一些，此事甚为欣慰。</p>
<p>2009年技术上主要是代码方面的成长，重构的事情做的比较多，已不太相信过于花哨的玩意。脾气方面，&#8221;骄躁&#8221;二字少了些。回过头来看2009，不觉太多收获，亦不觉浮度。</p>
<p>2010年想要做的一些事情：学一门新语言；ColaPHP发一个GA版本；数据挖掘，做一个开源的推荐系统；更多的好朋友。</p>
<p>希望春天能在2010年到来。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/12/my-2009/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>ColaPHP-0.2-alpha发布</title>
		<link>http://www.fuchaoqun.com/2009/07/colaphp-02-alpha/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=colaphp-02-alpha</link>
		<comments>http://www.fuchaoqun.com/2009/07/colaphp-02-alpha/#comments</comments>
		<pubDate>Tue, 28 Jul 2009 08:31:46 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://www.fuchaoqun.com/?p=231</guid>
		<description><![CDATA[相比较0.1alpha，比较大的修改如下： 增加了Cache处理模块，支持APC、eAccelerator、Memeched、File、Xcache、Dba缓存 增加日志处理模块，支持Echo、File、Null三种类型 去掉了Cola.php中404处理，建议用户在url规则最后的位置加上&#8217;/.*/&#8217;来处理其他任何没有匹配的请求 demo做了一点小的修改，有一个演示不需要定义url规则、跳过Router.php的方法（参见demo/norouter.php） 一些bug的修订 同时欢迎Python.Han, darkredz加入到项目中来，有你们ColaPHP会更精彩。 下载0.2alpha，不过建议随时跟进我们的SVN://colaphp.googlecode.com/svn/trunk/，ColaPHP一直在活跃开发。 继续招募PHP极客加入Cola，联系fuchaoqun#gmail.com。]]></description>
			<content:encoded><![CDATA[<p>相比较0.1alpha，比较大的修改如下： </p>
<ul>
<li>增加了Cache处理模块，支持APC、eAccelerator、Memeched、File、Xcache、Dba缓存</li>
<li>增加日志处理模块，支持Echo、File、Null三种类型</li>
<li>去掉了Cola.php中404处理，建议用户在url规则最后的位置加上&#8217;/.*/&#8217;来处理其他任何没有匹配的请求 </a></li>
<li>demo做了一点小的修改，有一个演示不需要定义url规则、跳过Router.php的方法（参见demo/norouter.php）</li>
<li>一些bug的修订</li>
</ul>
<p>同时欢迎Python.Han, darkredz加入到项目中来，有你们ColaPHP会更精彩。</p>
<p><a href="http://colaphp.googlecode.com/files/ColaPHP-0.2-alpha.zip" target="_blank">下载0.2alpha</a>，不过建议随时跟进我们的SVN://colaphp.googlecode.com/svn/trunk/，ColaPHP一直在活跃开发。</p>
<p>继续招募PHP极客加入Cola，联系fuchaoqun#gmail.com。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/07/colaphp-02-alpha/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>解决Pidgin掉线、自动退出、假死、无响应</title>
		<link>http://www.fuchaoqun.com/2009/04/pidgin-goes-down/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=pidgin-goes-down</link>
		<comments>http://www.fuchaoqun.com/2009/04/pidgin-goes-down/#comments</comments>
		<pubDate>Tue, 14 Apr 2009 09:19:20 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://chaoqun.17348.com/?p=216</guid>
		<description><![CDATA[最近几天，被pidgin折腾疯了，一会上线，一会自动退出，一会假死，看到好友发过来消息，可阅读不了具体内容，折腾的身心疲惫，升级到最新版本也无济于事。 由于在pidgin上登录了msn和gtalk帐号，初步怀疑是MSN插件的问题，貌似MSN之前升级了版本。禁用MSN帐号后，pidgin恢复稳定。 郁闷的不行了，找到一个第三方的MSN插件：http://code.google.com/p/msn-pecan/ wget http://msn-pecan.googlecode.com/files/msn-pecan-0.0.18.tar.bz2 tar xjf msn-pecan-0.0.18.tar.bz2 -C /usr/local/src cd /usr/local/src/msn-pecan-0.0.18/ make make install 安装之前记得安装libpurple-devel yum install libpurple-devel 安装好了之后，pidgin中会出现WLM协议，用这个做MSN登录，世界总算清静下来了。 我这边是CentOS 5.3，Pidgin 2.5.5-1.el5，其他版本安装说明，阅读http://code.google.com/p/msn-pecan/wiki/HowToInstall]]></description>
			<content:encoded><![CDATA[<p>最近几天，被pidgin折腾疯了，一会上线，一会自动退出，一会假死，看到好友发过来消息，可阅读不了具体内容，折腾的身心疲惫，升级到最新版本也无济于事。</p>
<p>由于在pidgin上登录了msn和gtalk帐号，初步怀疑是MSN插件的问题，貌似MSN之前升级了版本。禁用MSN帐号后，pidgin恢复稳定。</p>
<p>郁闷的不行了，找到一个第三方的MSN插件：<a href="http://code.google.com/p/msn-pecan/" target="_blank">http://code.google.com/p/msn-pecan/</a></p>
<blockquote><p>wget http://msn-pecan.googlecode.com/files/msn-pecan-0.0.18.tar.bz2<br />
tar xjf msn-pecan-0.0.18.tar.bz2 -C /usr/local/src<br />
cd /usr/local/src/msn-pecan-0.0.18/<br />
make<br />
make install</p></blockquote>
<p>安装之前记得安装libpurple-devel</p>
<blockquote><p>yum install libpurple-devel</p></blockquote>
<p>安装好了之后，pidgin中会出现WLM协议，用这个做MSN登录，世界总算清静下来了。</p>
<p>我这边是CentOS 5.3，Pidgin 2.5.5-1.el5，其他版本安装说明，阅读<a href="http://code.google.com/p/msn-pecan/wiki/HowToInstall" target="_blank">http://code.google.com/p/msn-pecan/wiki/HowToInstall</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/04/pidgin-goes-down/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>一生所爱</title>
		<link>http://www.fuchaoqun.com/2009/03/love-for-ever/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=love-for-ever</link>
		<comments>http://www.fuchaoqun.com/2009/03/love-for-ever/#comments</comments>
		<pubDate>Wed, 04 Mar 2009 10:40:52 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://chaoqun.17348.com/?p=175</guid>
		<description><![CDATA[用自建的推荐系统给自己推荐歌曲，排在前面的居然有一首《一生所爱》，看大话西游的时候就特别喜欢这首歌，一直不知道叫什么名字，人生要是如算法那样简单该是多么的好。 一生所爱 曲:卢冠廷 词:唐书琛 编:卢冠廷 唱:卢冠廷 从前现在过去了再不来 红红落叶长埋尘土内 开始终结总是没变改 天边的你飘泊白云外 苦海翻起爱浪 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 情人别后永远再不来(消散的情缘) 无言独坐放眼尘世外(愿来日再续) 鲜花虽会凋谢(只愿)但会再开(为你) 一生所爱隐约(守候)在白云外(期待) 苦海翻起爱浪 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 苦海翻起爱浪 在世间难逃避命运 相亲竟不可接近 或我应该相信是缘份 自觉好像一条狗。]]></description>
			<content:encoded><![CDATA[<p>用自建的推荐系统给自己推荐歌曲，排在前面的居然有一首《<a href="http://music.sina.com.cn/yueku/m/800679.html" target="_blank">一生所爱</a>》，看大话西游的时候就特别喜欢这首歌，一直不知道叫什么名字，人生要是如算法那样简单该是多么的好。</p>
<blockquote><p>一生所爱</p>
<p>曲:卢冠廷<br />
词:唐书琛<br />
编:卢冠廷<br />
唱:卢冠廷</p>
<p>从前现在过去了再不来<br />
红红落叶长埋尘土内<br />
开始终结总是没变改<br />
天边的你飘泊白云外<br />
苦海翻起爱浪<br />
在世间难逃避命运<br />
相亲竟不可接近<br />
或我应该相信是缘份<br />
情人别后永远再不来(消散的情缘)<br />
无言独坐放眼尘世外(愿来日再续)<br />
鲜花虽会凋谢(只愿)但会再开(为你)<br />
一生所爱隐约(守候)在白云外(期待)<br />
苦海翻起爱浪<br />
在世间难逃避命运<br />
相亲竟不可接近<br />
或我应该相信是缘份<br />
苦海翻起爱浪<br />
在世间难逃避命运<br />
相亲竟不可接近<br />
或我应该相信是缘份</p></blockquote>
<p>自觉好像一条狗。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/03/love-for-ever/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Key-Value型数据存储</title>
		<link>http://www.fuchaoqun.com/2009/01/key-value-stores/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=key-value-stores</link>
		<comments>http://www.fuchaoqun.com/2009/01/key-value-stores/#comments</comments>
		<pubDate>Tue, 20 Jan 2009 04:26:25 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>
		<category><![CDATA[Berkeley DB]]></category>
		<category><![CDATA[memcached]]></category>

		<guid isPermaLink="false">http://chaoqun.17348.com/?p=131</guid>
		<description><![CDATA[本博客所有原创文章采用知识共享署名-非商业性使用-相同方式共享，转载请保留链接http://chaoqun.17348.com/2009/01/key-value-stores/ 早上看到博客Anti-RDBMS: A list of distributed key-value stores（抵制关系型数据库：分布式key-value存储列表），最近的项目中也有用到类似Key-Value的存储。 memcached是最典型的key-value型存储，估计也是使用最广泛，但是由于memcached数据存放在内存中，服务重启或者系统down机之后就会丢失，只能用来缓存非关键数据（丟了没关系，重建就可以），或者考虑memcached的持久化方案：memcachedb，不过还是建议缓存次关键数据，比如文章点击数，写入失败或者丢了数据也不是太要命。 有时候我们的数据本身就是key-value型的，比如字典数据，就两列：单词-&#62;释义，这样的数据存mysql之类的关系型数据库就有点太&#8221;重&#8221;了，大可采用key-value型的存储方案，Berkeley DB就足够用了。 一直在关注CouchDB，已经是Apache的顶极项目了，系统稳定和版本更新自然有保障一些，居于Erlang语言开发，高并发也不是问题，relication也集成在里面，分布式也很容易做到，提供HTTP Restful接口，方便调用。个人觉得最适合股票类的网站，需要实时更新股票价格，用这个简直就是就像是定制的，不知道新浪财经的同事有没有关注。 Anti-RDBMS: A list of distributed key-value stores还提到HyperTable，百度居然赞助了这个项目，实在难得，说明项目确实不错，希望百度也分配一些工程师进去，完善开发HyperTable，到那个时候平民百姓也能用到BigTable了。 今年的也准备写个key-value的项目，计划中，关键字：Python,stackless,UDP,BDB ,memcached protocol,Low mem use.]]></description>
			<content:encoded><![CDATA[<blockquote><p>本博客所有原创文章采用<a href="http://creativecommons.org/licenses/by-nc-sa/2.5/cn/" target="_blank"><span style="color: #356aa0;">知识共享署名-非商业性使用-相同方式共享</span></a>，转载请保留链接<a href="http://chaoqun.17348.com/2009/01/key-value-stores/" target="_blank">http://chaoqun.17348.com/2009/01/key-value-stores/</a></p></blockquote>
<p>早上看到博客<a href="http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/" target="_blank">Anti-RDBMS: A list of distributed key-value stores</a>（抵制关系型数据库：分布式key-value存储列表），最近的项目中也有用到类似Key-Value的存储。</p>
<p><a href="http://www.danga.com/memcached/" target="_blank">memcached</a>是最典型的key-value型存储，估计也是使用最广泛，但是由于memcached数据存放在内存中，服务重启或者系统down机之后就会丢失，只能用来缓存非关键数据（丟了没关系，重建就可以），或者考虑memcached的持久化方案：<a href="http://memcachedb.org/" target="_blank">memcachedb</a>，不过还是建议缓存次关键数据，比如文章点击数，写入失败或者丢了数据也不是太要命。</p>
<p>有时候我们的数据本身就是key-value型的，比如字典数据，就两列：单词-&gt;释义，这样的数据存mysql之类的关系型数据库就有点太&#8221;重&#8221;了，大可采用key-value型的存储方案，Berkeley DB就足够用了。</p>
<p>一直在关注<a href="http://couchdb.apache.org/" target="_blank">CouchDB</a>，已经是Apache的顶极项目了，系统稳定和版本更新自然有保障一些，居于Erlang语言开发，高并发也不是问题，relication也集成在里面，分布式也很容易做到，提供HTTP Restful接口，方便调用。个人觉得最适合股票类的网站，需要实时更新股票价格，用这个简直就是就像是定制的，不知道新浪财经的同事有没有关注。</p>
<p><a href="http://www.metabrew.com/article/anti-rdbms-a-list-of-distributed-key-value-stores/" target="_blank">Anti-RDBMS: A list of distributed key-value stores</a>还提到<a href="http://hypertable.org/" target="_blank">HyperTable</a>，百度居然赞助了这个项目，实在难得，说明项目确实不错，希望百度也分配一些工程师进去，完善开发HyperTable，到那个时候平民百姓也能用到BigTable了。</p>
<p>今年的也准备写个key-value的项目，计划中，关键字：Python,stackless,UDP,BDB ,memcached protocol,Low mem use.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2009/01/key-value-stores/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>正走在路上</title>
		<link>http://www.fuchaoqun.com/2008/12/my-2008/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=my-2008</link>
		<comments>http://www.fuchaoqun.com/2008/12/my-2008/#comments</comments>
		<pubDate>Wed, 31 Dec 2008 07:18:33 +0000</pubDate>
		<dc:creator>超群.com</dc:creator>
				<category><![CDATA[默认分类]]></category>

		<guid isPermaLink="false">http://chaoqun.17348.com/?p=121</guid>
		<description><![CDATA[去年的这个时候我琢磨是不是要离职，事业单位，福利待遇都很好，离开了什么都要重新再来，思前想后，还是决定出来看看，毕竟在学校呆了18年了（小学5年＋初中3年＋高中3年＋大学4年＋学校出版社3年），在这个不大不小的年纪做这个决定是必要的，估计再过几年就不会动了，也动不了了。2008年2月27日，给出版社的同事写了一封致年轻人的信，然后3月份就到FH网去报到了，刚从学校出来的时候，可能那个经济环境还不错，拿到了些个offer，选择FH网是觉得是门户，公司大一些可能会正规一些，实际怎么样就不说了，一个项目下来，三个技术辞职，剩下的一个是测试，后来陆续在sina看到原来的同事来面试，想想出走还是明智的。6月份到sina报到，直至现在。 2008年成长最快的还是技术方面，PHP还算熟悉了，Javascript也凑合了，抽空做了做Python，已经离不开了，数据挖掘主要方向是推荐系统，也有些收获，过几天把netflix prize的分数晒晒。 与人交往方面还是没什么进步，基本上关系好的是我尊重的人和尊重我的人，所以你要成为我的好朋友，你需要有值得我尊重的东西，尤其是品质，或者尊重我，这样会友好很多。如果你不在二者之列，太对不起了，过去的一年我估计没少得罪你。 我出来之后有人问我出来感觉怎么样或者出来好不好，正好昨天看到一则小故事，人问佛：我不知道我现在的爱是真的还是假的，我该怎么办？佛说：有机会就去爱吧，不要管是劫还是缘，劫也是缘。所以有机会就试试吧，反正我的感觉很好。 2009年主要要做的事情：网络(socket)/桌面(gui)编程；一个精巧的PHP框架(雏形差不多了，和原生的PHP相比性能损耗大概在1.5ms左右)；数据挖掘(推荐系统差不多了，试试其他的领域，有可能在XX预测的方向)；多一些好朋友。 春天快要来了，因为人们都后知后觉，2009，大家都会是好样的。]]></description>
			<content:encoded><![CDATA[<p>去年的这个时候我琢磨是不是要离职，事业单位，福利待遇都很好，离开了什么都要重新再来，思前想后，还是决定出来看看，毕竟在学校呆了18年了（小学5年＋初中3年＋高中3年＋大学4年＋学校出版社3年），在这个不大不小的年纪做这个决定是必要的，估计再过几年就不会动了，也动不了了。2008年2月27日，给出版社的同事写了一封<a href="http://chaoqun.17348.com/2008/08/a_letter_to_young_guys/" target="_blank">致年轻人的信</a>，然后3月份就到FH网去报到了，刚从学校出来的时候，可能那个经济环境还不错，拿到了些个offer，选择FH网是觉得是门户，公司大一些可能会正规一些，实际怎么样就不说了，一个项目下来，三个技术辞职，剩下的一个是测试，后来陆续在sina看到原来的同事来面试，想想出走还是明智的。6月份到sina报到，直至现在。</p>
<p>2008年成长最快的还是技术方面，PHP还算熟悉了，Javascript也凑合了，抽空做了做Python，已经离不开了，数据挖掘主要方向是推荐系统，也有些收获，过几天把<a href="http://www.netflixprize.com/" target="_blank">netflix prize</a>的分数晒晒。</p>
<p>与人交往方面还是没什么进步，基本上关系好的是我尊重的人和尊重我的人，所以你要成为我的好朋友，你需要有值得我尊重的东西，尤其是品质，或者尊重我，这样会友好很多。如果你不在二者之列，太对不起了，过去的一年我估计没少得罪你。</p>
<p>我出来之后有人问我出来感觉怎么样或者出来好不好，正好昨天看到一则小故事，人问佛：我不知道我现在的爱是真的还是假的，我该怎么办？佛说：有机会就去爱吧，不要管是劫还是缘，劫也是缘。所以有机会就试试吧，反正我的感觉很好。</p>
<p>2009年主要要做的事情：网络(socket)/桌面(gui)编程；一个精巧的PHP框架(雏形差不多了，和原生的PHP相比性能损耗大概在1.5ms左右)；数据挖掘(推荐系统差不多了，试试其他的领域，有可能在XX预测的方向)；多一些好朋友。</p>
<p>春天快要来了，因为人们都后知后觉，2009，大家都会是好样的。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.fuchaoqun.com/2008/12/my-2008/feed/</wfw:commentRss>
		<slash:comments>6</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! -->