この記事では主に、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('upid'); return true;"/> <!–注意:startProgress('upid')中的参数是你从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>
最も重要なことは 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('文件大小:'+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); }
アップロードされたファイルの処理に関しては、通常通り記述できます。コードは次のとおりです:
//上传文件操作函数,可按照自己的需要编写 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 が静的にコンパイルされる場合に主に役立ちます。 PHP を無効にする他の方法がないため、DSO としてコンパイルする場合は、php.ini の拡張行をコメント化できます。
apc.shm_segments 整数
コンパイル キャッシュに割り当てられる共有メモリ ブロックの数APC が共有メモリを使い果たしており、apc.shm_size がシステムで許可されている最大値に設定されている場合、このパラメータの値を増やすことができます
apc.shm_size 整数
それぞれのサイズ。共有メモリ ブロックは MB 単位です。デフォルトでは、一部のシステム (ほとんどの BSD バリアントを含む) では、共有メモリ ブロック サイズの制限が非常に低く設定されています。
apc.optimization Integer
最適化レベル。最適化を無効にするには 0 に設定します。値が大きいほど、より強力な最適化が使用されます。多少の速度向上が期待できます。これはまだ実験的な性質のものです。
apc.num_files_hint 整数
Web サーバーに含まれ、要求されたさまざまなソース ファイルの数のヒント。よくわからない場合は、0 に設定するか省略してください。この設定は、主に何千ものソース ファイルがあるサイトで役立ちます。
apc.ttl 整数
キャッシュ エントリがキャッシュ領域内の別のエントリによって必要とされる場合、考慮する必要があるのは、このキャッシュ エントリがキャッシュ領域内でアイドル状態でいられる秒数です。このパラメータを 0 に設定すると、キャッシュが古いエントリでいっぱいになる可能性があり、新しいエントリはキャッシュされなくなります。
apc.gc_ttl 整数
キャッシュ エントリがガベージ コレクション リスト内で存続する秒数。この値は、キャッシュされたソース ファイルが実行され、同時にサーバー プロセスが停止した場合のエラー保護を提供します。そのソース ファイルが変更された場合、古いバージョンのキャッシュ エントリに割り当てられたメモリは、このパラメータで設定された TTL 値に達するまで再利用されません。 0 に設定すると、この機能が無効になります。
apc.cache_by_default ブール値
デフォルトはオンですが、オフに設定して、プラス記号で始まる apc.filters とともに使用することもできます。ファイルはフィルターに一致する場合にのみキャッシュされます。
apc.filters String
POSIX 拡張正規表現のカンマ区切りのリスト。いずれかのパターンがソース ファイル名と一致する場合、そのファイルはキャッシュされません。一致に使用されるファイル名は、絶対パスではなく、include/require に渡されたファイル名であることに注意してください。正規表現の最初の文字が + の場合、その式は、その式に一致するファイルがキャッシュされることを意味し、最初の文字が - の場合、一致するファイルはキャッシュされません。 - はデフォルト値なので省略できます。
apc.mmap_file_mask 文字列
apc.slam_defense 整数
非常に負荷の高いサーバーでは、サービスを開始するかファイルを変更するかにかかわらず、同じファイルを同時にキャッシュしようとする複数のプロセスで競合が発生します。このオプションは、プロセスがキャッシュされていないファイルのキャッシュ試行をスキップする割合を設定します。または、これを単一プロセスがキャッシュをスキップする確率と考えてください。たとえば、apc.slam_defense を 75 に設定すると、プロセスは 75% の確率でキャッシュされていないファイルをキャッシュしないことになります。したがって、設定を高くすると、キャッシュの衝突確率が低下する可能性が高くなります。この機能を無効にするには、0 に設定します。
apc.file_update_protection integer
実行中のサーバー上のファイルを変更するときは、アトミック操作を実行する必要があります。つまり、最初に一時ファイルを書き込み、終了したらファイルの名前を最終的な場所に変更 (mv) します。多くのテキスト エディタ、cp、tar、およびその他の同様のプログラムは、このようには動作しません。これは、ファイルの書き込み中にファイルにアクセスして (キャッシュする) 機会があることを意味します。 apc.file_update_protection を設定すると、キャッシュによる新しいファイルのマーク付けが遅れます。デフォルト値は 2 です。これは、ファイルの変更時間がアクセス時間から 2 秒未満であることが判明した場合、ファイルはキャッシュされないことを意味します。不運なユーザーが書きかけのファイルにアクセスすると、奇妙な動作が発生する可能性がありますが、少なくとも永続的なものではありません。ファイルの更新にアトミック操作を頻繁に使用することが確実な場合は、このパラメータを 0 に設定することで、この保護をオフにすることができます。システムに IO 操作が殺到し、更新プロセスに 2 秒以上かかる場合は、この値を増やす必要がある場合があります。
apc.enable-cli 整数
は主に、PHP の CLI バージョンの APC 機能を有効にするためにテストとデバッグに使用されます。一般的に、CLI リクエストごとに APC キャッシュを作成、移植、破棄することは考えられません。ただし、さまざまなテスト状況では、CLI バージョンで APC を有効にするのは非常に簡単です。 + ファイルキャッシュのカプセル化実装コード
以上がAPC モジュールを使用してアップロードの進行状況バーを実装した PHP の共有例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。