首頁 > 後端開發 > php教程 > PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

Lisa Kudrow
發布: 2025-02-25 10:05:09
原創
426 人瀏覽過

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

>本文是從我們的姐妹網站之一CloudSpring共享的。如果您覺得很有幫助,請務必給他們訪問!

本教程將向您展示如何使用Amazon DynamoDB作為PHP會話的存儲設施。當您的應用程序利用彈性負載平衡和自動化服務時,此方法變得非常有用。您將需要啟用Amazon AWS帳戶使用EC2,Elastic Load Balancer和DynamoDB作為沿教程播放的先決條件。

鑰匙要點

  • > Amazon DynamoDB可以用作PHP會話的存儲設施,當應用程序利用彈性負載平衡和自動升級服務時,這特別有用。
  • >
  • >彈性負載平衡器充當一個或多個虛擬服務器的前端,其中分發了請求。自動化允許系統啟動更多的Web服務器克隆,當流量降低時關閉一些。 PHP會話數據應存儲在虛擬服務器之外。一個選項是將會話存儲在諸如DynamoDB之類的數據庫中,該數據庫是由Amazon管理的功能強大且快速的NOSQL數據庫。
  • >官方PHP SDK的AmazondynamodB類可註冊為會話經理。用於PHP的AWS SDK使開發人員更容易構建利用具有成本效益,可擴展和可靠的AWS Cloud的應用程序。
  • 什麼是彈性負載平衡器
  • 彈性負載平衡器充當一個或許多虛擬服務器的前端。它接受請求並將其分發在虛擬服務器中。可以通過克隆機器模板(AMI)來創建虛擬服務器,也可以在需要時被破壞。處理能力如果您的應用程序可以通過動態添加或減少虛擬服務器來改變您的應用程序。
和自動化?

自動加入遊戲時,系統還可以:

啟動更多的Web服務器克隆,當 當流量下降到預定義的閾值以下時,關閉其中的一些

>終止不健康的實例,並在需要時替換
  • 我該怎麼做?
  • > 您的任何應用程序都可以在這種環境中工作嗎?是的,如果滿足兩個關鍵要求:
  • >由於動態創建虛擬服務器,因此服務器應僅包含應用程序代碼而不包含任何數據。 DB服務很容易可用。
  • >
任何用戶會話狀態都應在虛擬服務器之外持續存在。這有點棘手,因為默認情況下,PHP模塊將這些數據存儲到Che Web服務器的文件系統中。

這是我們在此方面嘗試解決的問題。

不做什麼:粘性會話

粘性會話是將用戶會話綁定到特定應用程序實例的Elastic Load Balancer服務的功能,因此會話期間來自用戶的所有請求都將發送到同一虛擬服務器。會話cookie可以由負載平衡器或應用程序生成,但是:這被認為是不良習慣。理想的選擇是將應用程序設計為無狀態,但這並非總是可以的。

>將您的會話存儲在數據庫中

另一個選項是:將我們的會話存儲在數據庫中。它可能是應用程序或memcache實例或其他NOSQL數據庫的外部SQL數據庫。在這種情況下,DynamoDB似乎非常有趣,因為它是一個功能強大且快速的NOSQL數據庫,它由亞馬遜本身管理,並且可以從我們的虛擬服務器中訪問。此外,官方PHP SDK的AmazondynamodB類已經有能力註冊為會話經理。如果您從未聽說過DynamoDB,我建議您觀看此介紹性視頻。

演示應用程序

我整理了一個簡單的應用程序來測試整個機制,您可以從我們的GitHub存儲庫中下載源代碼。我們將使用彈性負載平衡器和至少兩個實例運行此應用程序。我們目前將不使用自動化。

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

該應用程序要求用戶選擇存儲在當前會話中並充當“登錄”的用戶名。如果會話中存在用戶名,則應用程序允許用戶插入一種“配置文件”,本質上是一系列的密鑰/值信息,例如名稱,姓氏,電子郵件等(鍵和值是字符串)。所有這些邏輯都包含在index.php文件中。

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

session.php 文件包含一個簡單的會話庫。該庫允許我們使用友好方法管理會話數據,例如$ session-> read('some_var')和$ session-> write('some_key','some_value')。可以將此會話對象配置為使用默認的PHP會話機制(如果我們是本地測試服務器)或自定義類。應用程序文件的第一步是會話啟動:
<span>require_once 'lib/session.php';
</span><span>try {
</span> <span>// Engine can be PHP or AmazonDynamoDB
</span> <span>$session = new Session($config['session']['engine'], $config['session']['params']);
</span><span>} catch (Exception $e) {
</span> <span>exit($e->getMessage());
</span><span>} // end try</span>
登入後複製
默認的引擎值是不需要參數的PHP。如果我們選擇“ Amazondynamodb”引擎,則會話構造函數將執行一些其他代碼:
<span>switch ($engine) {
</span><span>case 'AmazonDynamoDB':
</span><span>// Load AWS SDK
</span><span>require_once 'AWSSDKforPHP/sdk.class.php';
</span><span>// Create a list of credential sets that can be used with the SDK.
</span><span>CFCredentials<span>::</span>set($params['credentials']);
</span><span>// Instantiate a DynamoDB client
</span><span>$dynamodb = new AmazonDynamoDB();
</span><span>$dynamodb->set_region($params['region']);
</span><span>// Instantiate, configure, and register the session handler
</span><span>$this->handler = $dynamodb->register_session_handler(array(
</span><span>'table_name'       => $params['table_name'],
</span><span>'lifetime'         => $params['lifetime'],
</span><span>));
</span><span>break;</span>
登入後複製
首先,我們加載了必須已經安裝並可以觸及的AWS SDK,然後將我們的憑據加載到AWS環境中。從這一點上開始,我們可以使用AWS類,因此創建了AmazondynamodB的新實例,並使用我們的表所在的正確區域進行設置。最後,我們告訴我們的DynamoDB對象將自己註冊為會話經理,傳遞了使用表的名稱,這實際上就是我們所需要的。 config.php文件是我們要在此處使用要使用的引擎的應用程序,在此處保存了AWS憑據和DynamoDB設置。在index.php中,我還提供了一個小實用程序功能,如果我們不在本地服務器中,請獲取當前正在運行的實例的名稱。這對於檢查會話是否在我們的服務器中保持一致很有用。
<span>function getServerName() {
</span> <span>$host = $_SERVER['SERVER_NAME'];
</span> <span>if ('localhost' != $host) {
</span> <span>// Maybe we are on EC2, trying to catch the current instance ID
</span> <span>$ch = curl_init('http://169.254.169.254/latest/meta-data/instance-id');
</span> <span>curl_setopt($ch, CURLOPT_FAILONERROR, true);
</span> <span>curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
</span> <span>curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 2);
</span> <span>if ($ret = curl_exec($ch)) {
</span> <span>$host .= ' (instance ' . $ret . ')';
</span> <span>} // end if
</span> <span>curl_close($ch);
</span> <span>} // end if
</span> <span>return $host;
</span><span>} // end function</span>
登入後複製
函數getServername()使用EC2元數據API查找實例的名稱。 在車隊上運行應用程序 為了測試此應用程序,我們需要在負載平衡器後面至少有兩個Web服務器的機隊。我使用的服務器是配備以下設備的Ubuntu GNU/Linux實例:
  • apache Web服務器,
  • php 5.3(命令行和apache模塊),
  • >
  • 捲曲程序和PHP擴展,
  • 梨包裝管理器(需要輕鬆安裝SDK)
  • php的AWS SDK(我建議通過梨安裝)。
  • 如果您知道如何構建AMI,則可以從頭開始構建自己的AMI。但是您也可以使用我準備並公開的一種:AMI-4B42443F。該計算機已經包含應用程序和所有其他依賴項的PHP源代碼。一旦您準備好AMI……我們就可以!
  • 初始化會話存儲
轉到您的AWS控制台,選擇DynamoDB服務和您最喜歡的地區(我的是歐盟西部 - 愛爾蘭)。單擊“創建表”按鈕。

輸入“ test_sessions”作為表名稱,然後選擇一個稱為“ ID”的字符串主鍵,鍵類型必須為“哈希”。如果選擇另一個名稱,則必須在config.php文件中復制它。對於讀取和寫入容量單位字段的“ 10”(例如,您的表速度有多快),這足以進行測試。 PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

現在,您有一個NOSQL表,其中每一行具有強制性的ID字段,但是可以具有其他不同類型字符串,數字,字符串設置或數字設置的其他不同字段。 Session Manager對象將使用名為“數據”的字符串字段來存儲會話變量和一個名為“到期”的數字字段,以用於會話的到期時間戳。

啟動和配置服務器

>

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

現在,選擇DynamoDB表的EC2服務以及您選擇的同一區域。單擊儀表板或“實例”部分的“啟動實例”按鈕。選擇您的自定義AMI或使用經典嚮導,轉到“社區AMIS”標籤,然後輸入“ AMI – 4B42443F”。 在下一個屏幕中,至少在實例數中輸入“ 2”,然後選擇您的實例類型,我選擇了Micro(T1.Micro)。您可以在“可用性區”下拉列表中留下“不偏愛”,但是在生產環境中,如果各種實例分佈在同一區域內的兩個或多個區域之間,那就更好了。接受“實例詳細信息”和“存儲設備”配置面板的默認設置,然後繼續。如果需要,輸入一個或多個可選標籤。選擇按鍵或創建新的 並選擇一個安全組,該組至少允許在端口80上的HTTP和端口22上的SSH。

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

查看您的設置,然後啟動實例。當實例狀態“運行”時,它們可以通過SSH進行配置。每個實例都有一個公共DNS名稱,類似於ec2-xxx-xxx-xx-xx.region.compute.amazonaws.com。您需要在創建的每個實例上編輯config.php文件。使用您的公共密鑰和用戶名“ ubuntu”連接到實例或與SFTP客戶端連接(如果您使用了我的公共AMI): $ ssh -i/path/to/key.pem ubuntu@ec2-x-x-x-x-x-x.region.compute.amazonaws.com 將當前目錄更改為 /var /www在測試應用程序所在的位置。編輯config.php文件插入您的AWS密鑰和秘密。然後檢查您的DynamoDB表設置是否匹配,您肯定必須用本參考中可以找到的適當值編輯區域。 然後創建一個稱為ping.html內部 /var /www的空文件:加載平衡器將使用此文件來測試每個實例的可及性。

設置負載平衡器

使用數據庫和所有實例,我們現在可以設置前端負載平衡器。在EC2導航菜單中,在“網絡和安全性”下選擇“加載平衡器”,然後單擊“創建負載平衡器”按鈕。

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

選擇負載平衡器的名稱,並驗證偵聽器配置是否匹配屏幕截圖的名稱,該配置基本上說:將負載均衡器端口80上的所有HTTP流量轉發到端口80實例上的HTTP。

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

在ping路徑字段中的“健康檢查”面板中,Enter /ing.html,並將其他設置留為默認設置。這意味著:每30秒調用每個實例的/atping.html資源,如果響應時間更長,則該檢查失敗了5秒,如果實例連續兩次保健檢查失敗,則該檢查是否不健康,如果連續10個連續檢查,則實例為實例。健康。負載平衡器不會將流量轉發到不健康的實例,如果AutoScale到位,則可以將不健康的實例終止並由新的新鮮終止。

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

下一個屏幕使您可以選擇可以將哪些當前運行實例添加到負載平衡器中。選擇先前創建的兩個實例並繼續進行。查看最終配置,並確認是否可以。現在,您應該能夠看到負載平衡器的詳細信息和所有連接實例的狀態。

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

您可以通過將LOAD BALANCER的DNS名稱(類似於您的名稱-12345678.Region.elb.amazonaws.com)放入瀏覽器來測試應用程序。您還可以通過在DNS面板中添加一個指向負載平衡器URL的cname來配置域或子域(例如dynamo.yourdomain.com)。不建議將IP與A記錄一起使用,因為IP可以隨著時間的推移而改變。

PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話

每次您提交表單或刷新您請求的頁面都可以通過其他實例處理。您可以通過通過GetServername()實用程序顯示的名稱來檢查哪個實例為您服務。

摘要

僅此而已。我們介紹了AWS生態系統中的一個重要主題,但這僅僅是開始。例如,所有這些內容都是完全可以編程的:您可以添加自動升級並設計實例以自我配置,並從可信賴的地方下載AWS憑據和其他數據。或者,您可以使用雲形成為整個基礎架構創建可重複使用的模板。 檢查的起點是AWS主頁。現在,如果您完成的測試,請不要忘記終止所有內容,即使不開心的編碼! 通過fotolia 圖像 Amazon DynamoDB和PHP會話上的常見問題(FAQ)

>

>如何使用Amazon DynamoDB和PHP會話實現負載平衡?

負載平衡是管理服務器負載和確保最佳性能的關鍵方面。使用Amazon DynamoDB和PHP會話,您可以使用Amazon的彈性負載平衡(ELB)服務來實現這一目標。 ELB會自動跨多個目標(例如Amazon EC2實例,容器和IP地址)分發傳入的應用程序流量。它可以處理單個可用性區域或多個可用性區域中的應用程序流量的不同負載。

>

>將Amazon DynamoDB用於PHP會話有什麼好處?用於PHP會議。它通過無縫可擴展性提供快速可預測的性能。您可以向上或向下縮放桌子以調整流量,而無需任何停機時間或績效降低。 DynamoDB還提供內置的安全性,備份和還原,以及用於Internet級應用程序的內存中心。對於PHP,使開發人員更容易構建利用具有成本效益,可擴展和可靠的AWS雲的應用程序。 SDK中包含的是AWS PHP庫和代碼示例,這些樣本顯示瞭如何使用AWS SDK用於PHP來利用AWS Services提供的所有功能,例如Amazon S3,Amazon EC2和DynamoDB。是否有具有PHP代碼示例的常見DynamoDB?

有幾個常見的代碼示例用於使用PHP的DynamoDB。其中包括創建表格,將項目寫入表格,從表中讀取項目,更新表中的項目以及從表中刪除項目。這些操作中的每一個都可以使用AWS SDK進行php。

>在哪裡可以找到亞馬遜商店的PHP腳本?這些腳本允許您將Amazon的服務集成到PHP應用程序中,提供諸如產品搜索和顯示,購物車管理以及訂單處理之類的功能。

>

>是否有適用於具有PHP的DynamoDB的完整示例?是的,有完整的示例用於將DynamoDB與PHP一起使用。這些示例通常包括用於創建表格,將項目寫入表格,從表中讀取項目,更新表中的項目以及從表中刪除項目的代碼。它們通常還包括如何處理錯誤和異常的示例。

>在使用DynamoDB和PHP工作時,如何處理具有PHP的錯誤和異常,您可以處理錯誤和異常。使用Try-Catch塊。當操作失敗時,用於PHP的AWS SDK引發異常,您可以捕獲這些異常以適合您的應用程序的方式處理它們。

>

>如何使用DynamoDB和PHP?有幾種方法可以通過DynamoDB和PHP優化性能。其中包括使用配置的吞吐量來管理容量,使用全局輔助索引加快查詢,並使用DynamoDB加速器(DAX)提供內存內存。

>如何將數據固定在dynamodb中? DynamoDB提供了幾個安全功能來保護您的數據。其中包括在靜止處進行加密,該加密可確保您的數據免受對基礎存儲的未經授權訪問的訪問,以及在運輸中加密,該數據在數據之間在應用程序和DynamoDB之間進行保護時,可以保護您的數據,從而保護您的數據。 DynamoDB?

dynamoDB為數據備份和還原提供了內置支持。您可以隨時創建按需備份,並在需要時從這些備份中恢復表數據。這使您可以保護數據免受意外刪除或修改,並使應用程序即使在失敗時保持順利運行。

以上是PHP主| Amazon DynamoDB:使用負載平衡器存儲PHP會話的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板