>本文是从我们的姐妹网站之一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存储库中下载源代码。我们将使用弹性负载平衡器和至少两个实例运行此应用程序。我们目前将不使用自动化。
该应用程序要求用户选择存储在当前会话中并充当“登录”的用户名。如果会话中存在用户名,则应用程序允许用户插入一种“配置文件”,本质上是一系列的密钥/值信息,例如名称,姓氏,电子邮件等(键和值是字符串)。所有这些逻辑都包含在index.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”(例如,您的表速度有多快),这足以进行测试。

现在,您有一个NOSQL表,其中每一行具有强制性的ID字段,但是可以具有其他不同类型字符串,数字,字符串设置或数字设置的其他不同字段。 Session Manager对象将使用名为“数据”的字符串字段来存储会话变量和一个名为“到期”的数字字段,以用于会话的到期时间戳。
启动和配置服务器
>
现在,选择DynamoDB表的EC2服务以及您选择的同一区域。单击仪表板或“实例”部分的“启动实例”按钮。选择您的自定义AMI或使用经典向导,转到“社区AMIS”标签,然后输入“ AMI – 4B42443F”。
在下一个屏幕中,至少在实例数中输入“ 2”,然后选择您的实例类型,我选择了Micro(T1.Micro)。您可以在“可用性区”下拉列表中留下“不偏爱”,但是在生产环境中,如果各种实例分布在同一区域内的两个或多个区域之间,那就更好了。接受“实例详细信息”和“存储设备”配置面板的默认设置,然后继续。如果需要,输入一个或多个可选标签。选择按键或创建新的
并选择一个安全组,该组至少允许在端口80上的HTTP和端口22上的SSH。
查看您的设置,然后启动实例。当实例状态“运行”时,它们可以通过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导航菜单中,在“网络和安全性”下选择“加载平衡器”,然后单击“创建负载平衡器”按钮。
选择负载平衡器的名称,并验证侦听器配置是否匹配屏幕截图的名称,该配置基本上说:将负载均衡器端口80上的所有HTTP流量转发到端口80实例上的HTTP。
在ping路径字段中的“健康检查”面板中,Enter /ing.html,并将其他设置留为默认设置。这意味着:每30秒调用每个实例的 /atping.html资源,如果响应时间更长,则该检查失败了5秒,如果实例连续两次保健检查失败,则该检查是否不健康,如果连续10个连续检查,则实例为实例。健康。负载平衡器不会将流量转发到不健康的实例,如果AutoScale到位,则可以将不健康的实例终止并由新的新鲜终止。
下一个屏幕使您可以选择可以将哪些当前运行实例添加到负载平衡器中。选择先前创建的两个实例并继续进行。查看最终配置,并确认是否可以。现在,您应该能够看到负载平衡器的详细信息和所有连接实例的状态。
您可以通过将LOAD BALANCER的DNS名称(类似于您的名称-12345678.Region.elb.amazonaws.com)放入浏览器来测试应用程序。您还可以通过在DNS面板中添加一个指向负载平衡器URL的cname来配置域或子域(例如dynamo.yourdomain.com)。不建议将IP与A记录一起使用,因为IP可以随着时间的推移而改变。
每次您提交表单或刷新您请求的页面都可以通过其他实例处理。您可以通过通过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中文网其他相关文章!