apc
转载(https://www.kancloud.cn/thinkphp/php-best-practices/40866)
使用 APC
在一个标准的 PHP 环境中,每次访问PHP脚本时,脚本都会被编译然后执行。 一次又一次地花费时间编译相同的脚本对于大型站点会造成性能问题。
解决方案是采用一个 opcode 缓存。 opcode 缓存是一个能够记下每个脚本经过编译的版本,这样服务器就不需要浪费时间一次又一次地编译了。 通常这些 opcode 缓存系统也能智能地检测到一个脚本是否发生改变,因此当你升级 PHP 源码时,并不需要手动清空缓存。
PHP 5.5 内建了一个缓存 OPcache。PHP 5.2 - 5.4 下可以作为PECL扩展安装。
此外还有几个PHP opcode 缓存值得关注 eaccelerator, xcache,以及APC。 APC 是 PHP 项目官方支持的,最为活跃,也最容易安装。 它也提供一个可选的类 memcached 的持久化键-值对存储,因此你应使用它。
安装 APC
在 Ubuntu 12.04 上你可以通过在终端中执行以下命令来安装 APC:
user@localhost: sudo apt-get install php-apc
除此之外,不需要进一步的配置。
将 APC 作为一个持久化键-值存储系统来使用
APC 也提供了对于你的脚本透明的类似于 memcached 的功能。 与使用 memcached 相比一个大的优势是 APC 是集成到 PHP 核心的,因此你不需要在服务器上维护另一个运行的部件, 并且 PHP 开发者在 APC 上的工作很活跃。 但从另一方面来说,APC 并不是一个分布式缓存,如果你需要这个特性,你就必须使用 memcached 了。
示例
<?php
// Store some values in the APC cache. We can optionally pass a time-to-live,
// but in this example the values will live forever until they're garbage-collected by APC.
apc_store('username-1532', 'Frodo Baggins');
apc_store('username-958', 'Aragorn');
apc_store('username-6389', 'Gandalf');
// After storing these values, any PHP script can access them, no matter when it's run!
$value = apc_fetch('username-958', $success);
if($success === true)
print($value); // Aragorn
$value = apc_fetch('username-1', $success); // $success will be set to boolean false, because this key doesn't exist.
if($success !== true) // Note the !==, this checks for true boolean false, not "falsey" values like 0 or empty string.
print('Key not found');
apc_delete('username-958'); // This key will no longer be available.
?>
陷阱
- 如果你使用的不是 PHP-FPM(例如你在使用 mod_php 或 mod_fastcgi), 那么每个 PHP 进程都会有自己独有的 APC 实例,包括键-值存储。 若你不注意,这可能会在你的应用代码中造成同步问题。
相关文章(https://www.cnblogs.com/vania/p/4745029.html)
APC的介绍
The Alternative PHP Cache (APC) is a free and open opcode cache for PHP. Its goal is to provide a free, open, and robust framework for caching and optimizing PHP intermediate code.
APC官方网站:http://www.php.net/manual/en/book.apc.php
WIN下最新版本的下载地址:http://downloads.php.net/pierre/
下载连接:http://downloads.php.net/pierre/php_apc-3.1.4-5.3-VC6-x86.zip 根据自己的PHP编译版本使用相对应的DLL
1、APC缓存简介
系统缓存
用户数据缓存
缓存key生成规则
常用APC设置
apc.cache_by_default | 默认启用缓存。1表示“启用”,0表示“禁用” |
apc.filters | 根据逗号分隔的POSIX正则表达式判断文件需要缓存还是不需要缓存。以a+开头的正则 表达式将强制APC不缓存与此正则表达式匹配的任何文件。以a-开头的正则表达式将强制 APC缓存与此正则表达式匹配的任何文件 |
apc.stat | 启用或禁用APC对于所有请求PHP脚本是否有更改的检查。每次调用脚本时均会执行此 过程。如果禁用该设置,在对PHP脚本进行任意更改后均需要重新启动WEB服务器以 清除缓存并更改脚本内容。0=禁用,1=启用,默认1 |
apc.enabled | 启用或禁用APC缓存。0=禁用,1=启用,默认1 |
apc.shm_size | 设置APC允许使用的共享内存大小,此值以兆字节为单位 |
apc.shm_segments | 设置可用的共享内存段总数 |
apc.include_once_override | 启用或禁用include_once和require_once的优化。启用该设置时,可减少PHP内部函数进行的额外系统调用。0=禁用,1=启用,默认0 |
apc.optimization | 设置优化级别。0=禁用优化功能 |
apc.num_files_hint | 设置你认为需要缓存的文件数。默认值1000,如果不确定文件数,可以设置0 |
apc.ttl | 设置文件存储在缓存中的过期时间,以秒为单位。 |
apc.write_lock | 开启该设置将强制单个进程缓存特定的脚步。适用于必须缓存多个文件的大流量WEB服务器或应用程序 |
添加缓存过程
不管是用户缓存还是系统缓存,大体的执行过程类似,步骤如下:
- 通过求余操作,定位当前key的在slots数组中的位置: cache->slots[key.h % cache->num_slots];
- 在定位到slots数组中的位置后,遍历当前key对应的slot链表,如果存在slot的key和要写入的key匹配或slot过期,清除当前slot。
- 在最后一个slot的后面插入新的slot。
2、APC模块安装
WINDOWS
第一步:下载php_apc.dll 在http://pecl.php.net/package/apc 要与php版本对应 将php_apc.dll放入你的ext目录
第二步:让php.ini支持apc扩展模块。 然后打开php.ini 加入:
extension=php_apc.dll
apc.rfc1867 = on
apc.max_file_size = 100M
upload_max_filesize = 100M
post_max_size = 100M
//以上参数可自己定义
第三步:检查是否支持PHP APC apc_store apc_fetch PHP APC 配置参数 把相关的配置放在一起解释。
apc.enabled=1 apc.enabled默认值是1,你可设成0禁用APC。如果你设置为0的时候,同样把extension=apc.so也注释掉(这样可以节约内存资源)。一旦启用了APC功能,则会缓存Opcodes到共享内存。
apc.shm_segments = 1
总结 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()缓存频繁变更的用户数据,会出现一些奇异现象。
LIUNX
wget http://pecl.php.net/get/APC-3.1.8.tgz
tar -zxvf APC-3.1.8.tgz cd APC-3.1.8
/usr/local/php/bin/phpize
./configure --enable-apc --enable-mmap --enable-apc-spinlocks
--disable-apc-pthreadmutex
--with-php-config=/usr/local/php/bin/php-config
make
sudo make install
在/usr/local/php/etc/php.ini 加入
extension = "apc.so" ;
;APC setting
apc.enabled = 1
apc.shm_segments = 1
apc.shm_size = 64M
apc.optimization = 1
apc.num_files_hint = 0
apc.ttl = 0
apc.gc_ttl = 3600
apc.cache_by_default = on
重启apache 或者 /usr/local/php/sbin/php-fpm restart
查看phpinfo apc
下面引用www.initphp.com 框架的APC缓存类
initphp框架之APC缓存类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
<?php if (!defined( 'IS_INITPHP' )) exit ( 'Access Denied!' ); /********************************************************************************* * InitPHP 2.0 国产PHP开发框架 Dao-APC缓存 不适合频繁写入的缓存数据 *------------------------------------------------------------------------------- * 版权所有: CopyRight By initphp.com * 您可以自由使用该源码,但是在使用过程中,请保留作者信息。尊重他人劳动成果就是尊重自己 *------------------------------------------------------------------------------- * $Author:zhuli * $Dtime:2011-10-09 ***********************************************************************************/ class apcInit { /** * Apc缓存-设置缓存 * 设置缓存key,value和缓存时间 * @param string $key KEY值 * @param string $value 值 * @param string $time 缓存时间 */ public function set_cache( $key , $value , $time = 0) { if ( $time == 0) $time = null; //null情况下永久缓存 return apc_store( $key , $value , $time );; } /** * Apc缓存-获取缓存 * 通过KEY获取缓存数据 * @param string $key KEY值 */ public function get_cache( $key ) { return apc_fetch( $key ); } /** * Apc缓存-清除一个缓存 * 从memcache中删除一条缓存 * @param string $key KEY值 */ public function clear( $key ) { return apc_delete( $key ); } /** * Apc缓存-清空所有缓存 * 不建议使用该功能 * @return */ public function clear_all() { apc_clear_cache( 'user' ); //清除用户缓存 return apc_clear_cache(); //清楚缓存 } /** * 检查APC缓存是否存在 * @param string $key KEY值 */ public function exists( $key ) { return apc_exists( $key ); } /** * 字段自增-用于记数 * @param string $key KEY值 * @param int $step 新增的step值 */ public function inc( $key , $step ) { return apc_inc( $key , (int) $step ); } /** * 字段自减-用于记数 * @param string $key KEY值 * @param int $step 新增的step值 */ public function dec( $key , $step ) { return apc_dec( $key , (int) $step ); } /** * 返回APC缓存信息 */ public function info() { return apc_cache_info(); } } |
apc的更多相关文章
- 线程的Alertable与User APC
在使用插User APC注入DLL时,经常面临一个问题,那就是线程必须是处于Alertable模式才能注入成功.但一直对这个Alertable的含义不甚清楚,今天总算是把这个梗消化了. 微软对Aler ...
- 【夯实PHP基础系列】linux下yum安装PHP APC
Alternative PHP Cache(可选PHP缓存),依赖于 PECL扩展库 用源码方式安装,直接yum就行了:首先要安装apc的依赖包:yum install php-pear php-de ...
- eAccelerator、memcached、xcache、APC 等四个加速扩展的区别
折腾VPS的朋友,在安装好LNMP等Web运行环境后都会选择一些缓存扩展安装以提高PHP运行速度,常被人介绍的有eAccelerator.memcached.xcache.Alternative PH ...
- 解决由OpenShift自带的APC加速器造成的代码无法及时生效的问题
如果你在使用你的Openshift时出现了这样的问题,那就说明APC加速器导致了此故障 1.上传后的代码运行效果没有变化 2.Wordpress翻来覆去自己重复升级一个版本(←Wordpress在自嗨 ...
- Centos5.8下编译安装PHP5.4和memcached, phalcon, yaf, apc
安装GIT 需要先安装gcc-c++ (sudo yum install gcc-c++)sudo yum install gettext-devel expat-devel cpio perl op ...
- ubuntu apc 安装
在ubuntu下安装APC,只需要两条命令,便可将APC和php绑一起. 安装代码: sudo apt-get install -y apache2-prefork-dev ...
- 使用APC缓存PHP opcode
1. 关于版本 我的php版本是5.3.10 最开始使用 APC-3.1.8 编译成功,但是 php -m 得不到扩展 , 换成 APC-3.1.9 后解决. 2. 关于配置 apc.cac ...
- ETHREAD APC 《寒江独钓》内核学习笔记(4)
继续学习windows 中和线程有关系的数据结构: ETHREAD.KTHREAD.TEB 1. 相关阅读材料 <windows 内核原理与实现> --- 潘爱民 2. 数据结构分析 我们 ...
- php apc
APC,全称是Alternative PHP Cache,官方翻译叫”可选PHP缓存”.它为我们提供了缓存和优化PHP的中间代码的框架. APC的缓存分两部分:系统缓存和用户数据缓存. 系统缓存 它是 ...
- APC to USB
from :http://www.allpinouts.org/index.php/APC_USB_cable_schematic connector or cable wiring APC part ...
随机推荐
- Kubernetes中的nodePort,targetPort,port的区别和意义(转)
原文https://blog.csdn.net/u013760355/article/details/70162242 https://blog.csdn.net/xinghun_4/article/ ...
- [administrative] windows 下制作USB启动盘的工具
arch魔教的文档: https://wiki.archlinux.org/index.php/USB_flash_installation_media windows 下的 dd: https:/ ...
- [报错]ios开发 failed to read file attributes for
下载第三方demo,运行报错: failed to read file attributes for https://stackoverflow.com/questions/46301270/fa ...
- Python开发【模块】:tornado.queues协程的队列
协程的队列 协调生产者消费者协程. from tornado import gen from tornado.ioloop import IOLoop from tornado.queues impo ...
- [NOSQL] Redis介绍
Redis概述 Redis是Salvatore Sanfilippo在2009年为其初创公司LLOOGG开发的,眼下仍是独立项目.但VMWare赞劣了项目(作者是其雇员).它採用C语言实现.因此性能非 ...
- SegmentedControlIOS使用
代码: import React, { Component } from 'react'; import { AppRegistry, StyleSheet, Text, SegmentedContr ...
- asxios--form data提交,setcookie
React native 项目,部分接口用form data 提交,以及在Android端,虽然设置了请求携带cookie,但每次请求携带的cookie跟初始化时都不一样,目前做法是去到初始化中返回的 ...
- maven install安装工程
在一个项目中,想要运行一个子工程,要先把它的依赖工程导入到maven中. 右键依赖工程--run as--maven install.
- 【Java】-NO.16.EBook.4.Java.1.002-【疯狂Java讲义第3版 李刚】- 数据类型
1.0.0 Summary Tittle:[Java]-NO.16.EBook.4.Java.1.002-[疯狂Java讲义第3版 李刚]- 数据类型 Style:EBook Series:Java ...
- 使用 Oracle Data Access Components连接oracel
使用微软自带的oracle连接类,在framework4.0中被标识为弃用,强行用它开发了Winform程序,发布放到XP上提示: Error System.Data.OracleClient req ...