我们使用 DynamoDB 来同步 ELB 下多台 EC2 机器之间的会话。
我们注意到这种方法会减慢脚本的速度。
具体来说,我制作了一个 js,它在服务器上调用 10 次 3 个不同的 php 脚本。
1)第一个只是一个回显时间戳();往返时间约为 50 毫秒。2)第二个是PHP脚本,通过mysqli连接到RDS MySQL,需要相同的时间(约50-60ms)。3) 第三个脚本使用 AWS 官方文档中描述的 DynamoDB 会话保存方法,大约需要 150 毫秒(慢 3 倍!!
我每天晚上都在清理垃圾(如文档所述),DynamoDB 指标似乎还可以(附在下面)。
我使用的代码是这样的:
use Aws'DynamoDb'DynamoDbClient;
use Aws'DynamoDb'Session'SessionHandler;
ini_set("session.entropy_file", "/dev/urandom");
ini_set("session.entropy_length", "512");
ini_set('session.gc_probability', 0);
require 'aws.phar';
$dynamoDb = DynamoDbClient::factory(array(
'key' => 'XXXXXX',
'secret' => 'YYYYYY',
'region' => 'eu-west-1'
));
$sessionHandler = SessionHandler::factory(array(
'dynamodb_client' => $dynamoDb,
'table_name' => 'sessions',
'session_lifetime' => 259200,
'consistent_read' => true,
'locking_strategy' => null,
'automatic_gc' => 0,
'gc_batch_size' => 25,
'max_lock_wait_time' => 15,
'min_lock_retry_microtime' => 5000,
'max_lock_retry_microtime' => 50000,
));
$sessionHandler->register();
session_start();
我做错了什么,还是一直检索会话是正常的?
谢谢。
在 AWS
论坛中复制 AWS 工程师的通信:https://forums.aws.amazon.com/thread.jspa?messageID=597493
这里有几件事要检查:
- 您是否在与 DynamoDB 表位于同一区域的 EC2 上运行应用程序?
- 您是否启用了 OPcode 缓存,以确保 SDK 使用的类不需要每次从磁盘加载和解析 脚本是否正在运行?
使用 Apache 等 Web 服务器并连接到 DynamoDB 会话 将需要在每个请求上建立新的 SSL 连接。 这是因为PHP目前不允许你重用cURL 请求之间的连接句柄。某些数据库驱动程序确实允许 对于请求之间的持久连接,这可能说明 性能差异。
如果您跟进 AWS 论坛主题,AWS 工程师应该能够帮助您解决问题。如果要使此线程保持打开状态,也会对其进行监视。