扩展数据库中的会话数据

时间:2015-10-20 22:35:36

标签: php mysql session silex

我的Silex应用程序始终将会话数据存储在服务器上,但我想转移到mysql数据库,这样我就不会被绑定到单个Web服务器了。不过,我对性能感到疑惑。我打算使用PdoSessionHandler。我的问题是:目前我有大约177K存储会话。垃圾收集会慢吗?从文件系统迁移到数据库会不会影响性能?

2 个答案:

答案 0 :(得分:2)

您是否会在会话到期时获得索引?如果没有索引,那么是的,它会很慢。 OTOH,您认为在磁盘上搜索177,000个文件的速度有多快?可能 lot 比使用数据库做它明确设计的事情要慢。

你会受到性能打击吗?大概。会有意义吗?取决于系统正在对数据库执行的操作,数据库的配置以及运行它的服务器。

简而言之 - 是的,将数据库用作会话存储将是不可避免的成本,但它可能值得为它提供的能力。

我建议使用Redis,虽然支持磁盘。

答案 1 :(得分:1)

老实说,使用MySQL数据库作为缩放名称中的事实会话存储是您在分布式会话存储中可能犯的最严重错误之一。

让我解释一下原因......

  1. 您的MySQL数据库可能已经是您最大的瓶颈,因为PHP可能连接到它几乎所有其他持久性的东西。但是,可能有一些请求URI,其中PHP可能依赖于缓存而不是访问您的数据库。如果您在这些页面上使用会话(那么,再次出现连接开销)。
  2. 在MySQL中从大表(在你的情况下为GC)中删除行的成本在规模上可能非常昂贵。在MyISAM中,整个表被锁定(整个站点在大型GC循环期间阻塞的结果最差)。使用InnoDB,DBMS必须将所有撤消信息写入大型提交日志,从而占用额外的I / O,有时会导致缓慢,具体取决于碎片问题。如果您也重新编制索引问题,这可能会特别成问题。
  3. 已有更好的替代品,他们要求您编写 less 代码!
  4. 我的建议是改用memcached之类的东西。在连接开销可以显着降低的情况下,没有要编写的db模式,默认情况下,会话处理程序的驱动程序已存在于PHP中。在memcached之上抛出类似igbinary之类的东西,你可以获得超快速的序列化以及更便宜的内存会话处理,可以轻松扩展和分发,只需最少的工作量和副作用。例如,AWS为其提供了用于其PaS中的memcached / redis负载平衡和复制解决方案的Elasticache。如果您不在AWS上,还有Twem Prox