今天要做一个大文件上传进度效果, 后来网上说有 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
- /* 添加变量到数据存储
- bool apc_add ( string $key , mixed $var [, int $ttl = 0 ] )
- 如果 key 存在了, 不会覆盖, 但返回 false
- */
- apc_add('url','http://www.phprm.com');
- /* 从缓存中取出存储的变量
- mixed apc_fetch ( mixed $key [, bool &$success ] )
- */
- var_dump(apc_fetch('url'));
- /* 使用 apc_store() 存储的变量,.key 是唯一的, 所以 两个值使用同一个名称, 原来的将被新的值覆盖
- bool apc_store ( string $key , mixed $var [, int $ttl = 0 ] )
- */
- apc_store('var','新的变量');
- /* 从用户缓存中删除某个变量
- mixed apc_delete ( string $key )
- */
- apc_delete('url');
- /* 清楚 apc 缓存
- bool apc_clear_cache ([ string $cache_type ] )
- */
- apc_clear_cache('user');
- /* 检查 APC 中是否存在某个或者某些 key, 如果 Key 存在的话返回 TRUE , 否则返回 FALSE
- mixed apc_exists ( mixed $keys )
- */
- if(apc_exsists('url')){
- echo "这个 key 真存在";
- }else{
- echo "貌似这个 key 是不存在的";
- }
- /* 递增一个储存的数字, 成功时返回 key 的当前值, 或者在失败时返回 FALSE
- int apc_inc ( string $key [, int $step = 1 [, bool &$success ]] )
- */
- apc_store('anumber', 42);
- $ret = apc_inc('anumber', 1, $fail);
- var_dump($ret);
- var_dump($fail);
- /* 递减一个存储变量的数字, 成功时返回 key 的当前值, 或者在失败时返回 FALSE
- int apc_dec ( string $key [, int $step = 1 [, bool &$success ]] )
- */
- $ret = apc_dec('astring', 1, $fail);
- var_dump($ret);
- var_dump($fail);
另外提供一个很好用的 APC 缓存类, 代码如下:
- <?php
- /*********************************************************************************
- * APC 缓存类, 版权 (摘自 InitPHP 框架)
- ***********************************************************************************/
- class MyApc {
- /**
- * 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 = new MyApc();
- $apc--->set_cache('key','test by www.phprm.com');
- print_r($apc->get_cache('key'));
总结:
1, 使用 Spinlocks 锁机制, 能够达到最佳性能
2,APC 提供了 apc.php, 用于监控与管理 APC 缓存不要忘记修改管理员名和密码
3,APC 默认通过 mmap 匿名映射创建共享内存, 缓存对象都存放在这块大型的内存空间由 APC 自行管理该共享内存
4, 我们需要通过统计调整 apc.shm_sizeapc.num_files_hintsapc.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() 缓存频繁变更的用户数据, 会出现一些奇异现象.
来源: https://www.php1.cn/detail/php-75b8c5c7a5.html