实现Web服务登录的最佳方法是什么?

时间:2011-07-01 23:52:47

标签: php web-services authentication login

我有一个php webservice,可以调用(从手机上)来执行某些任务。要完成这些任务,调用者必须“登录”。处理身份验证的最佳方法是什么?

目前,我只是在使用SESSIONS。客户端调用登录API以及所需的任何其他API。但是我担心让20万人都打电话给这项服务并拥有所有这些会议的影响。我不确定服务器将如何响应。有小费吗?这通常如何处理?像facebook,flickr等......

2 个答案:

答案 0 :(得分:3)

  

目前,我只是在使用SESSIONS。   客户端调用登录API,任何   需要其他API。但我很担心   关于拥有200,000的影响   所有人都称这项服务   有所有这些会议。

标准这些会话触及光盘,因为默认session_save_handler设置为file。系统最好不要触摸光盘(内存要快得多)。您可以尝试覆盖session_set_save_handler以使用与file不同的内容。例如,您可以将会话存储在:

  • redis(我喜欢predis客户端)。更快的是install C extension,但需要root访问才能重新编译PHP。如果你拥有那么多用户,你应该拥有/租用VPS。如果您无法在计算机上安装任何内容,那么http://redistogo.com的优秀人员会为您提供免费计划(5 MB)。我上面提到过,如果你真的想要表现,你应该有能力安装东西。
  • memcached

这些内存数据库也支持更好的扩展。您还应该使用这些数据库来缓存其余的数据库查询(MySQL?)。你必须记住,与仅使用内存相比,触摸光盘非常慢。

您还应该安装APC以获得最佳效果。

  

这通常如何处理?喜欢   facebook,flickr等....

现在,如果不使用OAuth就不能使用任何API(尽管我认为通过会话进行身份验证更容易实现)。它是无需共享密码即可进行身份验证的新事实标准。 PHP的创建者(Rasmus)制作了一个教程,解释如何Writing an OAuth Provider Service。在Google中搜索oauth php,您应该获得足够的信息。

现在Facebook的大多数网站都在使用HipHop而不是普通的旧版PHP来加速他们的网站。 PHP有open-sourced很多你可以/应该使用的作品:

答案 1 :(得分:3)

如果这是由自定义客户端程序(即您的手机)而不是浏览器调用的,那么为什么要“将它们登录”。相反,只需使用HTTP身份验证(如果您使用的是SSL或您自己的方案,则使用DIGEST或BASIC),并且每次都“登录”。

然后您不必担心会话,负载平衡和故障转移等问题。保持无状态。

附录:

当然,对数据库的点击次数越少越好,这只是一般规则。但与此同时,数据库的许多命中都是由数据库服务器上的缓存页面处理的,或者可能是应用程序缓存处理,因此它们永远不会访问数据库服务器。因此,在某些情况下,特别是针对索引列的单行查询,数据库命中可能非常便宜。

现在,人们可能会考虑是否存储和访问它们,数据库的缓存位和唯一用户会话之间的区别是什么。

嗯,主要是,差异在于与数据的合同。缓存项目的生命周期与您拥有的内存量和未缓存的活动量成正比。给它少量的内存,缓存的项目可能有很短的寿命。给它留下很多记忆,缓存的项目有更好的机会。如果缓存数据的内存量足够大,以至于该数据的重复活动继续使用缓存,则缓存是一个巨大的胜利。如果您的缓存如此快速地回收,那么缓存中没有“缓存”,您缓存几乎没有任何价值。但重点是系统可以使用或不使用缓存,缓存只是一种性能增强。

然而,会话有不同的合同。许多会话具有特定的最短寿命,通常以分钟为单位测量:10,20,甚至30分钟。

这意味着,如果用户只点击一次您的网站,即使他从未回来,您也必须将资源专用于该用户。你必须这样做,否则会话实际上没有价值。

如果您获得了大量流量,则需要管理很多新会话。从理论上讲,在恶劣的环境下,会议可以毫无限制地飙升。如果您的网站突然获得10,000次点击,您可以在会话的最短生命周期内管理这些点击的剩余部分。你必须将资源(内存或磁盘)专用于它们,你必须跟踪它们,然后,你不得不清理它们。

缓存是固定资源。它只会增长到你配置它的大小。您没有义务在缓存中保留任何内容,并且如前所述,系统将在有或没有缓存的情况下运行。高速缓存自然回收。如果你获得10,000次点击的激增,他们可能会推动你的缓存,但之后他们就不会在你的系统上留下任何痕迹。它们可以在1或2分钟内击中并消失,永远不会被再次看到。

最后,对于会话,您需要在基础架构之间共享它们,以便它们随着用户从一台机器跳到另一台机器(无论出于何种原因)而与用户一起旅行。缓存没有。理想情况下,您希望将用户本地保留在一组资源中,以便缓存可以完成其工作,但无论系统移动还是停留,系统都能正常工作(由于缓存重用,它只会保留更好的效果)。如果您不复制会话,则根本不起作用。

数据库命中加起来,它们可以便宜,但它们永远不会自由。但是会话也有自己的成本,所以考虑它们以及它们在您的架构中的应用方式非常重要。