PHP会话(session)工作原理分析
[文章作者:磨延城 转载请注明原文出处: https://mo2g.com/view/149/ ]
之前博客启用了swoole拓展,一段时间后发现验证码,留言等相关功能无法使用.经过仔细排查,才找到原因.——原生PHP的session功能无法使用了.
之前博客启用了swoole拓展,一段时间后发现验证码,留言等相关功能无法使用。经过仔细排查,才找到原因。——原生PHP的session功能无法使用了。
由于swoole拓展的内部运行机制比较特殊,导致PHP的setcookie函数,等相关操作都失效了,PHP原生session操作也就异常了。
先看一段PHP操作session的代码:
<?php session_start(); $_SESSION['mPHP'] = '磨途歌';
当调用session_start()的时候,PHP会启动新会话或者重用现有会话。
PHP是根据什么来判定要启动新会话还是重用现有会话呢?PHP默认是根据cookie。
如果$_COOKIE['PHPSESSID']存在,就重用会话,不存在,就创建新会话。PHPSESSID为php.ini中定义的默认值。
再上一段代码,看完或许就明白了:
<?php if( isset( $_COOKIE['PHPSESSID'] ) ) { session_id( $_COOKIE['PHPSESSID'] ); } session_start(); $_SESSION['mPHP'] = '磨途歌';
php.ini默认把session保存为文件。这里假设PHPSESSID=123456,保存路径为c盘下的tmp文件夹
1)PHP脚本从cookie中获取会话ID
2)通过session_id()函数锁定session文件为:c:\tmp\phpsess_123456
3)当调用session_start()的时候,PHP脚本就读取c:\tmp\phpsess_123456中的值,经过处理后,赋值给$_SESSION全局变量
4)PHP脚本结束时,就把$_SESSION编码后重新保存到c:\tmp\phpsess_123456
这就是PHP的session的运作流程了。
之后再写一篇文章,分享如何解决swoole拓展导致session异常的问题。
我来说两句: