今天發現使用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~~