PHP 有几种会话设置,用于控制发生垃圾收集(即删除过期会话)的概率。
我的问题是:这个概率是否适用于任何给定 Apache 服务器上所有虚拟主机上正在运行的所有 Apache 线程?
例如:
- 如果概率设置为 1/100,是否意味着任何运行 PHP 进程的 Apache 线程进入可能运行 gc 的进程池吗?
- 或者,这是否仅适用于任何给定 VirtualHost 上运行的线程?或者其他类型的分区?
- 最后,如果 PHP 进程触发了 gc,它会在所有 PHP 会话上执行 gc 吗?还是只针对该 VirtualHost 的会话?还是其他类型的分区?
我正在尝试判断是否需要调整给定 VirtualHost、整个服务器或其他服务器的 gc_probability 设置。
答案1
如果将概率设置为 1/100,是否意味着任何运行 PHP 进程的 Apache 线程都会进入可能运行 gc 的进程池?
如果该过程涉及会话 [session_start()],那么是的,它可能会运行垃圾收集。
如果你需要不同的虚拟主机有不同的垃圾收集和会话,那么你应该使用session.save_path选项为每个虚拟主机设置不同的路径。您可以在 apache 虚拟主机配置中使用类似“php_value session.save_path "/srv/www/www.example.org/sessions" 的指令执行此操作。如果您有多个不同的应用程序在运行,并且具有不同的会话要求,您可能需要设置不同的路径和 GC。
说实话,PHP 会话垃圾收集功能并不是那么好。您最好完全禁用它,并使用从 cron 启动的脚本定期清理旧会话。或者另一种需要 PHP 应用程序支持的替代方案是将您的会话存储在数据库中。
如果您为外部方托管内容,那么您几乎肯定希望为每个虚拟主机设置一个单独的会话目录。