微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PHP会话写原子吗?

如何解决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个函数来写数据:

  • _write,在Win32上
  • prwite,这似乎是UNIX的功能,老实说,我对此并不了解。
  • write,这是基本的C系统调用。

按照上面的链接,如果遇到错误(磁盘空间不足,未经授权的访问,锁定的文件等),它们都不会刷新写缓冲区,因此它们都是“原子的”。 / p>

ps_files_write返回一个状态值(ps_files_writeSUCCESS),然后在FAILURE中检入以向PHP脚本返回php_session_save_current_state

是的,通常,您可以认为会话写入是“原子的”,即使在某些情况下您将无法保证(如果突然断电,系统会在微秒内停止​​,因此无法保存任何内容) ...)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。