Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.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_Session_Caching - Fatal编程技术网

Php 身份验证和存储用户详细信息的方法

Php 身份验证和存储用户详细信息的方法,php,mysql,session,caching,Php,Mysql,Session,Caching,我正在使用Zend框架,但我的问题主要是关于sessions/databases/auth-PHP-MySQL 目前,这是我的身份验证方法: 1用户登录,详细信息在数据库中检查。 -标准的东西真的 2如果详细信息正确,则会话中仅存储用户的唯一ID和安全令牌用户唯一ID+IP+浏览器信息+salt。会话将被写入文件系统 我一直在阅读,很多人说在会话中存储东西不是一个好主意,你应该只写一个唯一的ID,它引用用户的详细信息和一个安全令牌来防止会话劫持。这就是我采用的方法,我在会话中编写用户的详细信息,

我正在使用Zend框架,但我的问题主要是关于sessions/databases/auth-PHP-MySQL

目前,这是我的身份验证方法:

1用户登录,详细信息在数据库中检查。 -标准的东西真的

2如果详细信息正确,则会话中仅存储用户的唯一ID和安全令牌用户唯一ID+IP+浏览器信息+salt。会话将被写入文件系统

我一直在阅读,很多人说在会话中存储东西不是一个好主意,你应该只写一个唯一的ID,它引用用户的详细信息和一个安全令牌来防止会话劫持。这就是我采用的方法,我在会话中编写用户的详细信息,但我已经将其删除了。我想知道你对此的看法。 我将会话保留在文件系统中,因为我不在多台服务器上运行,而且我只将一点点数据写入会话,因此我认为将会话保留在文件系统中以减少数据库负载的性能会更好。一旦会话是基于身份验证编写的,从那时起它实际上是只读的。 3用户的其他详细信息(如订阅详细信息、权限、帐户信息等)缓存在文件系统中。如果我想要更高的性能,可以随时轻松地将其移动到内存中

因此,用户的详细信息不会保存在会话中,而是缓存在文件系统中。我使用的是Zend_缓存,唯一的缓存id类似于md5/Cache/auth/2892,数字是用户的唯一id。我想这种方法的好处是,一旦用户登录,基本上就不会运行数据库查询来获取用户的详细信息。只是想知道这种方法是否比让所有人都在会议上好。。。 4当用户在整个站点中移动时,唯一需要检查的是会话中的ID和安全令牌

因此,总的来说,第一个问题是1文件系统在这方面是否比数据库更高效2我是否采取了足够的安全预防措施3将用户详细信息从会话中分离到缓存文件是一项毫无意义的任务


谢谢。

1通过制作循环脚本,您可以轻松测试哪个更快。无论如何,使用文件系统的一个缺点是每次更新数据库时都需要更新缓存文件。数据拷贝通常是一件坏事。此外,除非你有数以百万计的游客,否则我认为在任何战略中,在速度方面都不会有任何实际差异。和不要忘记,会话也存储在文件系统中。每个会话一个文件

是比文件系统更快的查询:取决于。已启用查询缓存。在MySql中,默认情况下是这样,您可能很幸运,只需要访问内存。如果不是,db无论如何都需要执行文件系统访问。第二,使用索引对查询进行优化的程度。服务器硬盘有多大


3取决于从数据库中获取它的速度。一般来说,缓存可以神奇地提高性能,但是使用memcached或类似的东西在内存中缓存会更好。一般来说,我会避免在文件中复制数据。但是,当然,如果需要secods从数据库查询数据,则可以使用文件系统缓存。另外,如果您有许多用户。。就像10.000+一样,您必须创建一些文件夹系统,因为将10.000个缓存文件放在同一个文件夹中会降低访问时间

你问的问题很多

会议

PHP中的会话既快速又高效。在一台适度更新的服务器上,数千个小型基于磁盘的会话不会成为性能瓶颈。编写自己的处理程序也不是很容易;PHP手册中有将其放入数据库的示例

关于会话的唯一最佳实践规则是:只给web浏览器一个东西,会话ID。将登录的用户ID放在会话中,并在需要时从DB检索这些详细信息也是最佳实践。这也意味着用户信息可以更改,他们可以在下一次页面更新时获得

听起来你不会有这个问题,但要当心,不要在一个会话中扔很多东西。几K的数据表明,几十个标量就可以了。将许多对象和大型数据数组抛入其中会引起注意。如果您对特定页面执行此操作,请记住在完成页面后将其丢弃在会话中

您可能还希望使用会话变量实现自己的登录超时。php.ini中的垃圾收集设置用于管理会话数据的存储,而不是进行登录超时

缓存

这是一个复杂的主题,在实现任何内容之前,您可能需要开始收集通常为页面加载时间的指标

< >为了实现任何类型的缓存,您需要考虑数据的生存期。 '重新缓存以及在缓存未命中时重新生成它的成本有多高。仅仅用memcache解决这个问题并不是一个解决方案;您仍然需要了解缓存参数以及memcache如何解释它们。这也适用于任何持久性存储解决方案,包括基于磁盘的会话,但我之所以强调memcache,是因为它是一种引人注目的解决方案,并且具有非常积极的过期机制

一个经常被忽略的例子是在一个页面中多次从数据库加载相同的数据:一个好的ORM可以为您做到这一点,而不依赖MySQL查询缓存。另一个被忽略的例子是在每个页面上运行的小查询:在一个中等繁忙的服务器上缓存这些查询几秒钟,数据库负载将大大降低


最后,多个级别的缓存通常比一次更有效和可伸缩,因为它们可以利用彼此的过期时间。它还可以很好地进行抽象:例如,将其隐藏在您的ORM中,理论上它对您的所有对象都是不可见的和自动的

我们说的是多大的负荷?