最近,自我们的Memcached节点之一死亡(我们使用Memcachier作为Memcached提供程序)以来,PHP Web应用在几分钟之内不可用。
这是我们的user.ini
配置(Heroku使用user.ini
作为定义配置的位置),该配置有效,但显然不支持故障转移:
session.save_handler=memcached
session.save_path=${MEMCACHIER_SERVERS} # I understand this is redundant, but I just kept it as-is because I didn't write the original user.ini
session.save_path="PERSISTENT=SFSESSID ${MEMCACHIER_SERVERS}"
session.gc_maxlifetime=1209600
session.gc_probability=1
memcached.sess_binary=1
memcached.sess_sasl_username=${MEMCACHIER_USERNAME}
memcached.sess_sasl_password=${MEMCACHIER_PASSWORD}
我们新的
user.ini
配置,旨在提供故障转移功能session.save_handler=memcached
session.save_path="PERSISTENT=SFSESSID ${MEMCACHIER_SERVERS}"
session.gc_maxlifetime=1209600
session.gc_probability=1
memcached.sess_sasl_username=${MEMCACHIER_USERNAME}
memcached.sess_sasl_password=${MEMCACHIER_PASSWORD}
memcached.sess_binary=1
memcached.sess_number_of_replicas=1
# I also tried memcached.sess_consistent_hash=1, to no avail
MEMCACHIER_SERVERS
env var看起来像这样:123.45678.us-east-1.heroku.prod.memcachier.com:11211,123.45678.us-east-1.heroku.prod.memcachier.com:11211
。我认为这意味着我们有2个节点。我们使用新配置遇到的问题是超时,以及有关PHP session 函数(
session_start()
,session_write_close()
)的许多错误。为什么会这样呢?
请记住,我们根本不在PHP代码中使用Memcached,而只是将其用作 session 存储引擎。
我确实尝试联系Memcachier支持,但是客户代表只能提供推荐的PHP代码(我们不需要)。
最佳答案
由于赏金已过期,问题很快就会结束,我将继续@jdotjdot的建议,并从Memcachier切换到MemcachedCloud插件。