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 set_magic_quotes_runtime() 函数过时解决方法
Jul 08 PHP
php垃圾代码优化操作代码
Aug 05 PHP
在项目中寻找代码的坏命名
Jul 14 PHP
如何使用PHP计算上一个月的今天
May 23 PHP
php下载文件源代码(强制任意文件格式下载)
May 09 PHP
php生成百度sitemap站点地图类函数实例
Oct 17 PHP
php使用google地图应用实例
Dec 31 PHP
PHP速成大法
Jan 30 PHP
PHP 实现类似js中alert() 提示框
Mar 18 PHP
PHP单链表的实现代码
Jul 05 PHP
thinkPHP实现签到功能的方法
Mar 15 PHP
PHP简单验证码功能机制实例详解
Mar 27 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中的函数嵌套层数限制分析
2011/06/13 PHP
php数组声明、遍历、数组全局变量使用小结
2013/06/05 PHP
php删除数组元素示例分享
2014/02/17 PHP
Yii控制器中操作视图js的方法
2016/07/04 PHP
jQuery滚动加载图片效果的实现
2013/03/06 Javascript
javascript实现简单的页面右下角提示信息框
2015/07/31 Javascript
jQuery超精致图片轮播幻灯片特效代码分享
2015/09/10 Javascript
使用Jasmine和Karma对AngularJS页面程序进行测试
2016/03/05 Javascript
js如何准确获取当前页面url网址信息
2020/09/13 Javascript
JS获取地址栏参数的两种方法(简单实用)
2016/06/14 Javascript
微信小程序开发实战教程之手势解锁
2016/11/18 Javascript
nodejs基础知识
2017/02/03 NodeJs
JavaScript提高加载和执行效率的方法
2017/02/03 Javascript
Vuex简单入门
2017/04/19 Javascript
bootstrap的工具提示实例代码
2017/05/17 Javascript
JS实现网页抢购功能(触发,终止脚本)
2017/11/27 Javascript
vue项目中用cdn优化的方法
2018/01/03 Javascript
[06:23]2014DOTA2西雅图国际邀请赛 小组赛7月12日TOPPLAY
2014/07/12 DOTA
[02:23]完美世界全国高校联赛街访DOTA2第一期
2019/11/28 DOTA
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
利用python编写一个图片主色转换的脚本
2017/12/07 Python
Python语言描述连续子数组的最大和
2018/01/04 Python
浅谈python正则的常用方法 覆盖范围70%以上
2018/03/14 Python
python多进程提取处理大量文本的关键词方法
2018/06/05 Python
python opencv实现运动检测
2018/07/10 Python
Python3.5内置模块之os模块、sys模块、shutil模块用法实例分析
2019/04/27 Python
基于pytorch的保存和加载模型参数的方法
2019/08/17 Python
HTML5微信播放全屏问题的解决方法
2017/03/09 HTML / CSS
北美三大旅游网站之一:Travelocity加拿大
2016/08/20 全球购物
网上蛋糕店创业计划书
2014/01/24 职场文书
代理协议书
2014/04/22 职场文书
计算机专业自荐信
2014/05/24 职场文书
红色革命电影观后感
2015/06/18 职场文书
小学体育课教学反思
2016/02/16 职场文书
Mysql关于数据库是否应该使用外键约束详解说明
2021/10/24 MySQL
【D4DJ】美少女DJ企划 动画将于明年冬季开播第2季
2022/04/11 日漫