webarchitect609 / memcache-bundle
Memcache Doctrine 缓存和会话存储在 Web 调试工具栏中
Requires
- php: >=5.3.2
- ext-memcache: >=3.0
- symfony/framework-bundle: >=2.1
Requires (Dev)
- ext-pcntl: ^7.3
- phpunit/phpunit: ~4.0
- v2.1.17
- v2.1.16
- v2.1.15
- v2.1.14
- v2.1.13
- v2.1.12
- v2.1.11
- v2.1.10
- v2.1.9
- v2.1.8
- v2.1.7
- v2.1.6
- v2.1.5
- v2.1.4
- v2.1.3
- v2.1.2
- v2.1.1
- v2.1.0
- v2.0.3
- v2.0.2
- v2.0.1
- v2.0.0
- v1.2.18
- v1.2.17
- v1.2.16
- v1.2.15
- v1.2.14
- v1.2.13
- v1.2.12
- v1.2.11
- v1.2.10
- v1.2.9
- v1.2.8
- v1.2.7
- v1.2.6
- v1.2.5
- v1.2.4
- v1.2.3
- v1.2.2
- v1.2.1
- v1.2.0
- dev-master / 1.1.x-dev
- v1.1.3
- v1.1.2
- v1.1.1
- v1.1.0
- v1.0.0
- dev-bugfix/SITE-121_Fix_addServer_v3
- dev-bugfix/SITE-121_Fix_addServer_v2
This package is auto-updated.
Last update: 2024-08-28 14:03:07 UTC
README
创建这个分支的原因是
- 允许在包配置中传递环境变量。
- 符合 PSR-4 自动加载标准。
它不再维护,几乎只有一些遗留项目在使用。
已弃用
此存储库不再被积极维护。我们鼓励您不要使用此代码。如果您依赖此代码,您可能希望创建存储库的分支以防止系统损坏,如果将来我们删除此存储库。
LswMemcacheBundle
如果您想优化您的Web应用程序以应对高负载和/或低加载时间,Memcache是一个不可或缺的工具。它将管理您的会话数据,而无需在Web或数据库服务器上进行磁盘I/O。您还可以将其作为您网站的中央对象存储运行。在这个角色中,它用于使用Doctrine缓存支持缓存数据库查询或通过实现Memcache的“获取”和“设置”命令来缓存昂贵的API调用。
这个Symfony包将为Symfony和Doctrine提供Memcache集成,用于会话存储和缓存。它具有完整的Web调试工具栏集成,允许您分析和调试缓存行为和性能。
阅读关于LswMemcacheBundle的LeaseWebLabs博客
要求
- PHP 5.3.10或更高版本
- php-memcache 3.0.6或更高版本
- memcached 1.4或更高版本
注意:此包不再使用使用“libmemcached”的PHP“memcached”扩展,请参阅“考虑事项”。
目前(实验性)可以通过编译和安装提供PHP7支持:https://github.com/websupport-sk/pecl-memcache/tree/php7
安装
要使用Composer安装LswMemcacheBundle,只需将以下内容添加到您的'composer.json'文件中
{
require: {
"leaseweb/memcache-bundle": "*",
...
}
}
接下来,您应该执行以下命令来安装包
php composer.phar update leaseweb/memcache-bundle
最后,将包添加到'app/AppKernel.php'文件中AppKernel类的registerBundles函数中
public function registerBundles()
{
$bundles = array(
...
new Lsw\MemcacheBundle\LswMemcacheBundle(),
...
);
通过在'app/config/config.yml'中添加以下内容来配置包
lsw_memcache: session: pool: default pools: default: servers: - { host: localhost, tcp_port: 11211 }
安装以下依赖项(在基于Debian的系统上使用'apt')
apt-get install memcached php5-memcache
在添加Memcache模块后,不要忘记重新启动您的Web服务器。现在,Memcache信息应该会显示在调试工具栏中的一个小的双箭头(快进)图标中。
用法
当您想从控制器中使用缓存时,可以简单地调用
$this->get('memcache.default')->set('someKey', 'someValue', 0, $timeToLive);
$this->get('memcache.default')->get('someKey');
上面的示例显示了如何将值'someValue'存储在键'someKey'下,最多存活时间为$ timeToLive秒(0参数是'标志')。在第二行中,从Memcache检索值。如果找不到键或指定的秒数已过,'get'函数将返回值'false'。
配置
以下是一个此包的示例配置。
lsw_memcache: pools: default: servers: - { host: 10.0.0.1, tcp_port: 11211, weight: 15 } - { host: 10.0.0.2, tcp_port: 11211, weight: 30 } options: allow_failover: true max_failover_attempts: 20 default_port: 11211 chunk_size: 32768 protocol: ascii hash_strategy: consistent hash_function: crc32 redundancy: true session_redundancy: 2 compress_threshold: 20000 lock_timeout: 15 sessions: servers: - { host: localhost, tcp_port: 11212 }
会话支持
此包还提供了在Memcache服务器上存储会话数据的支持。要启用会话支持,您需要通过session
键启用它(默认情况下auto_load
为true)。请注意,会话支持的唯一必需子键是pool
(一个有效的池)。您还可以指定一个prefix
和一个ttl
。
lsw_memcache: session: pool: sessions auto_load: true prefix: "session_" ttl: 7200 locking: true spin_lock_wait: 150000 # pools
请注意,会话锁定默认启用,默认的自旋锁定设置为每150毫秒(150000微秒)轮询。
运行在负载均衡器后面的应用程序的会话管理
当您的应用程序在多个服务器上运行时,您必须注意,所有实例都应该与1个缓存服务器进行通信以保证一致性;否则,每个实例都会有自己的会话,这会产生意外的结果。
为了避免上述问题,您需要将LockingSessionHandler作为服务添加。通过这样做,所有实例都将使用会话处理器,会话处理器将数据存储在配置的memcache服务器中。
my.memcache.service: class: Memcache calls: - [addServer, ['your_memcache_address', 'your_memcache_port']] my.memcached.session.handler: class: Lsw\MemcacheBundle\Session\Storage\LockingSessionHandler arguments: - "@my.memcache.service" - prefix: 'your_prefix' - expiretime: 'your_expire_time'
Doctrine 支持
此捆绑包还提供了对在Memcache服务器上执行Doctrine缓存的支持。要启用Doctrine缓存,您必须通过doctrine
键启用它。请注意,您可以指定所有三种类型的Doctrine缓存:'metadata'、'result'和'query'。这些子键中所需的关键字是pool
(一个有效的池)和entity_manager
(通常是:默认)。您还可以指定一个prefix
。
lsw_memcache: doctrine: metadata_cache: pool: default entity_manager: default # the name of your entity_manager connection document_manager: default # the name of your document_manager connection result_cache: pool: default entity_manager: [default, read] # you may specify multiple entity_managers prefix: "result_" # you may specify a prefix for the entries query_cache: pool: default entity_manager: default # pools
防火墙支持
此捆绑包还提供对限制每个IP地址并发请求数量的防火墙的支持。它维护每个IP地址的运行请求数计数器,并在必要时延迟(节流)请求。要启用防火墙支持,您必须通过firewall
键启用它。请注意,防火墙支持所需的唯一子键是pool
(一个有效的池)。您还可以指定一个prefix
和一个concurrency
(默认是10)。如果您使用一个或多个反向代理,则在reverse_proxies
键中指定它们。
lsw_memcache: firewall: pool: firewall prefix: "firewall_" concurrency: 10 reverse_proxies: [10.0.0.1] # pools
ADP:防狗群效应
让我们分析一个高流量网站案例,看看Memcache是如何表现的
您的缓存存储时间为90分钟。计算缓存值需要大约3秒,从缓存中读取缓存值需要1毫秒。您每秒大约有5000个请求,假设值已缓存。您每秒得到5000个请求,大约需要5000毫秒来从缓存中读取值。您可能会认为这是不可能的,因为5000 > 1000,但这取决于您的Web服务器上的工作进程数量。假设在高负载下大约有100个工作进程,每个工作进程有75个线程。您的Web请求每个大约需要20毫秒。每当缓存失效(90分钟后),在3秒内,将有15000个请求得到缓存未命中。所有得到未命中的线程将开始计算缓存值(因为它们不知道其他线程正在做同样的事情)。这意味着在(几乎)3秒内,服务器不会回答任何请求,但请求仍在不断涌入。由于每个工作进程有75个线程(保持100 x 75个连接),必须增加工作进程的数量才能处理它们。
大量分叉将导致额外的CPU使用,并且每个工作进程将使用额外的RAM。这种意外的RAM和CPU增加被称为“狗群效应”或“冲击群”或“雷鸣群”,在Web服务的高峰时段是非常不受欢迎的。
有一个解决方案:我们在计算新值的同时提供旧缓存条目,通过使用原子的读写操作,我们可以确保在内容失效时只有一条线程会收到缓存未命中。该算法在LswMemcacheBundle的AntiDogPileMemcache类中实现。它提供了getAdp()、setAdp()和deleteAdp()函数,可以用作正常get、set和delete的替代。
请注意
- 如果您的访问量很低,或者计算新值相对较快,那么可能不需要ADP。
- 如果可以将大计算分解成更小的部分,甚至为每个部分指定不同的超时时间,那么可能不需要ADP。
- ADP可能会为您提供比指定的失效时间更早的数据。特别是当线程/工作进程在“get”请求中获得“false”时,但之后未能“set”新计算值。
- ADP的"getAdp"、"setAdp"和"deleteAdp"比普通的"get"、"set"和"delete"更昂贵,这会减慢所有缓存命中速度。
- ADP不能保证不会出现狗群效应。重启Memcache、清除数据或RAM不足也会导致键被移除,你无论如何都会遇到这个问题。
注意事项
LswMemcacheBundle使用的是'memcache' PHP扩展(memcached客户端),而不是基于libmemcache的'memcached' PHP扩展。
本捆绑包的1.0版本使用了其他扩展。在捆绑包的2.0版本中,选择了PECL "memcache"的完整功能版本3.0.8(没有'd'),因为它具有完整的功能集,设计良好且支持良好。
已知问题
调用memcache set操作的会话写入是在页面渲染之后执行的。memcache数据收集器的collect调用是在页面渲染完成之前执行的,因此在会话写入之前也执行。这导致会话写入不会显示在Web调试工具栏中。
致谢
Doctrine支持基于SncRedisBundle的实现
https://github.com/snc/SncRedisBundle 由Henrik Westphal提供
- DependencyInjection/LswMemcacheExtension.php
- DependencyInjection/Configuration.php
- DependencyInjection/Compiler/EnableSessionSupport.php
基于以下实现
https://github.com/Emagister/MemcachedBundle 由Christian Soronellas提供
- Command/StatisticsCommand.php
基于以下实现
https://github.com/beryllium/CacheBundle 由Kevin Boyd提供
许可证
本捆绑包受MIT许可证的约束。