PHP利用APC模块实现文件上传进度条的方法


Posted in PHP onJanuary 26, 2015

本文实例讲述了PHP利用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>  

<!?以下为上传进度条?>  

<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>

最主要的就是那个APC_UPLOAD_PROGRESS的隐藏域,有了它脚本才能去访问目前上传文件的状态,另外加一个显示上传状态的div就好了.

下面是处理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.

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
PHP导航下拉菜单的实现如此简单
Sep 22 PHP
php指定函数参数默认值示例代码
Dec 04 PHP
分享一则PHP定义函数代码
Feb 26 PHP
php中使用sftp教程
Mar 30 PHP
php判断两个日期之间相差多少个月份的方法
Jun 18 PHP
基于PHP给大家讲解防刷票的一些技巧
Nov 18 PHP
PHP实现的oracle分页函数实例
Jan 25 PHP
ThinkPHP框架安全实现分析
Mar 14 PHP
PHP微信分享开发详解
Jan 14 PHP
PHP 实现字符串翻转(包含中文汉字)的实现代码
Apr 01 PHP
PHP http请求超时问题解决方案
Nov 13 PHP
PHP中->和=>的意思
Mar 31 PHP
php使用cookie保存用户登录的用户名实例
Jan 26 #PHP
PHP简单选择排序算法实例
Jan 26 #PHP
朋友网关于QQ相关的PHP代码(研究QQ的绝佳资料)
Jan 26 #PHP
php使用cookie显示用户上次访问网站日期的方法
Jan 26 #PHP
php批量删除cookie的简单实现方法
Jan 26 #PHP
php创建、获取cookie及基础要点分析
Jan 26 #PHP
php表单提交与$_POST实例分析
Jan 26 #PHP
You might like
利用PHP扩展vld查看PHP opcode操作步骤
2013/03/04 PHP
php绘制一个矩形的方法
2015/01/24 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
javascript 出生日期和身份证判断大全
2008/11/13 Javascript
一个cssQuery对象 javascript脚本实现代码
2009/07/21 Javascript
JQuery 将元素显示在屏幕的中央的代码
2010/02/27 Javascript
基于jquery的多彩百分比 动态进度条 投票效果显示效果实现代码
2011/08/28 Javascript
JavaScript加强之自定义callback示例
2013/09/21 Javascript
js控制input框只读实现示例
2014/01/20 Javascript
jQuery中clone()方法用法实例
2015/01/16 Javascript
jQuery判断checkbox选中状态
2016/05/12 Javascript
JavaScript实现url参数转成json形式
2016/09/25 Javascript
JQuery.validationEngine表单验证插件(推荐)
2016/12/10 Javascript
使用vue中的v-for遍历二维数组的方法
2018/03/07 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
2018/10/19 Javascript
微信小程序canvas.drawImage完全显示图片问题的解决
2018/11/30 Javascript
微信小程序+云开发实现欢迎登录注册
2019/05/24 Javascript
详解如何在JS代码中消灭for循环
2019/12/11 Javascript
JS错误处理与调试操作实例分析
2020/04/13 Javascript
[02:04]2014DOTA2国际邀请赛 BBC小组赛第三天总结
2014/07/12 DOTA
python中的装饰器详解
2015/04/13 Python
python 变量初始化空列表的例子
2019/11/28 Python
如何使用Python发送HTML格式的邮件
2020/02/11 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
2020/02/26 Python
Django自定义YamlField实现过程解析
2020/11/11 Python
HTML5中通过li-canvas轻松实现单图、多图、圆角图绘制,单行文字、多行文字等
2018/11/30 HTML / CSS
机电一体化职业规划书
2014/01/07 职场文书
小学综治宣传月活动总结
2014/07/02 职场文书
辩护词范文大全
2015/05/21 职场文书
2016年“9.22”世界无车日活动小结
2016/04/05 职场文书
导游词之太行山青龙峡
2020/01/14 职场文书
Python re.sub 反向引用的实现
2021/07/07 Python
openstack中的rpc远程调用的方法
2021/07/09 Python
python实现简单石头剪刀布游戏
2021/10/24 Python
动作冒险《Hell Is Us》将采用虚幻5 消灭怪物探索王国
2022/04/13 其他游戏
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript