今天发现使用php的apc也能获取上传文件的进度。这篇文章就说下如何做。
首先安装apc的方法和其他php模块的方法没什么两样,网上能找出好多
phpinfo可以看到apc的默认配置有:

看apc.rfc1867这个配置项:
<a href="http://cn2.php.net/manual/en/apc.configuration.php#ini.apc.rfc1867">http://cn2.php.net/manual/en/apc.configuration.php#ini.apc.rfc1867</a>
文档说的是如果你上传文件的时候,在post中带有apc_upload_progress字段,那么apc会自动以这个值创造一个upload_key缓存
这个时候,用户可以使用ajax再过来调用,就可以获取到当前文件上传的状态了
这个状态包括:
apc.rfc1867=on
1
2
3
4
5
6
7
8
9
10
11
<code>apc.php</code>
<code><?php</code>
<code>if</code><code>(</code><code>$_files</code><code>[</code><code>'file'</code><code>][</code><code>'error'</code><code>] == upload_err_ok){</code>
<code> </code><code>$path</code> <code>=</code><code>'/tmp/upload/'</code><code>;</code>
<code> </code><code>$path</code> <code>.=</code><code>basename</code><code>(</code><code>$_files</code><code>[</code><code>'file'</code><code>][</code><code>'name'</code><code>]);</code>
<code> </code><code>if</code><code>(move_uploaded_file(</code><code>$_files</code><code>[</code><code>'file'</code><code>][</code><code>'tmp_name'</code><code>],</code><code>$path</code><code>)){</code>
<code> </code><code>// upload successful</code>
<code> </code><code>echo</code> <code>'sucess'</code><code>;</code>
<code> </code><code>}</code>
<code>}</code>
确保能通过网络访问到页面
<code>getprocess.php</code>
<code>print_r(apc_fetch(</code><code>"upload_6226f7cbe59e99a90b5cef6f94f966fd"</code><code>));</code>
<code><html></code>
<code><body></code>
<code><input type=</code><code>"hidden"</code> <code>name=</code><code>"apc_upload_progress"</code> <code>value=</code><code>"6226f7cbe59e99a90b5cef6f94f966fd"</code><code>/></code>
<code><input type=</code><code>"file"</code> <code>name=</code><code>"file"</code> <code>/></code>
<code><input type=</code><code>"submit"</code> <code>value=</code><code>"submit"</code> <code>/></code>
<code></form></code>
<code></body></code>
<code></html></code>
这里要注意的是,apc_upload_process 必须要放在上传的file之前(这也是文档中有写到的),否则会出现warning,并且也无法得到process
按照这篇文章说的:http://donchevp.blogspot.com/2009/11/limiting-your-internet-connection-speed.html
设置rule - customer - 设置这一段代码
<code>if</code> <code>(m_simulatemodem) {</code>
<code> </code><code>// delay sends by 300ms per kb uploaded.</code>
<code> </code><code>osession[</code><code>"request-trickle-delay"</code><code>] =</code><code>"1"</code><code>;</code>
<code> </code><code>// delay receives by 150ms per kb downloaded.</code>
<code> </code><code>osession[</code><code>"response-trickle-delay"</code><code>] =</code><code>"150"</code><code>;</code>
<code> </code><code>}</code>
修改这个request-trickle-delay
然后开启simulate模式。
可以看到current的进度,而且可以看到没有上传完成的时候,rate字段是没有的~~~so good~~