天天看点

PHP使用APC获取上传文件进度安装APCapc.rfc1867实验:下面的疑问就是是不是真有中间过渡状态呢?

今天发现使用php的apc也能获取上传文件的进度。这篇文章就说下如何做。

首先安装apc的方法和其他php模块的方法没什么两样,网上能找出好多

phpinfo可以看到apc的默认配置有:

PHP使用APC获取上传文件进度安装APCapc.rfc1867实验:下面的疑问就是是不是真有中间过渡状态呢?

看apc.rfc1867这个配置项:

<a href="http://cn2.php.net/manual/en/apc.configuration.php#ini.apc.rfc1867">http://cn2.php.net/manual/en/apc.configuration.php#ini.apc.rfc1867</a>

文档说的是如果你上传文件的时候,在post中带有apc_upload_progress字段,那么apc会自动以这个值创造一个upload_key缓存

这个时候,用户可以使用ajax再过来调用,就可以获取到当前文件上传的状态了

这个状态包括:

apc.rfc1867=on

PHP使用APC获取上传文件进度安装APCapc.rfc1867实验:下面的疑问就是是不是真有中间过渡状态呢?

1

2

3

4

5

6

7

8

9

10

11

<code>apc.php</code>

<code>&lt;?php</code>

<code>if</code><code>(</code><code>$_files</code><code>[</code><code>'file'</code><code>][</code><code>'error'</code><code>] == upload_err_ok){</code>

<code>   </code><code>$path</code> <code>=</code><code>'/tmp/upload/'</code><code>;</code>

<code>   </code><code>$path</code> <code>.=</code><code>basename</code><code>(</code><code>$_files</code><code>[</code><code>'file'</code><code>][</code><code>'name'</code><code>]);</code>

<code>   </code><code>if</code><code>(move_uploaded_file(</code><code>$_files</code><code>[</code><code>'file'</code><code>][</code><code>'tmp_name'</code><code>],</code><code>$path</code><code>)){</code>

<code>      </code><code>// upload successful</code>

<code>        </code><code>echo</code> <code>'sucess'</code><code>;</code>

<code>   </code><code>}</code>

<code>}</code>

确保能通过网络访问到页面

<code>getprocess.php</code>

<code>print_r(apc_fetch(</code><code>"upload_6226f7cbe59e99a90b5cef6f94f966fd"</code><code>));</code>

<code>&lt;html&gt;</code>

<code>&lt;body&gt;</code>

<code>&lt;input type=</code><code>"hidden"</code> <code>name=</code><code>"apc_upload_progress"</code> <code>value=</code><code>"6226f7cbe59e99a90b5cef6f94f966fd"</code><code>/&gt;</code>

<code>&lt;input type=</code><code>"file"</code> <code>name=</code><code>"file"</code> <code>/&gt;</code>

<code>&lt;input type=</code><code>"submit"</code> <code>value=</code><code>"submit"</code> <code>/&gt;</code>

<code>&lt;/form&gt;</code>

<code>&lt;/body&gt;</code>

<code>&lt;/html&gt;</code>

这里要注意的是,apc_upload_process 必须要放在上传的file之前(这也是文档中有写到的),否则会出现warning,并且也无法得到process

PHP使用APC获取上传文件进度安装APCapc.rfc1867实验:下面的疑问就是是不是真有中间过渡状态呢?
PHP使用APC获取上传文件进度安装APCapc.rfc1867实验:下面的疑问就是是不是真有中间过渡状态呢?

按照这篇文章说的:http://donchevp.blogspot.com/2009/11/limiting-your-internet-connection-speed.html

设置rule - customer - 设置这一段代码

<code>if</code> <code>(m_simulatemodem) {</code>

<code>     </code><code>// delay sends by 300ms per kb uploaded.</code>

<code>     </code><code>osession[</code><code>"request-trickle-delay"</code><code>] =</code><code>"1"</code><code>;</code>

<code>     </code><code>// delay receives by 150ms per kb downloaded.</code>

<code>     </code><code>osession[</code><code>"response-trickle-delay"</code><code>] =</code><code>"150"</code><code>;</code>

<code> </code><code>}</code>

修改这个request-trickle-delay

然后开启simulate模式。

PHP使用APC获取上传文件进度安装APCapc.rfc1867实验:下面的疑问就是是不是真有中间过渡状态呢?

可以看到current的进度,而且可以看到没有上传完成的时候,rate字段是没有的~~~so good~~