ホームページ > バックエンド開発 > PHPチュートリアル > PHP_PHP チュートリアルで複数のファイルをアップロードするための APC メソッドの原理の分析

PHP_PHP チュートリアルで複数のファイルをアップロードするための APC メソッドの原理の分析

WBOY
リリース: 2016-07-13 17:19:04
オリジナル
802 人が閲覧しました

複数のファイルをアップロードする場合、長時間待機することが多く、ネットワークやソフトウェアの影響により、タイムアウトやアップロード失敗が頻繁に発生します。 PHP で複数のファイルをアップロードするときにファイルのアップロードの進行状況をリアルタイムで取得する方法、および任意のサイズのファイルをアップロードする際に PHP やその他の要因の制限を回避する方法は?

  • 体験の概要: PHP ファイルアップロードコードのサンプル
  • PHP ファイルのアップロード コードのデモを解くのに 5 分
  • PHP アップロード ファイル タイプの原則の実装に注意してください
  • PHP ファイルアップロードコード分析の 3 ステップの FTP 実装
  • 2 つの PHP アップロード ファイル サイズ制限ソリューション
PHP は、ASP などの他の言語とは異なる方法でアップロードされたファイルを処理します。ASP では、Request.BinaryRead を使用して、クライアントによって送信されたデータをストリーミング方式で読み取ることができます。 PHP はファイルを一時フォルダーに保存し、ファイルがアップロードされた後にのみその情報を取得して操作できるようになります。アップロード処理中にその一時ファイルのファイル名を取得できれば、一時ファイルのサイズを判断してアップロードの進行状況を取得できるのですが、それを取得する方法はないようです。したがって、他の方法のみを使用できます。つまり、PHP のソケット拡張機能を使用して単純なサーバーを構築し、このサーバーにデータをポストし、独自のメカニズムを使用してそれを処理します。

まずプロセスについて説明します。まず、PHP のソケット関数ライブラリを使用して一時的な http サーバーを確立し、特定のポートでリッスンし、クライアントに IP アドレスとポート番号を通知します (一時サーバー)。 ) 一時サーバー クライアントのリクエストを受け入れ、投稿データを読み取り、クライアントがアップロードしたファイル情報を分析して取得し、ファイルをサーバーに保存した後、一時サーバーを閉じ、リソースを解放し、アップロードを完了します。少し複雑ですが、考え方はまだシンプルです。

後で、誰もがプログラム内で簡単に呼び出せるように、暫定的に UGiA Visual PHP Uploader という名前のクラス ライブラリをリリースします。 PHP で複数のファイルをアップロードする効果は次のとおりです:

PHPで複数のファイルをアップロードするためのAPC実装方法:

APC をインストールします。インストールについては公式ドキュメントを参照してください。ここでは説明されていない PECL モジュールのインストール方法を使用して、APC がサポートできるようにパラメータを設定します。プログレスバー関数のアップロードについては、APC ソース コードのドキュメントに説明があります: コード例:

<ol class="dp-xml">
<li class="alt"><span><span>if ($_SERVER['REQUEST_METHOD'] == 'POST') {  //上传请求  </span></span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">status</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">apc_fetch</font></span><span>('upload_' . $_POST['APC_UPLOAD_PROGRESS']);  </span>
</li>
<li class="alt"><span>$status['done'] = 1;  </span></li>
<li class=""><span>echo json_encode($status);  //输出给用户端页面里的ajax调用,相关文档请自己寻找  </span></li>
<li class="alt"><span>exit;  </span></li>
<li class=""><span>} elseif (isset($_GET['progress_key'])) {   //读取上传进度  </span></li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">status</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">apc_fetch</font></span><span>('upload_'.$_GET['progress_key']);  </span>
</li>
<li class=""><span>echo json_encode($status);  </span></li>
<li class="alt"><span>exit;  </span></li>
<li class=""><span>} else {  </span></li>
<li class="alt"><span>//其他代码,比如上传表单等  </span></li>
<li class=""><span>} </span></li>
</ol>
ログイン後にコピー

uploadprogressモジュール実装メソッド:

<ol class="dp-xml">
<li class="alt"><span><span>使用PECL模块安装方法安装该模块php.ini里面设置 </span><span class="attribute"><font color="#ff0000">uploadprogress.file.filename_template</font></span><span> = “/tmp/upd_%s.txt”代码范例:  </span></span></li>
<li class=""><span>if($_SERVER['REQUEST_METHOD']=='POST') {  </span></li>
<li class="alt"><span>if (is_uploaded_file($_FILES['upfile']['tmp_name'])) {  </span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">upload_dir</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">'your_path/'</font></span><span>;  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">ext</font></span><span>        = </span><span class="attribute-value"><font color="#0000ff">strrchr</font></span><span>($_FILES['video']['name'], '.');  </span>
</li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">sessid</font></span><span>     = $_POST['UPLOAD_IDENTIFIER'] ;  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">tmpfile</font></span><span>    = $upload_dir . $sessid;  </span>
</li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">sessfile</font></span><span>   = $upload_dir . $sessid .$ext;  </span>
</li>
<li class="alt"><span>if (move_uploaded_file($_FILES['upfile']['tmp_name'],$tmpfile)) {  </span></li>
<li class=""><span>//上传成功  </span></li>
<li class="alt"><span>} else {  </span></li>
<li class=""><span>//上传失败  </span></li>
<li class="alt"><span>} else {  </span></li>
<li class=""><span>//上传错误  </span></li>
<li class="alt"><span> </span></li>
<li class=""><span>} elseif (!empty($_GET['sessid'])) {  </span></li>
<li class="alt"><span>header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");  </span></li>
<li class=""><span>header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");  </span></li>
<li class="alt"><span>header("Cache-Control: no-store, no-cache, must-revalidate");  </span></li>
<li class="">
<span>header("Cache-Control: </span><span class="attribute"><font color="#ff0000">post-check</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>, </span><span class="attribute"><font color="#ff0000">pre-check</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">0</font></span><span>", false);  </span>
</li>
<li class="alt"><span>header("Pragma: no-cache");  </span></li>
<li class="">
<span>header("Content-Type:text/html;</span><span class="attribute"><font color="#ff0000">charset</font></span><span>=</span><span class="attribute-value"><font color="#0000ff">UTF</font></span><span>-8");  </span>
</li>
<li class="alt"><span> </span></li>
<li class="">
<span>$</span><span class="attribute"><font color="#ff0000">unique_id</font></span><span> = $_GET['sessid'];  </span>
</li>
<li class="alt">
<span>$</span><span class="attribute"><font color="#ff0000">uploadvalues</font></span><span> = </span><span class="attribute-value"><font color="#0000ff">uploadprogress_get_info</font></span><span>($unique_id);  </span>
</li>
<li class=""><span> </span></li>
<li class="alt"><span>if (is_array($uploadvalues)) {  </span></li>
<li class=""><span>echo json_encode($uploadvalues);  </span></li>
<li class="alt"><span>} else {  </span></li>
<li class=""><span>//读取进度失败,另外处理逻辑  </span></li>
<li class="alt"><span>}  </span></li>
<li class=""><span> </span></li>
<li class="alt"><span>} else {  </span></li>
<li class=""><span>//显示上传表单  </span></li>
</ol>
ログイン後にコピー

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/588982.html技術記事複数のファイルをアップロードする場合、待ち時間が長くなったり、ネットワークやソフトウェアの影響により、タイムアウトやアップロード失敗が頻繁に発生します。 PHP でアップロードする方法...
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート