今天要做一个大文件上传进度效果,后来网上说有php apc可以实现,后来百度了一下php apc信息,PHP APC提供两种缓存功能,即缓存Opcode(目标文件),我们称之为apc_compiler_cache,同时它还提供一些接口用于PHP开发人员将用户数据驻留在内存中,我们称之为apc_user_cache,想用一下APC缓存到底效果如何,无奈在windows找不到相应版本的php-apc.dll扩展文件,只好在linux下安装了,不用源码方式安装,直接yum就行了.
首先要安装apc的依赖包,代码如下:
yum install php-pear php-devel httpd-devel pcre-devel gcc make
然后使用pecl安装apc,代码如下:pecl install apc
添加apc扩展到配置文件,代码如下:
echo "extension=apc.so" > /etc/php.d/apc.ini
最后记得重启服务器,代码如下:
service httpd restart
然后用PHP的phpinfo()函数可以检测到.
APC缓存函数实例:在APC中我们也可以享受APC带来的缓存大文件上传进度的特性,需要在php.ini中将apc.rfc1867设为1,并且在表单中加一个隐藏域 APC_UPLOAD_PROGRESS,这个域的值可以随机生成一个hash,以确保唯一.
APC有很多设置,你可以在php.ini中对它设置,代码如下:
- [APC]
- apc.enabled = 1
- apc.shm_segments = 1
- apc.shm_size = 64
- apc.max_file_size = 10M
- apc.stat=1
我试用了下PHP中常见的APC函数,代码如下:
- <?php
-
-
-
-
-
- apc_add('url','http://www.phpfensi.com');
-
-
-
-
- var_dump(apc_fetch('url'));
-
-
-
-
- apc_store('var','新的变量');
-
-
-
-
- apc_delete('url');
-
-
-
-
- apc_clear_cache('user');
-
-
-
-
- if(apc_exsists('url')){
- echo "这个key真存在";
- }else{
- echo "貌似这个key是不存在的";
- }
-
-
-
-
- apc_store('anumber', 42);
- $ret = apc_inc('anumber', 1, $fail);
- var_dump($ret);
- var_dump($fail);
-
-
-
-
- $ret = apc_dec('astring', 1, $fail);
- var_dump($ret);
- var_dump($fail);
- ?>
另外提供一个很好用的APC缓存类,代码如下:
- <?php
-
-
-
-
- class MyApc {
-
-
-
-
-
-
-
-
- public function set_cache($key, $value, $time = 0) {
- if ($time == 0) $time = null;
- return apc_store($key, $value, $time);;
- }
-
-
-
-
-
-
-
- public function get_cache($key) {
- return apc_fetch($key);
- }
-
-
-
-
-
-
- public function clear($key) {
- return apc_delete($key);
- }
-
-
-
-
-
-
- public function clear_all() {
- apc_clear_cache('user');
- return apc_clear_cache();
- }
-
-
-
-
-
- public function exists($key) {
- return apc_exists($key);
- }
-
-
-
-
-
-
- public function inc($key, $step) {
- return apc_inc($key, (int) $step);
- }
-
-
-
-
-
-
- public function dec($key, $step) {
- return apc_dec($key, (int) $step);
- }
-
-
-
-
- public function info() {
- return apc_cache_info();
- }
- }
-
-
- $apc = new MyApc();
- $apc->set_cache('key','test by www.phpfensi.com');
- print_r($apc->get_cache('key'));
- ?>
总结:
1,使用Spinlocks锁机制,能够达到最佳性能。
2,APC提供了apc.php,用于监控与管理APC缓存。不要忘记修改管理员名和密码
3,APC默认通过mmap匿名映射创建共享内存,缓存对象都存放在这块”大型”的内存空间。由APC自行管理该共享内存
4,我们需要通过统计调整apc.shm_size、apc.num_files_hints、apc.user_entries_hint的值。直到最佳
5,好吧,我承认apc.stat = 0 可以获得更佳的性能。要我做什么都可以接受.
6,PHP预定义常量,可以使用apc_define_constants()函数。不过据APC开发者介绍说pecl hidef性能更佳,抛异define吧,它是低效的。
7,函数apc_store(),对于系统设置等PHP变量,生命周期是整个应用(从httpd守护进程直到httpd守护进程关闭),使用APC比Memcached会更好。必竟不要经过网络传输协议tcp。
8,APC不适于通过函数apc_store()缓存频繁变更的用户数据,会出现一些奇异现象. |