今天發現使用PHP的APC也能獲取上傳文件的進度。這篇文章就說下如何做。
安裝APC
首先安裝APC的方法和其他PHP模塊的方法沒什么兩樣,網上能找出好多
phpinfo可以看到APC的默認配置有:
apc.rfc1867
看apc.rfc1867這個配置項:
http://cn2.php.net/manual/en/apc.configuration.php#ini.apc.rfc1867
文檔說的是如果你上傳文件的時候,在POST中帶有APC_UPLOAD_PROGRESS字段,那么APC會自動以這個值創造一個upload_key緩存
這個時候,用戶可以使用ajax再過來調用,就可以獲取到當前文件上傳的狀態了
這個狀態包括:
文件大小
當前已上傳文件大小
文件上傳速度(上傳結束后才有)
實驗:
1 開啟rfc1867配置項
apc.rfc1867=on
2 確認,phpinfo()中可以看到已經打開
3 服務端上傳php代碼
apc.php <?php if($_FILES['file']['error'] == UPLOAD_ERR_OK){ $path = '/tmp/upload/'; $path .= basename($_FILES['file']['name']); if(move_uploaded_file($_FILES['file']['tmp_name'], $path)){ // upload successful echo 'sucess'; } }
確保能通過網絡訪問到頁面
這里可以通過http://10.16.15.118:7702/apc.php 訪問
4 服務端查看進度php代碼
getprocess.php <?php print_r(apc_fetch("upload_6226f7cbe59e99a90b5cef6f94f966fd"));
確保能通過網絡訪問到頁面
這里可以通過http://10.16.15.118:7702/getprocess.php 訪問到
5 寫個簡單的客戶端html
<html> <body> <form enctype="multipart/form-data" method="POST" action="http://10.16.15.118:7702/apc.php"> <input type="hidden" name="APC_UPLOAD_PROGRESS" value="6226f7cbe59e99a90b5cef6f94f966fd"/> <input type="file" name="file" /> <input type="submit" value="submit" /> </form> </body> </html>
這里要注意的是,APC_UPLOAD_PROCESS 必須要放在上傳的file之前(這也是文檔中有寫到的),否則會出現warning,並且也無法得到process
6 上傳文件訪問apc.php
7 查看getprocess.php
下面的疑問就是是不是真有中間過渡狀態呢?
1 找個大文件,(20M+)
2 確認下nginx+php對文件大小限制超過20M
3 開啟fidder做限速:
按照這篇文章說的:http://donchevp.blogspot.com/2009/11/limiting-your-internet-connection-speed.html
設置rule - customer - 設置這一段代碼
if (m_SimulateModem) { // Delay sends by 300ms per KB uploaded. oSession["request-trickle-delay"] = "1"; // Delay receives by 150ms per KB downloaded. oSession["response-trickle-delay"] = "150"; }
修改這個request-trickle-delay
然后開啟Simulate模式。
4 a.html頁面上傳這個20M文件
5 不斷刷新getprocess.php
可以看到current的進度,而且可以看到沒有上傳完成的時候,rate字段是沒有的~~~so good~~
參考文章:
http://www.phppan.com/2012/04/php-upload-progress/
http://donchevp.blogspot.com/2009/11/limiting-your-internet-connection-speed.html