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 相关文章推荐
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 PHP
php mssql 数据库分页SQL语句
Dec 16 PHP
关于PHP二进制流 逐bit的低位在前算法(详解)
Jun 13 PHP
PHP 简易输出CSV表格文件的方法详解
Jun 20 PHP
跟我学Laravel之配置Laravel
Oct 15 PHP
php防止站外远程提交表单的方法
Oct 20 PHP
浅谈php的优缺点
Jul 14 PHP
自制PHP框架之模型与数据库
May 07 PHP
PHP中递归的实现实例详解
Nov 14 PHP
php实现socket推送技术的示例
Dec 20 PHP
详解PHP神奇又有用的Trait
Mar 25 PHP
YII2框架中查询生成器Query()的使用方法示例
Mar 18 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中获取url与物理路径的总结
2013/06/21 PHP
php实现对两个数组进行减法操作的方法
2015/04/17 PHP
读JavaScript DOM编程艺术笔记
2011/11/15 Javascript
ExtJS4中使用mixins实现多继承示例
2013/12/03 Javascript
jquery遍历筛选数组的几种方法和遍历解析json对象
2013/12/13 Javascript
如何将网页表格内容导入excel
2014/02/18 Javascript
jQuery动态创建html元素的常用方法汇总
2014/09/05 Javascript
jQuery链使用指南
2015/01/20 Javascript
深入理解JavaScript系列(31):设计模式之代理模式详解
2015/03/03 Javascript
javascript设计模式--策略模式之输入验证
2015/11/27 Javascript
基于jQuery 实现bootstrapValidator下的全局验证
2015/12/07 Javascript
微信小程序 参数传递详解
2016/10/24 Javascript
Vue中引入样式文件的方法
2017/08/18 Javascript
zTree jQuery 树插件的使用(实例讲解)
2017/09/25 jQuery
如何在基于vue-cli的项目自定义打包环境
2018/11/10 Javascript
使用Vue父子组件通信实现todolist的功能示例代码
2019/04/11 Javascript
用Vue编写抽象组件的方法
2019/05/06 Javascript
[36:43]NB vs Optic 2018国际邀请赛小组赛BO1 B组加赛 8.19
2018/08/21 DOTA
使用PYTHON创建XML文档
2012/03/01 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
详解Python 协程的详细用法使用和例子
2018/06/15 Python
解决python中遇到字典里key值为None的情况,取不出来的问题
2018/10/17 Python
Python面向对象程序设计构造函数和析构函数用法分析
2019/04/12 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
python列表推导式入门学习解析
2019/12/02 Python
Python可以实现栈的结构吗
2020/05/27 Python
python源文件的字符编码知识点详解
2021/03/04 Python
梅西百货官网:Macy’s
2020/08/04 全球购物
财务会计专业个人求职信范本
2014/01/08 职场文书
测试工程师职业规划书
2014/02/06 职场文书
工作分析计划书
2014/04/30 职场文书
英语专业求职信
2014/07/08 职场文书
详细的本科生职业生涯规划范文
2014/09/16 职场文书
期末复习计划
2015/01/19 职场文书
2015年全民国防教育日活动总结
2015/03/23 职场文书
Python编程中内置的NotImplemented类型的用法
2022/03/23 Python