本文主要介紹了PHP利用APC模組實現文件上傳進度條的方法,分析了APC模組的具體用法,並給出了APC相關配置說明。希望對大家有幫助。
以前的php5.2之前的版本是不能可使用APC模組的,因為之前的壓根就沒有這個APC模組,如果想使用APC模組實現上傳進度條我們必須是php5.2或更高版本.
從5.2開始APC加入了一個叫APC_UPLOAD_PROGRESS的東東,解決了困擾大家已久的進度條問題。並且它把原來的上傳時把臨時檔案全部緩存到內存改成了當臨時文件達到設定值時就自動保存到硬碟,有效地改善了內存利用狀況。
它的作用原理是在上傳時候賦予每個上傳一個唯一的ID,當PHP 腳本收到一個上傳檔案時,解釋程式將自動檢查$_POST數組中名為APC_UPLOAD_PROGRESS 的隱藏字段,它將成為快取變量,儲存關於上傳的信息,這樣腳本就可以透過上傳的ID來存取上傳檔案的狀態資訊。
APC是Alternative PHP Cache的簡稱,是 PHP 的一個免費公開的最佳化程式碼快取。它用來提供免費,公開且強健的架構來快取和最佳化 PHP 的中間程式碼。
APC模組的參數配置,程式碼如下:
Name Default Changeable Changelog apc.enabled 1 PHP_INI_ALL apc.shm_segments 1 PHP_INI_SYSTEM apc.shm_size 30 PHP_INI_SYSTEM apc.optimization 0 PHP_INI_ALL apc.num_files_hint 1000 PHP_INI_SYSTEM apc.ttl 0 PHP_INI_SYSTEM apc.gc_ttl 3600 PHP_INI_SYSTEM apc.cache_by_default On PHP_INI_SYSTEM apc.filters "" PHP_INI_SYSTEM apc.mmap_file_mask "" PHP_INI_SYSTEM apc.slam_defense 0 PHP_INI_SYSTEM apc.file_update_protection 2 PHP_INI_SYSTEM apc.enable_cli 0 PHP_INI_SYSTEM > APC 3.0.6
好了設定好了現在就開始寫程式了
XML/HTML程式碼如下:
<!–以下为上传表单–> <form enctype="multipart/form-data" id="upload_form" action="" method="POST"> <input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="upid"/> 视频标题:<input type="text" id="subject" name="subject"/> 视频说明:<input type="text" id="content" name="content"/> 视频TAG(以逗号分割)<input type="text" id="tag" name="tags"/> <input type="file" id="upfile" name="upfile"/> <input type="submit" id="filesubmit" value="上传" onclick="startProgress('upid'); return true;"/> <!–注意:startProgress('upid')中的参数是你从php中分配的唯一上传参数–> </form> <!–以下为上传进度条–> <p id="upstatus" style="width: 500px; height: 30px; border: 1px solid ##ffffde; color:#796140;"> </p <p id="progressouter" style="width: 500px; height: 20px; border: 3px solid #de7e00; display:none;"> <p id="progressinner" style="position: relative; height: 20px; color:#796140; background-color: #f6d095; width: 0%; "></p> </p>
最主要的就是那個APC_UPLOAD_PROGRESS的隱藏域,有了它腳本才能去訪問目前上傳文件的狀態,另外加一個顯示上傳狀態的p就好了.
下面是處理Ajax的腳本,我用了Jquery框架,json傳遞訊息.
JavaScript程式碼如下:
function getProgress(upid){ var url = "<{$siteurl}>epadmin/upprocess"; $.getJSON( url, { progress_key: upid }, function(json){ $("#progressinner").width(json.per+"%"); $("#upstatus").html('文件大小:'+json.total+'KB'+' 已上传:'+json.current+'KB'); if (json.per < 100){ setTimeout(function(){ getProgress(upid); }, 10); }else{ $("#upstatus").html("视频上传完成,正在处理数据,请稍后……"); } } ) } function startProgress(upid){ $("#progressouter").css({ display:"block" }); setTimeout(function(){ getProgress(upid); }, 100); }
再下面就是讀取上傳狀態的PHP程式碼了,至於上傳檔案的處理可以按照平常自己的來寫,程式碼如下:
//上传文件操作函数,可按照自己的需要编写 function upflvAction() { if($_SERVER['REQUEST_METHOD']=='POST'){ $subject = trim($this->f->filter($this->_request->getPost('subject'))); $content = trim($this->f->filter($this->_request->getPost('content'))); Zend_Loader::loadClass('Custom_FlvOp'); $flv = new Custom_FlvOp; $flv->uploadFlv('upfile',$subject,$content); } } //这就是读取上传状态的函数了~~ function upprocessAction() { if(isset($_GET['progress_key'])) { $status = apc_fetch('upload_'.$_GET['progress_key']); $json = array( 'per'=>$status['current']/$status['total']*100, 'total'=>round($status['total']/1024), 'current'=>round($status['current']/1024), ); require_once("Zend/Json.php"); echo Zend_Json::encode($json); } }
一些關於apc配置詳解:
apc.enabled 布林型
apc.enabled 可以被設為0 來停用APC,這主要是有用的,當APC 被靜態編譯入PHP 時,因為沒有其它方法來禁用它,當編譯為DSO 的時候,可以將php.ini 中的extension 行註解掉.
apc.shm_segments 整數
#對編譯快取分配共享記憶體區塊的數量,如果APC用光了共享記憶體,而且你已經設定apc.shm_size為系統允許的最大值的情況下,你可以試著去提高這個參數的值.
apc.shm_size 整數
每個共享記憶體區塊的大小是以MB為單位的。在預設情況下,一些系統(包括大多數BSD變種系統)的共享記憶體區塊的大小限制的很低。
apc.optimization 整數
最佳化等級。設為0則停用最佳化,越高的值使用越強有力的最佳化。期待有適度的速度上的改進。這個還是實驗性質的。
apc.num_files_hint 整數
對在你的Web伺服器上被包含和請求的不同的來源檔案的數量的提示。如果你無法確定,設定為0或省略;這個設定主要可能用於有成千的來源檔案的網站。
apc.ttl 整數
當一個快取條目在快取區的位置被另一個條目需要時,我們需要考慮的是這個快取條目在快取區的位置被允許空閒的秒數。將這個參數設為0意味著你的快取可能充滿不新鮮的條目,同時導致新的條目無法被快取。
apc.gc_ttl 整數
快取條目在垃圾收集清單中存活的秒數。這個值提供了出錯保護在執行一個快取來源文件,而同時伺服器進程死了的事件中。如果那個來源檔案被修改,記憶體分配給舊版本的快取條目將不會被回收,直到這個參數設定的TTL值到的時候。設定為0就是禁止這個特性。
apc.cache_by_default 布林類型
預設為On,但可以設定為Off並和以加號開頭的apc.filters配合使用,檔案僅在匹配過濾器時才被緩存。
apc.filters 字串
一個以逗號分割的POSIX擴充正規表示式的清單。如果任何模式匹配來源檔案名,這個檔案將不會被快取。注意用來匹配的檔名是傳遞給 include/require 的檔名,而不是絕對路徑。如果正規表示式的第一個字元是 + ,則這個表達式意味著任何符合表達式的檔案將會被緩存,如果第一個字元是 - 則任何符合都不會被快取。 - 是預設值,所以可以省略。
apc.mmap_file_mask 字串
apc.slam_defense 整數
在非常繁忙的伺服器上,無論你啟動服務還是修改文件,你都會導致一種多進程都試圖在同一個時間緩存同一個文件的競爭。這個選項設定了進程跳過試圖去快取一個未被快取的檔案的百分比。或者可以把這個想像成一個單獨進程跳過快取的機率。例如,設定apc.slam_defense為75表示進程有75%的機率不去快取未被快取的檔案。所以,設定的越高,越能減少快取的碰撞機率。設定為0則禁用這個特性。
apc.file_update_protection 整數型
當你在一個運作的伺服器上修改檔案時,你應該執行原子運算。也就是,先寫一個臨時文件,寫完後再重命名(mv)這個文件到它的最終位置。許多文字編輯器,cp,tar和其他一些類似程式都不是這樣操作的。這意味著有機會去存取和(快取)文件,當這個文件還在被寫的情況下。 apc.file_update_protection的設定使得快取標記新檔案的延遲。預設值是2,表示如果發現檔案的修改時間距離存取時間不到2秒,檔案將不會被快取。訪問寫到一半的文件的不幸用戶將會看到離奇的情況,但至少這種情況不是持續的。如果你確信你經常使用原子操作來更新你的文件,你可以關閉這個保護透過設定這個參數為0。如果你的系統充滿io操作,並導致更新程式花費超過2秒,你可能需要去增加這個值。
apc.enable-cli 整數
大多是為了測試和調試,為CLI版本的PHP開啟動APC功能,一般來說,你將不會想到為每一個CLI請求創建,移植和放棄APC的快取,但對於各種測試情況,這是很容易的為了CLI版本開啟APC.
##相關推薦:
Memcached PHP Memcached + APC + 檔案快取封裝實作程式碼
以上是PHP利用APC模組實作上傳進度條的實例分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!