如何解决PHP会话写原子吗?
由于PHP会话处理程序过去存在某种缺陷,因此几年前我们开发了一个自制的会话处理程序。 但是似乎当前的PHP版本已经开发完善并且缺陷消失了,我们决定使用PHP的默认会话处理程序(因为它比使用dbms来保存会话数据的处理程序要快得多-有时必须读取/写入兆字节)数据)。
我们找不到答案的唯一问题是PHP的默认会话处理程序是否是原子的?
我们知道会话文件被锁定了,因此很容易出现竞争状况,但是原子性又如何呢?如果要将兆字节的数据保存在会话文件中,并且中间发生一些错误(例如断电,崩溃或磁盘故障),该怎么办。现在会发生什么?会话数据现在被破坏了吗?还是旧数据仍然存在?
我们的团队中没有C程序员,但是我查看了PHP的源代码,发现该行负责将会话写入文件,但是我找不到s_write()的源代码文件
ret = PS(mod)->s_write(&PS(mod_data),PS(id),val,PS(gc_maxlifetime));
这是源文件(第487行): https://github.com/php/php-src/blob/master/ext/session/session.c
解决方法
在深入研究源代码之后,我发现了function that writes the data to the disk。
String jsonString = '''[
{
"id": 1,"code": "AF","dial_code": "+93","name": "افغانستان"
},{
"id": 2,"code": "AX","dial_code": "+358","name": "Åland"
},{
"id": 3,"code": "AL","dial_code": "+355","name": "Shqipëria"
}
]
''';
可以使用3个函数来写数据:
按照上面的链接,如果遇到错误(磁盘空间不足,未经授权的访问,锁定的文件等),它们都不会刷新写缓冲区,因此它们都是“原子的”。 / p>
ps_files_write
返回一个状态值(ps_files_write
或SUCCESS
),然后在FAILURE
中检入以向PHP脚本返回php_session_save_current_state
是的,通常,您可以认为会话写入是“原子的”,即使在某些情况下您将无法保证(如果突然断电,系统会在微秒内停止,因此无法保存任何内容) ...)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。