在不同的php5-fpm应用程序池下运行的PHP是否有可能(但是概率很低)会话文件名冲突?我想将会话存储路径保留在每个池的默认位置,我只是想确保这不可能。我无法找到专门解决此问题的文档。
答案 0 :(得分:0)
简短的回答:你有更多的机会赢得彩票,同时遭遇连续3次点击,而超级新星的爆发比地球上看不到(不考虑光线传播的时间)。即使它以某种方式做到了,它也会很快被其他东西无效(其他一些检查失败)。所以这不是你必须担心的事情。
答案很长:好的,所以我挖到PHP源代码,首先我应该说,即使有可能,它发生的可能性实际上是无穷小的。首先,随机数发生器非常随机。因此,为了实现这一点,2个独立CPU内核上的2个独立进程必须以某种方式生成完全相同的随机会话字符串,这涉及人员的IP地址和添加到随机数中的微秒时间(mmmmmmm高精度时钟)。只有这些变量发生碰撞的可能性基本上使得这几乎是不可能的。但更进一步,其中一个进程必须创建会话并验证文件不存在,然后在创建文件之前,另一个进程必须执行相同的操作。所以它必须在几微秒到几纳秒内发生。除非发生真正不幸的上下文切换,否则检查文件的操作甚至不接近在代码中创建文件的操作。请记住,这都是用C代码完成的,所以速度很快。磁盘速度并不是真正的问题,因为文件创建本质上是原子的,并存储在硬盘的L1缓存中。
所以这是./ext/session/mod_files.c
中的重要功能/*
* Create session ID.
* PARAMETERS: PS_CREATE_SID_ARGS in php_session.h
* RETURN VALUE: Valid session ID(zend_string *) or NULL for FAILURE.
*
* PS_CREATE_SID_FUNC() must check collision. i.e. Check session data if
* new sid exists already.
* *mod_data is guaranteed to have non-NULL value.
* NOTE: Default php_session_create_id() does not check collision. If
* NULL is returned, session module create new ID by using php_session_create_id().
* If php_session_create_id() fails due to invalid configuration, it raises E_ERROR.
* NULL return value checks from php_session_create_id() is not required generally.
*/
PS_CREATE_SID_FUNC(files)
首先,通过创建SID然后检查文件,它真的很难确保没有冲突。如果这个函数连续3次失败,并且其他一些疯狂的几乎不可能的情况发生,它可能会尝试创建一个SID而不检查已经存在的类似会话。要做到这一点,你必须打开php严格模式,并且检查w /文件必须再次失败2次。
我宁愿不必详细说明: - )