是否有比PHP会话更现代的替代方法?还是PHP会话仍然是存储信息的主要选择?我读的是:https://pasztor.at/blog/stop-using-php-sessions。我仍在学习PHP,坦率地说,我一无所知。
答案 0 :(得分:5)
您的第一个假设不正确。 PHP会话不是您存储数据的地方。数据库,文件,文档存储等是您存储数据的地方。
会话“数据”只是序列化形式包含在$ _SESSION数组中的变量。您可以对变量运行serialize()和unserialize()以获得对这些变量的外观的了解。
在脚本中,一旦使用session_start()启动了会话,则在$ _SESSION中添加更改或删除变量时,php会将其序列化并为您存储。
一旦会话存在,并且用户发出另一个请求,该请求被标识为通常通过cookie传递给客户端的同一用户(具有相同的会话ID),则在发出session_start()时,PHP读取序列化会话文件中的数据,然后将其反序列化,然后将其存储回$ _SESSION中。
默认情况下,PHP将各个会话数据存储为文件系统上的文件。对于中小型应用程序,这是高性能的。
很明显,人们在PHP会话中存储的内容基本上是从您可能拥有的其他持久性存储中读取的变量,因此您可以避免执行诸如重新查询数据库以获取用户的名称和user_id之类的操作谁已经登录了您的应用程序。
它不是该数据的主版本,也不是该数据更改时的更新位置。那将是原始数据库或mongodb集合。
您发布的文章有许多明确的假设,包括:
然后他继续详细介绍允许共享会话处理程序解决他描述的比赛条件的几种选择
正如您所说,您还不清楚实际的会话是什么,它们如何工作或为您做什么。要了解PHP脚本,重要的一点是它们与单个请求相关联,而会话是不重复昂贵的数据库读取的一种方式。它实际上是PHP在适合您的设计时使用(或不使用)的变量缓存。
正如您在文章中指出的那样,此时您已经有了一个集群,人们经常将数据存储到共享资源中,该资源可以是关系数据库,也可以是许多其他后端中的任何一个,每个后端都有与其目标相匹配的不同属性。
同样,为了更改会话处理程序,通常会进行代码更改以实现所需的会话处理程序功能,并且有一些方法可以减轻您发布的文章中提到的问题,人们使用的所有持久性产品。
最后但并非最不重要的一点是,所描述的问题几乎在任何集群服务器端进程中都存在,并且并非PHP或其会话机制所独有。
答案 1 :(得分:3)
通常,这将取决于用例和应用程序的其他要求,并且在大多数情况下,人们将使用PHP框架来处理会话。
例如,对于Yii 2框架,该框架提供了用于实现不同类型会话存储的不同会话类。看看这里https://www.yiiframework.com/doc/guide/2.0/en/runtime-sessions-cookies。
了解各种可用的会议类型,可以通过权衡利弊来做出决定。您也可以在此处阅读以进一步了解https://www.phparch.com/2018/01/php-sessions-in-depth/