>  기사  >  백엔드 개발  >  업로드 진행률 표시줄을 구현하기 위해 APC 모듈을 사용하는 PHP 공유 예

업로드 진행률 표시줄을 구현하기 위해 APC 모듈을 사용하는 PHP 공유 예

*文
*文원래의
2017-12-25 14:13:311483검색

이 글에서는 주로 PHP가 APC 모듈을 사용하여 파일 업로드 진행률 표시줄을 구현하는 방법을 소개하고, APC 모듈의 구체적인 사용법을 분석하고, 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(&#39;upid&#39;); return true;"/>  
<!–注意:startProgress(&#39;upid&#39;)中的参数是你从php中分配的唯一上传参数–>  
</form>  
<!–以下为上传进度条–>  
<p id="upstatus" style="width: 500px; height: 30px; border: 1px solid ##ffffde; color:#796140;">  
</p  
<p id="progressouter" style="width: 500px; height: 20px; border: 3px solid #de7e00; display:none;">  
<p id="progressinner" style="position: relative; height: 20px; color:#796140; background-color: #f6d095; width: 0%; "></p>  
</p>

The 가장 중요한 것은 APC_UPLOAD_PROGRESS의 숨겨진 필드입니다. 이 스크립트를 사용하면 현재 업로드된 파일의 상태에 액세스하고 p를 추가하여 업로드 상태를 표시할 수 있습니다.

다음은 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(&#39;文件大小:&#39;+json.total+&#39;KB&#39;+&#39; 已上传:&#39;+json.current+&#39;KB&#39;);  
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[&#39;REQUEST_METHOD&#39;]==&#39;POST&#39;){  
$subject = trim($this->f->filter($this->_request->getPost(&#39;subject&#39;)));  
$content = trim($this->f->filter($this->_request->getPost(&#39;content&#39;)));  
Zend_Loader::loadClass(&#39;Custom_FlvOp&#39;);  
$flv = new Custom_FlvOp;  
$flv->uploadFlv(&#39;upfile&#39;,$subject,$content);  
}
}  
//这就是读取上传状态的函数了~~  
function upprocessAction()  
{   
if(isset($_GET[&#39;progress_key&#39;])) {  
$status = apc_fetch(&#39;upload_&#39;.$_GET[&#39;progress_key&#39;]);  
$json = array(  
&#39;per&#39;=>$status[&#39;current&#39;]/$status[&#39;total&#39;]*100,  
&#39;total&#39;=>round($status[&#39;total&#39;]/1024),  
&#39;current&#39;=>round($status[&#39;current&#39;]/1024),  
);  
require_once("Zend/Json.php");  
echo Zend_Json::encode($json);  
}  
}


apc 구성에 대한 자세한 설명:

apc.enabled Boolean

apc.enabled를 0으로 설정하면 APC가 정적으로 컴파일될 때 유용합니다. PHP를 비활성화할 수 있는 다른 방법이 없기 때문에 DSO로 컴파일할 때 php.ini에서 확장 라인을 주석 처리할 수 있습니다.

apc.shm_segments 정수

컴파일 캐시에 할당된 공유 메모리 블록 수 APC에 공유 메모리가 부족하며 apc.shm_size를 시스템에서 허용하는 최대값으로 설정했습니다. 값의 경우 이 매개변수의 값을 늘릴 수 있습니다.

apc.shm_size Integer

각 크기 공유 메모리 블록은 MB 단위입니다. 기본적으로 일부 시스템(대부분의 BSD 변형 포함)은 공유 메모리 블록 크기 제한이 매우 낮습니다.

apc.optimization 정수

최적화 수준. 최적화를 비활성화하려면 0으로 설정하고, 값이 높을수록 더 강력한 최적화를 사용합니다. 적당한 속도 향상을 기대합니다. 이는 아직 실험적인 성격을 띠고 있습니다.

apc.num_files_hint 정수

웹 서버에 포함되고 요청된 다양한 소스 파일 수에 대한 힌트입니다. 확실하지 않은 경우 0으로 설정하거나 생략하세요. 이 설정은 주로 수천 개의 소스 파일이 있는 사이트에 유용할 수 있습니다.

apc.ttl Integer

캐시 영역의 다른 항목에 캐시 항목이 필요할 때 고려해야 할 것은 이 캐시 항목이 캐시 영역에서 유휴 상태로 허용되는 시간(초)입니다. 이 매개변수를 0으로 설정하면 캐시가 오래된 항목으로 채워지고 새 항목이 캐시되지 않음을 의미합니다.

apc.gc_ttl 정수

캐시 항목이 가비지 수집 목록에 남아 있는 시간(초)입니다. 이 값은 서버 프로세스가 종료되는 동안 캐시된 소스 파일이 실행되는 경우 오류 방지 기능을 제공합니다. 해당 소스 파일이 수정되면 이 매개변수로 설정된 TTL 값에 도달할 때까지 이전 버전의 캐시 항목에 할당된 메모리가 회수되지 않습니다. 0으로 설정하면 이 기능이 비활성화됩니다.

apc.cache_by_default 부울

기본값은 On이지만 Off로 설정하고 더하기 기호로 시작하는 apc.filters와 함께 사용할 수 있습니다. 파일은 필터와 일치하는 경우에만 캐시됩니다.

apc.filters 문자열

POSIX 확장 정규식의 쉼표로 구분된 목록입니다. 패턴이 소스 파일 이름과 일치하면 파일이 캐시되지 않습니다. 일치하는 데 사용되는 파일 이름은 절대 경로가 아니라 포함/요구에 전달된 파일 이름입니다. 정규식의 첫 번째 문자가 + 이면 표현식은 표현식과 일치하는 모든 파일이 캐시됨을 의미하고, 첫 번째 문자가 - 이면 일치하는 항목이 캐시되지 않음을 의미합니다. -는 기본값이므로 생략 가능합니다.

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

는 PHP의 CLI 버전에 대한 APC 기능을 활성화하기 위해 주로 테스트 및 디버깅에 사용됩니다. 일반적으로 모든 CLI 요청에 대해 APC 캐시를 생성, 이식 및 삭제하는 것을 생각하지 않습니다. . 그러나 다양한 테스트 상황에서는 CLI 버전에 대해 APC를 활성화하는 것이 매우 쉽습니다.

관련 권장 사항:

php

Memcached PHP Memcached + APC의 APC 캐시 사용에 대한 샘플 코드 + 파일 캐시 캡슐화 구현 코드

PHP OPCode 캐시 APC 상세 소개

위 내용은 업로드 진행률 표시줄을 구현하기 위해 APC 모듈을 사용하는 PHP 공유 예의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.