PHP利用APC模塊實(shí)現(xiàn)文件上傳進(jìn)度條的方法
本文實(shí)例講述了PHP利用APC模塊實(shí)現(xiàn)文件上傳進(jìn)度條的方法。分享給大家供大家參考。具體分析如下:
以前的php5.2之前的版本是不能可使用APC模塊的,因?yàn)橹暗膲焊蜎](méi)有這個(gè)APC模塊,如果想使用APC模塊實(shí)現(xiàn)上傳進(jìn)度條我們必須是php5.2或更高版本.
從5.2開(kāi)始APC加入了一個(gè)叫APC_UPLOAD_PROGRESS的東東,解決了困擾大家已久的進(jìn)度條問(wèn)題。并且它把原來(lái)的上傳時(shí)把臨時(shí)文件全部緩存到內(nèi)存改成了當(dāng)臨時(shí)文件達(dá)到設(shè)定值時(shí)就自動(dòng)保存到硬盤,有效地改善了內(nèi)存利用狀況。
它的作用原理是在上傳時(shí)候賦予每個(gè)上傳一個(gè)唯一的ID,當(dāng) PHP 腳本收到一個(gè)上傳文件時(shí),解釋程序?qū)⒆詣?dòng)檢查 $_POST數(shù)組中名為 APC_UPLOAD_PROGRESS 的隱藏字段,它將成為緩存變量,存儲(chǔ)關(guān)于上傳的信息,這樣腳本就可以通過(guò)上傳的ID來(lái)訪問(wèn)上傳文件的狀態(tài)信息。
APC是Alternative PHP Cache的簡(jiǎn)稱,是 PHP 的一個(gè)免費(fèi)公開(kāi)的優(yōu)化代碼緩存。它用來(lái)提供免費(fèi),公開(kāi)并且強(qiáng)健的架構(gòu)來(lái)緩存和優(yōu)化 PHP 的中間代碼。
APC模塊的參數(shù)配置,代碼如下:
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
好了配置好了現(xiàn)在就開(kāi)始寫(xiě)程序了
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"/>
視頻標(biāo)題:<input type="text" id="subject" name="subject"/>
視頻說(shuō)明:<input type="text" id="content" name="content"/>
視頻TAG(以逗號(hào)分割)<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')中的參數(shù)是你從php中分配的唯一上傳參數(shù)–>
</form>
<!–以下為上傳進(jìn)度條–>
<div id="upstatus" style="width: 500px; height: 30px; border: 1px solid ##ffffde; color:#796140;">
</div
<div id="progressouter" style="width: 500px; height: 20px; border: 3px solid #de7e00; display:none;">
<div id="progressinner" style="position: relative; height: 20px; color:#796140; background-color: #f6d095; width: 0%; "></div>
</div>
最主要的就是那個(gè)APC_UPLOAD_PROGRESS的隱藏域,有了它腳本才能去訪問(wèn)目前上傳文件的狀態(tài),另外加一個(gè)顯示上傳狀態(tài)的div就好了.
下面是處理Ajax的腳本,我用了Jquery框架,json傳遞消息.
JavaScript代碼如下:
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("視頻上傳完成,正在處理數(shù)據(jù),請(qǐng)稍后……");
}
}
)
}
function startProgress(upid){
$("#progressouter").css({ display:"block" });
setTimeout(function(){
getProgress(upid);
}, 100);
}
再下面就是讀取上傳狀態(tài)的PHP代碼了,至于上傳文件的處理可以按照平常自己的來(lái)寫(xiě),代碼如下:
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);
}
}
//這就是讀取上傳狀態(tài)的函數(shù)了~~
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);
}
}
一些關(guān)于apc配置詳解:
apc.enabled 布爾型
apc.enabled 可以被設(shè)成 0 來(lái)禁用 APC,這主要是有用的,當(dāng) APC 被靜態(tài)編譯入 PHP 時(shí),因?yàn)闆](méi)有其它方法來(lái)禁用它,當(dāng)編譯為 DSO 的時(shí)候,可以將 php.ini 中的 extension 行注釋掉.
apc.shm_segments 整型
對(duì)編譯緩存分配共享內(nèi)存塊的數(shù)量,如果APC用光了共享內(nèi)存,而且你已經(jīng)設(shè)置 apc.shm_size為系統(tǒng)允許的最大值的情況下,你可以試著去提高這個(gè)參數(shù)的值.
apc.shm_size 整型
每個(gè)共享內(nèi)存塊的大小是以MB為單位的。在默認(rèn)情況下,一些系統(tǒng)(包括大多數(shù)BSD變種系統(tǒng))的共享內(nèi)存塊的大小限制的很低。
apc.optimization 整型
優(yōu)化等級(jí)。設(shè)為0則禁用優(yōu)化,越高的值使用越強(qiáng)有力的優(yōu)化。期待有適度的速度上的改進(jìn)。這個(gè)還是實(shí)驗(yàn)性質(zhì)的。
apc.num_files_hint 整型
對(duì)在你的Web服務(wù)器上被包含和請(qǐng)求的不同的源文件的數(shù)量的提示。如果你無(wú)法確定,設(shè)置為0或者省略;這個(gè)設(shè)置主要可能用于有成千的源文件的站點(diǎn)。
apc.ttl 整型
當(dāng)一個(gè)緩存條目在緩存區(qū)的位置被另一個(gè)條目需要時(shí),我們需要考慮的是這個(gè)緩存條目在緩存區(qū)的位置被允許空閑的秒數(shù)。將這個(gè)參數(shù)設(shè)置為0意味著你的緩存可能充滿不新鮮的條目,同時(shí)導(dǎo)致新的條目無(wú)法被緩存。
apc.gc_ttl 整型
緩存條目在垃圾收集列表中存活的秒數(shù)。這個(gè)值提供了出錯(cuò)保護(hù)在執(zhí)行一個(gè)緩存源文件,而同時(shí)服務(wù)器進(jìn)程死了的事件中。如果那個(gè)源文件被修改,內(nèi)存分配給舊版本的緩存條目將不會(huì)被回收,直到這個(gè)參數(shù)設(shè)定的TTL值到的時(shí)候。設(shè)置為0就是禁止這個(gè)特性。
apc.cache_by_default 布爾型
默認(rèn)為On,但可以被設(shè)置為Off并和以加號(hào)開(kāi)頭的apc.filters配合使用,文件僅僅在匹配過(guò)濾器時(shí)才被緩存。
apc.filters 字符串
一個(gè)以逗號(hào)分割的POSIX擴(kuò)展正則表達(dá)式的列表。如果任何模式匹配源文件名,這個(gè)文件將不會(huì)被緩存。注意用來(lái)匹配的文件名是傳遞給 include/require 的文件名,而不是絕對(duì)路徑。如果正則表達(dá)式的第一個(gè)字符是 + ,則這個(gè)表達(dá)式就意味著任何匹配表達(dá)式的文件將會(huì)被緩存,如果第一個(gè)字符是 - 則任何匹配都不會(huì)被緩存。 - 是默認(rèn)值,所以可以被省略。
apc.mmap_file_mask 字符串
apc.slam_defense 整型
在非常繁忙的服務(wù)器上,無(wú)論你啟動(dòng)服務(wù)還是修改文件,你都會(huì)導(dǎo)致一種多進(jìn)程都試圖在同一個(gè)時(shí)間緩存同一個(gè)文件的競(jìng)爭(zhēng)。這個(gè)選項(xiàng)設(shè)置了進(jìn)程跳過(guò)試圖去緩存一個(gè)未被緩存的文件的百分比?;蛘呖梢园堰@個(gè)想象成一個(gè)單獨(dú)進(jìn)程跳過(guò)緩存的機(jī)率。例如,設(shè)置apc.slam_defense為75就意味著進(jìn)程有75%的機(jī)率不去緩存未被緩存的文件。所以,設(shè)置的越高,越能減少緩存的碰撞機(jī)率。設(shè)置為0則禁用這個(gè)特性。
apc.file_update_protection 整型
當(dāng)你在一個(gè)運(yùn)行著的服務(wù)器上修改文件時(shí),你應(yīng)該執(zhí)行原子操作。也就是,先寫(xiě)一個(gè)臨時(shí)文件,當(dāng)寫(xiě)完后再重命名(mv)這個(gè)文件到它的最終位置。許多文本編輯器,cp,tar和其他一些類似程序都不是這樣操作的。這就意味著有機(jī)會(huì)去訪問(wèn)和(緩存)文件,當(dāng)這個(gè)文件還在被寫(xiě)的情況下。apc.file_update_protection的設(shè)置使得緩存標(biāo)記新文件的延遲。默認(rèn)值是2,意味著如果發(fā)現(xiàn)文件的修改時(shí)間距離訪問(wèn)時(shí)間不到2秒,文件將不會(huì)被緩存。訪問(wèn)寫(xiě)到一半的文件的不幸用戶將會(huì)看到離奇的情況,但至少這種情況不是持續(xù)的。如果你確信你經(jīng)常使用原子操作來(lái)更新你的文件,你可以關(guān)閉這個(gè)保護(hù)通過(guò)設(shè)置這個(gè)參數(shù)為0。如果你的系統(tǒng)充滿io操作,并導(dǎo)致更新程序花費(fèi)超過(guò)2秒,你可能需要去增大這個(gè)值。
apc.enable-cli 整型
大多是為了測(cè)試和調(diào)試,為CLI版本的PHP開(kāi)啟動(dòng)APC功能,一般來(lái)說(shuō),你將不會(huì)想到為每一個(gè) CLI請(qǐng)求創(chuàng)建,移植和放棄APC的緩存,但對(duì)于各種測(cè)試情況,這是很容易的為了CLI版本開(kāi)啟APC.
希望本文所述對(duì)大家的php程序設(shè)計(jì)有所幫助。
- PHP中使用Session配合Javascript實(shí)現(xiàn)文件上傳進(jìn)度條功能
- PHP使用Session實(shí)現(xiàn)上傳進(jìn)度功能詳解
- PHP實(shí)現(xiàn)提高SESSION響應(yīng)速度的幾種方法詳解
- PHP Session 變量的使用方法詳解與實(shí)例代碼
- PHP session有效期問(wèn)題
- 詳解php設(shè)置session(過(guò)期、失效、有效期)
- PHP中session使用方法詳解
- PHP會(huì)話控制:Session與Cookie詳解
- PHP 文件上傳進(jìn)度條的兩種實(shí)現(xiàn)方法的代碼
- php ajax實(shí)現(xiàn)文件上傳進(jìn)度條
- PHP實(shí)現(xiàn)帶進(jìn)度條的Ajax文件上傳功能示例
- PHP基于session.upload_progress 實(shí)現(xiàn)文件上傳進(jìn)度顯示功能詳解
相關(guān)文章
PHP+.htaccess實(shí)現(xiàn)全站靜態(tài)HTML文件GZIP壓縮傳輸(一)
PHP+.htaccess實(shí)現(xiàn)全站靜態(tài)HTML文件GZIP壓縮傳輸(一)...2007-02-02
php中使用ExcelFileParser處理excel獲得數(shù)據(jù)(可作批量導(dǎo)入到數(shù)據(jù)庫(kù)使用)
使用ExcelFileParser處理excel獲得數(shù)據(jù) 可以用作批量導(dǎo)入到數(shù)據(jù)庫(kù)使用,需要獲取excel數(shù)據(jù)的朋友可以參考下。2010-08-08
PHP浮點(diǎn)數(shù)的一個(gè)常見(jiàn)問(wèn)題
本文主要給大家詳細(xì)介紹了下php的浮點(diǎn)數(shù),以及在應(yīng)用中關(guān)于浮點(diǎn)數(shù)的一個(gè)小問(wèn)題,有需要的小伙伴可以參考下2016-03-03
PHP實(shí)現(xiàn)用戶認(rèn)證與權(quán)限管理的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了PHP實(shí)現(xiàn)用戶認(rèn)證與權(quán)限管理的實(shí)現(xiàn),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-01-01
thinkphp5 migrate數(shù)據(jù)庫(kù)遷移工具
這里講述的是tp5 migrate數(shù)據(jù)庫(kù)遷移工具的相關(guān)介紹,非常的簡(jiǎn)單實(shí)用,有需要的小伙伴可以來(lái)看下本文的實(shí)例2018-02-02
php使用parse_str實(shí)現(xiàn)查詢字符串解析到變量中的方法
這篇文章主要介紹了php使用parse_str實(shí)現(xiàn)查詢字符串解析到變量中的方法,較為詳細(xì)的分析了parse_str()函數(shù)的功能及字符串解析為變量的具體用法,并總結(jié)了使用中的相關(guān)注意事項(xiàng),需要的朋友可以參考下2017-02-02
php中jQuery插件autocomplate的簡(jiǎn)單使用筆記
剛接觸jQuery,時(shí)間不太長(zhǎng),以下文章只限于參考使用。查了一部分資料,最后終于寫(xiě)成功了,只是單純的實(shí)現(xiàn),其它的特殊用法還沒(méi)有進(jìn)行深入研究,簡(jiǎn)單貼出來(lái),希望可以給新手一個(gè)參考2012-06-06

