我想我明白为什么会话是邪恶的,但为了快速的客户端用户体验,我不想在每个HTTP请求上重新查询数据库。 (作为比较,Java servlet可以毫不费力地将大量会话对象保留在内存中。)
PHP可以设置为执行此操作,还是必须序列化,因为它是从CGI / FastCGI运行的,因此每次请求进入时定义都是一个新进程? 我将使用LAMP运行PHP。
实际上,PHP处理会话的方式比你的Servlet例子好得多。 让我解释。
使用PHP(默认情况下)会话由文件系统上的文件表示。 当你调用session_start() ,它会检查一个文件是否存在,如果存在,就加载它。 如果不是,则创build一个然后locking它。 这有两个主要的好处。 首先,它允许同一台服务器上的许多进程“共享”会话数据。 其次,如果有人尝试DDOS你的网站,会话数据不会把它取下来(你的瓶颈将在别处,你不需要担心交换或内存空间不足,因为你有很多的会话)。
在PHP中的序列化/反序列化方法实际上是相当有效的,因为它们是用C编写的,因此被编译。 所以这不是瓶颈。 PHP的会话通常被称为evil的原因是,他们阻止。 当你打开一个会话文件时,它会获得文件上的排它锁(或者阻塞直到完成)。 它保持这个锁,直到会话被closures(可以通过脚本的结尾,或者通过session_write_close() ,这是可取的,因为它可以防止并发问题,但是要知道,如果你有一个长时间运行的请求, ,你会阻止。
现在,PHP方法的真正之处在于,你可以用一个用户级会话处理程序(在数据库中存储会话数据,memcached,NoSQL数据库等)replace会话处理程序。 为什么这么好? 因为然后用完全相同的代码,你可以从一台服务器迁移到很多。 所有你需要做的就是调用session_set_save_handler() …
现在,至于你的“我不想在每个请求上重新查询数据库”,我问为什么不呢? 你所做的只是一个简单的PK查找。 除非你真的打乱了架构,否则即使更新/写入/删除语句也应该是非常有效的。 我build议去一个内存表(在MySQL中),因为它更快,你不关心维护数据,如果服务器重新启动。 如果你是这个问题,安装memcached,让它处理会话的存储(所以你不需要SQL)…