2011-07-01 192 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

相關問題