在传输过程中使用 Elasticache 加密的 PHP 会话处理程序 - 超时

问题描述 投票:0回答:1

我正在尝试将 Memcached(或 Redis)设置为 EC2 实例上的 PHP 会话处理程序,并创建了一个 ElastiCache Memcached“无服务器”实例,该实例强制将传输中加密设置为打开。我在 Ubuntu 24.04 上运行 PHP 8.3 并安装了 php8.3-memcached 库(已启用)。

我有以下 PHP 配置:

session.save_handler = memcached
session.save_path = "xxxxxxx:11211"

最初我根本无法连接,这似乎与加密连接有关,因为创建自定义未加密 Memcached 实例有效。所以我然后使用以下内容设置 stunnel:

fips = no
setuid = root
setgid = root
pid = /var/run/stunnel4/stunnel.pid
delay = yes
options = NO_SSLv2
options = NO_SSLv3

[elasticache-memcached]
client = yes
accept = 127.0.0.1:11211
connect = xxxxxxx:11211

我可以远程登录到 127.0.0.1:11211,并且可以与 Memcached 服务器进行良好的交互,例如使用统计信息和存储/检索。

telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
stats
STAT version 1.6.22
STAT accepting_conns 1
STAT curr_items 0
END

我还可以在 PHP 中使用标准 Memcached 库,并且还可以在 PHP 中毫无问题地连接和存储/检索。

$memcached = new Memcached('test_pool');
$memcached->addServer('127.0.0.1', 11211, 1);

echo print_r($memcached->getStats(), true);
Array ( [127.0.0.1:11211] => Array ( [version] => 1.6.22 [accepting_conns] => 1 [curr_items] => 0 ) )

但是在会话中使用它时它不起作用,除非我关闭加密。即使使用 stunnel,我也无法做到正确。 PHP 脚本示例:

<?php
    error_reporting(E_ALL);
    ini_set('display_errors', 1);
    
    session_start();

    // Check session variable
    $_SESSION['test_session'] = 'session_value';

    print('<pre>');
    print_r($_SESSION); // Should output the session variable
    print('</pre>');

    session_write_close();
?>

以及 PHP 错误日志:

PHP Warning:  session_start(): Failed to write session lock: A TIMEOUT OCCURRED in /var/www/public_html/test.php on line 5
PHP Warning:  session_start(): Failed to write session lock: A TIMEOUT OCCURRED in /var/www/public_html/test.php on line 5
PHP Warning:  session_start(): Failed to write session lock: A TIMEOUT OCCURRED in /var/www/public_html/test.php on line 5
PHP Warning:  session_start(): Failed to write session lock: A TIMEOUT OCCURRED in /var/www/public_html/test.php on line 5
PHP Warning:  session_start(): Failed to write session lock: A TIMEOUT OCCURRED in /var/www/public_html/test.php on line 5
PHP Warning:  session_start(): Failed to write session lock: A TIMEOUT OCCURRED in /var/www/public_html/test.php on line 5
PHP Warning:  session_start(): Unable to clear session lock record in /var/www/public_html/test.php on line 5
PHP Warning:  session_start(): Failed to read session data: memcached (path: 127.0.0.1:11211) in /var/www/public_html/test.php on line 5

有什么建议吗?谢谢!

php memcached amazon-elasticache stunnel
1个回答
0
投票

看来我可以回答我自己的问题了。我必须在

memcached.sess_binary_protocol=off
下的 PHP
memcached.ini
运行时配置文件中设置
mods-available

PHP 手册中所述:

对 memcached 会话使用 memcached 二进制协议而不是文本协议。 libmemcached 副本仅在启用二进制模式时才工作。 但是,某些代理(例如 twemproxy)仅在禁用二进制协议时才起作用。 自 libmemcached 1.0.18 起默认为打开。在 libmemcached 1.0.18 之前,默认为关闭。

希望这对处于相同情况的其他人有所帮助。

© www.soinside.com 2019 - 2024. All rights reserved.