Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将数据存储到会话中,并在;“主要”;行动_Php_Mysql_Database_Performance_Session_Local Storage_Sqlite - Fatal编程技术网

Php 将数据存储到会话中,并在;“主要”;行动

Php 将数据存储到会话中,并在;“主要”;行动,php,mysql,database,performance,session,local-storage,sqlite,Php,Mysql,Database,Performance,Session,Local Storage,Sqlite,我知道有数百个这样的问题,但我问的是略有不同 当用户登录时,我希望从数据库中的每个表中获取他们的所有数据,并将其存储在会话变量中(显然不是敏感数据,如加密密码/密码等,基本上是对黑客无用或没有价值的数据!!),当用户使用网站时,将使用会话中存储的相关数据,而不是每次访问数据库。此外,当数据被更改或添加时,这将被写入或添加到会话文件中,并且在执行诸如“保存”或“注销”之类的主要操作时,新的/更改的数据将被写入数据库 我希望这样做的原因只是为了提高效率,我希望我的应用程序不仅速度快,而且资源消耗少。

我知道有数百个这样的问题,但我问的是略有不同

当用户登录时,我希望从数据库中的每个表中获取他们的所有数据,并将其存储在会话变量中(显然不是敏感数据,如加密密码/密码等,基本上是对黑客无用或没有价值的数据!!),当用户使用网站时,将使用会话中存储的相关数据,而不是每次访问数据库。此外,当数据被更改或添加时,这将被写入或添加到会话文件中,并且在执行诸如“保存”或“注销”之类的主要操作时,新的/更改的数据将被写入数据库

我希望这样做的原因只是为了提高效率,我希望我的应用程序不仅速度快,而且资源消耗少。我不是这两方面的专家,这可以解释为什么我的想法没有区别,或者资源更密集

如果有我的解决方案的替代方案,请让我知道,或者如果我的解决方案有改进之处,我将很高兴听到

多谢各位。
我的应用程序使用的是PHP和mysql。

redis是一个很好的解决方案,如果您可以使用它(有时开发人员出于某种原因无法安装外部模块),我会使用您的会话方法,但使用编码/加密和序列化的数据。或者,我更喜欢使用,例如:



顺便说一句,哪种浏览器可以很好地使用,但需要做一些调整,特别是在应用程序使用jquery和ajax的情况下。这真的很难做到。

如果其中任何一项不适用于您的应用程序,请忽略。一般来说,我反对将会话用作缓存(特别是当会话中的任何内容都要写回数据库时)。原因如下

  • 编辑会话需要用户的请求。在请求-响应周期之外编辑php会话非常困难。因此,如果用户Alice做出了影响Bob的更改,则无法脏掉Bob的缓存
  • 您不能假设用户将注销。他们可能会离开,因此如果会话超时,您必须处理保存信息的问题。同样,在请求-响应周期之外,这是很困难的,在用户回来之前,您不能将会话文件一直放在那里(默认情况下,php将gc它们)
  • 如果用户需要身份验证,则在会话中存储私有信息。一些用户可能对此不满意。更重要的是,黑客可以利用这些私人信息对最终用户进行社会工程攻击
  • Mallory(黑客)可能无法使用您在会话中输入的信息,但她可能会使其中毒(即缓存中毒),从而在您将缓存写入永久存储时引发各种问题。会话比redis或memcache更容易中毒

TL;DR在使用会话缓存时需要考虑很多因素。我的建议是redis/memcache。

这种工作需要使用memcache。要解决将更新的数据保存在任何地方的问题,您可以创建获取数据的函数,例如,当用户登录您时,对用户进行身份验证,然后使用以下唯一密钥将所有用户数据插入memcache:-

用户\标识\用户用户名的用户名

USER\u ID\u用户名的名称 等等

现在,创建更多函数,以便在需要时获取所有这些数据。前

function getName($user_id){
    if(Memcache::get($user_id."_name"){
        return Memcache::get($user_id."_name");
    } else {
        //Call another function which will fetch the data from the DB and store it in the cache
    }
}

您需要创建函数来获取与用户相关的各种数据。正如你所说,你想更新一些重大事件的数据。您可以尝试使用CRON或类似的工具更新数据,因为正如tazer84所提到的,用户可能永远不会注销。

我也使用OP描述的方法来避免调用db。例如,当用户登录时,我在他们的控制面板上有一个“欢迎提示”,如

欢迎,

如果我只在$\u会话上存储他的
user\u id
,那么在每个页面视图中,我必须从数据库中检索他的信息,只是为了让他的名字可用,比如
从user\u id=$\u会话['user']['user\u id']
的用户中选择user\u name,所以为了避免这种情况,我将他的一些信息存储在$\u会话中

小心!当数据发生更改时,必须在db中修改数据,如果成功,还必须修改$\u会话

在我的示例中,当用户编辑其姓名时(我还将其存储在$\u会话中,以便使用它来欢迎提示),我会执行以下操作:

If (UpdateCurrentUserData($new_data)) // this is the function that modifies the db
{
    $_SESSION['user']['user_name']=$new_data['user_name']; // update session also!
}
注意: php.ini中的session.gc\u maxlifest

此值表示垃圾收集器(存储$\u会话数据的磁盘上的文件)保护$\u会话不被擦除的时间

如果将该值设置得非常低,则如果用户空闲时间超过此值,则用户可能会意外地开始注销,因为垃圾收集器会太快地删除其会话文件

如果设置得太高,您可能会得到很多很久以前离开您网站的用户未使用的$\u会话文件

另外,我必须补充的是,
gc\u maxlifest
session.gc\u probability
一起工作,一般来说,高流量网站的概率较低,而低流量网站的概率较高,因为每个页面视图都有一个
会话。垃圾收集器将被激活的gc\u probability

这里有一个更详细的解释

你也可以在HTML5中找到,检查并

HTML5中的本地存储实际上使用浏览器数据库作为cookie,但它将数据永久存储到浏览器中

  • 除非有人强行从浏览器中删除数据以查找数据文件
  • 或者如果有人完全删除/卸载浏览器
  • 或者如果有人用t
    If (UpdateCurrentUserData($new_data)) // this is the function that modifies the db
    {
        $_SESSION['user']['user_name']=$new_data['user_name']; // update session also!
    }