国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 開發(fā) > PHP > 正文

PHP中利用APC模塊實現(xiàn)文件上傳進度條

2024-05-04 21:48:34
字體:
供稿:網(wǎng)友

以前的php5.2之前的版本是不能可使用APC模塊的,因為之前的壓根就沒有這個APC模塊,如果想使用APC模塊實現(xiàn)上傳進度條我們必須是php5.2或更高版本.

從5.2開始APC加入了一個叫APC_UPLOAD_PROGRESS的東東,解決了困擾大家已久的進度條問題。并且它把原來的上傳時把臨時文件全部緩存到內(nèi)存改成了當臨時文件達到設(shè)定值時就自動保存到硬盤,有效地改善了內(nèi)存利用狀況。

它的作用原理是在上傳時候賦予每個上傳一個唯一的ID,當 PHP 腳本收到一個上傳文件時,解釋程序?qū)⒆詣訖z查 $_POST數(shù)組中名為 APC_UPLOAD_PROGRESS 的隱藏字段,它將成為緩存變量,存儲關(guān)于上傳的信息,這樣腳本就可以通過上傳的ID來訪問上傳文件的狀態(tài)信息。

APC是Alternative PHP Cache的簡稱,是 PHP 的一個免費公開的優(yōu)化代碼緩存。它用來提供免費,公開并且強健的架構(gòu)來緩存和優(yōu)化 PHP 的中間代碼。

APC模塊的參數(shù)配置,代碼如下:

  1. Name Default Changeable Changelog  
  2. apc.enabled 1 PHP_INI_ALL  
  3. apc.shm_segments 1 PHP_INI_SYSTEM  
  4. apc.shm_size 30 PHP_INI_SYSTEM  
  5. apc.optimization 0 PHP_INI_ALL  
  6. apc.num_files_hint 1000 PHP_INI_SYSTEM  
  7. apc.ttl 0 PHP_INI_SYSTEM  
  8. apc.gc_ttl 3600 PHP_INI_SYSTEM  
  9. apc.cache_by_default On PHP_INI_SYSTEM  
  10. apc.filters "" PHP_INI_SYSTEM  
  11. apc.mmap_file_mask "" PHP_INI_SYSTEM  
  12. apc.slam_defense 0 PHP_INI_SYSTEM  
  13. apc.file_update_protection 2 PHP_INI_SYSTEM  
  14. apc.enable_cli 0 PHP_INI_SYSTEM > APC 3.0.6 

好了配置好了現(xiàn)在就開始寫程序了

XML/HTML代碼如下:

  1. <!–以下為上傳表單–>  
  2. <form enctype="multipart/form-data" id="upload_form" action="" method="POST">  
  3. <input type="hidden" name="APC_UPLOAD_PROGRESS" id="progress_key" value="upid"/>  
  4. 視頻標題:<input type="text" id="subject" name="subject"/>  
  5. 視頻說明:<input type="text" id="content" name="content"/>  
  6. 視頻TAG(以逗號分割)<input type="text" id="tag" name="tags"/>  
  7. <input type="file" id="upfile" name="upfile"/>  
  8. <input type="submit" id="filesubmit" value="上傳" onclick="startProgress(‘upid’); return true;"/>  
  9. <!–注意:startProgress(‘upid’)中的參數(shù)是你從php中分配的唯一上傳參數(shù)–>  
  10. </form>  
  11. <!–以下為上傳進度條–>  
  12. <div id="upstatus" style="width: 500px; height: 30px; border: 1px solid ##ffffde; color:#796140;">  
  13. </div  
  14. <div id="progressouter" style="width: 500px; height: 20px; border: 3px solid #de7e00; display:none;">  
  15. <div id="progressinner" style="position: relative; height: 20px; color:#796140; background-color: #f6d095; width: 0%; "></div>  
  16. </div> 

最主要的就是那個APC_UPLOAD_PROGRESS的隱藏域,有了它腳本才能去訪問目前上傳文件的狀態(tài),另外加一個顯示上傳狀態(tài)的div就好了.

下面是處理Ajax的腳本,我用了Jquery框架,json傳遞消息.

JavaScript代碼如下:

  1. function getProgress(upid){  
  2. var url = "<{$siteurl}>epadmin/upprocess";  
  3. $.getJSON(  
  4. url,  
  5. { progress_key: upid },  
  6. function(json){  
  7. $("#progressinner").width(json.per+"%");  
  8. $("#upstatus").html(‘文件大小:’+json.total+‘KB’+‘ 已上傳:’+json.current+‘KB’);  
  9. if (json.per < 100){  
  10. setTimeout(function(){  
  11. getProgress(upid);  
  12. }, 10);  
  13. }else{  
  14. $("#upstatus").html("視頻上傳完成,正在處理數(shù)據(jù),請稍后……");  
  15. }  
  16. }  
  17. )  
  18. }  
  19. function startProgress(upid){  
  20. $("#progressouter").css({ display:"block" });  
  21. setTimeout(function(){  
  22. getProgress(upid);  
  23. }, 100);  
再下面就是讀取上傳狀態(tài)的PHP代碼了,至于上傳文件的處理可以按照平常自己的來寫,代碼如下:
  1. //上傳文件操作函數(shù),可按照自己的需要編寫  
  2. function upflvAction()  
  3. {  
  4. if($_SERVER['REQUEST_METHOD']==‘POST’){  
  5. $subject = trim($this->f->filter($this->_request->getPost(‘subject’)));  
  6. $content = trim($this->f->filter($this->_request->getPost(‘content’)));  
  7. Zend_Loader::loadClass(‘Custom_FlvOp’);  
  8. $flv = new Custom_FlvOp;  
  9. $flv->uploadFlv(‘upfile’,$subject,$content);  
  10. //開源代碼Vevb.com 
  11. }  
  12. //這就是讀取上傳狀態(tài)的函數(shù)了~~  
  13. function upprocessAction()  
  14. {   
  15. if(isset($_GET['progress_key'])) {  
  16. $status = apc_fetch(‘upload_’.$_GET['progress_key']);  
  17. $json = array(  
  18. ‘per’=>$status['current']/$status['total']*100,  
  19. ‘total’=>round($status['total']/1024),  
  20. ‘current’=>round($status['current']/1024),  
  21. );  
  22. require_once("Zend/Json.php");  
  23. echo Zend_Json::encode($json);  
  24. }  

一些關(guān)于apc配置詳解:

apc.enabled  布爾型

apc.enabled 可以被設(shè)成 0 來禁用 APC,這主要是有用的,當 APC 被靜態(tài)編譯入 PHP 時,因為沒有其它方法來禁用它,當編譯為 DSO 的時候,可以將 php.ini 中的 extension 行注釋掉.

apc.shm_segments  整型

對編譯緩存分配共享內(nèi)存塊的數(shù)量,如果APC用光了共享內(nèi)存,而且你已經(jīng)設(shè)置 apc.shm_size為系統(tǒng)允許的最大值的情況下,你可以試著去提高這個參數(shù)的值.

apc.shm_size  整型 

每個共享內(nèi)存塊的大小是以MB為單位的。在默認情況下,一些系統(tǒng)(包括大多數(shù)BSD變種系統(tǒng))的共享內(nèi)存塊的大小限制的很低。

apc.optimization  整型

優(yōu)化等級。設(shè)為0則禁用優(yōu)化,越高的值使用越強有力的優(yōu)化。期待有適度的速度上的改進。這個還是實驗性質(zhì)的。

apc.num_files_hint  整型

對在你的Web服務(wù)器上被包含和請求的不同的源文件的數(shù)量的提示。如果你無法確定,設(shè)置為0或者省略;這個設(shè)置主要可能用于有成千的源文件的站點。

apc.ttl  整型

當一個緩存條目在緩存區(qū)的位置被另一個條目需要時,我們需要考慮的是這個緩存條目在緩存區(qū)的位置被允許空閑的秒數(shù)。將這個參數(shù)設(shè)置為0意味著你的緩存可能充滿不新鮮的條目,同時導致新的條目無法被緩存。

apc.gc_ttl  整型

緩存條目在垃圾收集列表中存活的秒數(shù)。這個值提供了出錯保護在執(zhí)行一個緩存源文件,而同時服務(wù)器進程死了的事件中。如果那個源文件被修改,內(nèi)存分配給舊版本的緩存條目將不會被回收,直到這個參數(shù)設(shè)定的TTL值到的時候。設(shè)置為0就是禁止這個特性。

apc.cache_by_default  布爾型

默認為On,但可以被設(shè)置為Off并和以加號開頭的apc.filters配合使用,文件僅僅在匹配過濾器時才被緩存。

apc.filters  字符串

一個以逗號分割的POSIX擴展正則表達式的列表。如果任何模式匹配源文件名,這個文件將不會被緩存。注意用來匹配的文件名是傳遞給 include/require 的文件名,而不是絕對路徑。如果正則表達式的第一個字符是 + ,則這個表達式就意味著任何匹配表達式的文件將會被緩存,如果第一個字符是 - 則任何匹配都不會被緩存。 - 是默認值,所以可以被省略。

apc.mmap_file_mask  字符串

apc.slam_defense  整型

在非常繁忙的服務(wù)器上,無論你啟動服務(wù)還是修改文件,你都會導致一種多進程都試圖在同一個時間緩存同一個文件的競爭。這個選項設(shè)置了進程跳過試圖去緩存一個未被緩存的文件的百分比。或者可以把這個想象成一個單獨進程跳過緩存的機率。例如,設(shè)置apc.slam_defense為75就意味著進程有75%的機率不去緩存未被緩存的文件。所以,設(shè)置的越高,越能減少緩存的碰撞機率。設(shè)置為0則禁用這個特性。

apc.file_update_protection  整型

當你在一個運行著的服務(wù)器上修改文件時,你應(yīng)該執(zhí)行原子操作。也就是,先寫一個臨時文件,當寫完后再重命名(mv)這個文件到它的最終位置。許多文本編輯器,cp,tar和其他一些類似程序都不是這樣操作的。這就意味著有機會去訪問和(緩存)文件,當這個文件還在被寫的情況下。apc.file_update_protection的設(shè)置使得緩存標記新文件的延遲。默認值是2,意味著如果發(fā)現(xiàn)文件的修改時間距離訪問時間不到2秒,文件將不會被緩存。訪問寫到一半的文件的不幸用戶將會看到離奇的情況,但至少這種情況不是持續(xù)的。如果你確信你經(jīng)常使用原子操作來更新你的文件,你可以關(guān)閉這個保護通過設(shè)置這個參數(shù)為0。如果你的系統(tǒng)充滿io操作,并導致更新程序花費超過2秒,你可能需要去增大這個值。

apc.enable-cli  整型

大多是為了測試和調(diào)試,為CLI版本的PHP開啟動APC功能,一般來說,你將不會想到為每一個 CLI請求創(chuàng)建,移植和放棄APC的緩存,但對于各種測試情況,這是很容易的為了CLI版本開啟APC.

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 邵阳县| 宜黄县| 永春县| 邳州市| 旺苍县| 托克逊县| 大田县| 基隆市| 定日县| 应城市| 沧源| 当涂县| 上林县| 景东| 蒙自县| 班玛县| 宁强县| 吉木萨尔县| 新平| 揭西县| 东山县| 轮台县| 措勤县| 兴隆县| 丹阳市| 扎兰屯市| 八宿县| 益阳市| 西吉县| 泉州市| 大足县| 手游| 临沭县| 临夏市| 磐石市| 普宁市| 五指山市| 连平县| 武安市| 南乐县| 新安县|