2011-07-01 166 views
7

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

目前,我只是使用SESSIONS。客户端调用登录API,并需要其他任何API。但是我担心有20万人全都打电话给这项服务,并且有所有这些会话。我不确定服务器将如何回应。有小费吗?这通常如何处理?像Facebook,Flickr等......

+0

PHP和它的会话比你想像的更强大。如果服务器上的负载仍然过大(稍后优化 - 不会过早!),请考虑更改PHP中的'session.save_handler'指令以使用数据库来存储会话(而不是文件系统)。除此之外,请始终使用安全的身份验证库,而不是自行开发一个。例如:https:// github。com/delight-im/PHP-Auth,它既是框架不可知的,也是数据库不可知的。 – caw

回答

3

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

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

附录:

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

现在,人们可能会考虑它们是否被存储并且易于访问,数据库的缓存位与唯一的用户会话之间的区别。

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

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

这意味着,如果用户仅击中您的网站一次,您必须为该用户分配资源,即使他再也没有回来。你必须,否则会议提供有效的价值。

如果您获得大量流量,您将获得许多新的会话进行管理。理论上,在恶劣的环境下,会话可以无限制地激增。如果您突然在您的网站上获得10,000次点击,则您可以在会话的最短使用期限内管理这些点击的剩余部分。你必须将资源(内存或磁盘)专用于它们,你必须跟踪它们,然后不可避免地你必须清理它们。

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

最后,通过会话,您需要在您的基础架构中共享它们,以便与机器之间跳转(无论出于何种原因)与用户一起旅行。缓存不。理想情况下,您希望将用户保留在一组资源中,以便缓存可以完成他们的工作,但无论系统移动还是停留(由于缓存重用,停留时它们都会更好)。如果你不复制你的会话,他们根本不工作。

DB命中加起来,他们可以很便宜,但他们从来没有自由。但是会话也有其自身的成本,所以考虑它们以及它们如何应用于您的架构中非常重要。

+0

我在历史上不是后端程序员,所以我想到了查询的速度。每次登录一次是1次查询与登录。也许这是可以忽略的? – user123321

+0

非常好的跟进解释!谢谢。 – user123321

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的,等....

现在,你可以不使用任何API,而无需使用OAuth(虽然我觉得通过会话认证更容易实现)。这是进行身份验证而不必共享密码的新事实标准。 PHP(Rasmus)的创建者已经做了一个教程,解释如何Writing an OAuth Provider Service。在google中搜索oauth php你应该获得足够多的信息。

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

+0

哇。多么好的解释。我会尽可能多地阅读。不幸的是,我的知识渊博程度不够,无法提出任何后续问题。谢谢! – user123321

+0

没问题要求;)。希望我可以帮助.. – Alfred

相关问题