ホームページ php教程 php手册 APC方法实现PHP上传多个文件原理剖析

APC方法实现PHP上传多个文件原理剖析

Jun 13, 2016 am 10:19 AM
apc php アップロード 分析する 原理 存在する 複数 成し遂げる 私たち 書類 方法 必要

我们在上传多个文件的时候可能往往需要很长的等待时间,而且受网络和软件等的影响,经常会出现超时及上传失败的现象。如何在PHP上传多个文件时实时的得到文件上传进度,以及如何避开php和其他因素的限制上传任意大小的文件呢?

  • 经验总结:示例PHP上传文件代码
  • 五分钟解决PHP上传文件代码演示
  • 挖掘PHP上传文件类型原理实现
  • 三步FTP实现PHP上传文件代码剖析
  • 两种PHP上传文件大小限制解决方案
php同asp等其他语言对上传文件的处理方式不同,asp中可以用Request.BinaryRead流式的读取客户端提交的数据。php是把文件存放在临时文件夹中,在文件上传完成后才能够获取其信息以及对其进行操作。如果在上传过程中我们能够得到其临时文件的文件名,我们就可以通过判断临时文件的大小来来得到上传进度,不过好像没有办法得到。所以我们只能通过其他方式,就是利用php的socket扩展建立一个简单的服务器,把数据post到这个服务器上,然后再用我们自己的机制来处理。

先说说流程,首先用php的socket函数库建立一个临时的http服务器,在某一端口监听,然后把 ip地址和端口号通知客户端,客户端把上传表单提交(临时服务器), 临时服务器接受客户端请求,并读取post数据,分析并获取客户端上传的文件信息,把文件保存在服务器上,然后关闭临时服务器,释放资源,上传完成。有点绕,不过思路还是简单的。

稍后我会发布一个类库,暂定名为:UGiA Visual PHP Uploader, 这样大家就可以在程序中很方便的调用了。PHP上传多个文件效果如下:

PHP上传多个文件之APC实现方法

安装APC,参照官方文档安装,可以使用PECL模块安装方法快速简捷,这里不说明配置php.ini,设置参数 apc.rfc1867=1 ,使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>
ログイン後にコピー

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

CakePHP の日付と時刻 CakePHP の日付と時刻 Sep 10, 2024 pm 05:27 PM

Cakephp4 で日付と時刻を操作するには、利用可能な FrozenTime クラスを利用します。

CakePHP について話し合う CakePHP について話し合う Sep 10, 2024 pm 05:28 PM

CakePHP は、PHP 用のオープンソース フレームワークです。これは、アプリケーションの開発、展開、保守をより簡単にすることを目的としています。 CakePHP は、強力かつ理解しやすい MVC のようなアーキテクチャに基づいています。モデル、ビュー、コントローラー

CakePHP ファイルのアップロード CakePHP ファイルのアップロード Sep 10, 2024 pm 05:27 PM

ファイルのアップロードを行うには、フォーム ヘルパーを使用します。ここではファイルアップロードの例を示します。

CakePHP バリデータの作成 CakePHP バリデータの作成 Sep 10, 2024 pm 05:26 PM

Validator は、コントローラーに次の 2 行を追加することで作成できます。

CakePHP のロギング CakePHP のロギング Sep 10, 2024 pm 05:26 PM

CakePHP へのログインは非常に簡単な作業です。使用する関数は 1 つだけです。 cronjob などのバックグラウンド プロセスのエラー、例外、ユーザー アクティビティ、ユーザーが実行したアクションをログに記録できます。 CakePHP でのデータのログ記録は簡単です。 log()関数が提供されています

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

CakePHP クイックガイド CakePHP クイックガイド Sep 10, 2024 pm 05:27 PM

CakePHP はオープンソースの MVC フレームワークです。これにより、アプリケーションの開発、展開、保守がはるかに簡単になります。 CakePHP には、最も一般的なタスクの過負荷を軽減するためのライブラリが多数あります。

See all articles