我的Web应用程序使用 CodeIgniter 3.1.10 作为框架和 php 7.1 ,并且我想尝试使用 memcached ,因为我计划使用 loadbalancer 和多个Web服务器。
我在 config.php 中设置会话配置,如下所示:
$config['sess_driver'] = 'memcached';
$config['sess_save_path'] = 'localhost:11211?timeout=10&read_timeout=10&persistent=1';
到目前为止,我已经成功设置了Memcached服务器并能够存储会话,但是 memcached并不太一致 。有时它会返回如下错误:
session_start(): Failed to read session data: user (path: localhost:11211)
特别是在一页上,有多个同时调用的ajax。像上面那样,经常有一两个ajax返回错误。但是当我使用 files session 进行设置时,ajax正常工作(永远不会返回任何会话错误)。
下面是在php.ini上设置的memcached配置
memcached.compression_factor 1.3 1.3
memcached.compression_threshold 2000 2000
memcached.compression_type fastlz fastlz
memcached.default_binary_protocol 0 0
memcached.default_connect_timeout 0 0
memcached.default_consistent_hash 0 0
memcached.serializer php php
memcached.sess_binary_protocol 1 1
memcached.sess_connect_timeout 0 0
memcached.sess_consistent_hash 1 1
memcached.sess_lock_expire 0 0
memcached.sess_lock_max_wait not set not set
memcached.sess_lock_retries 5 5
memcached.sess_lock_wait not set not set
memcached.sess_lock_wait_max 2000 2000
memcached.sess_lock_wait_min 1000 1000
memcached.sess_locking 1 1
memcached.sess_number_of_replicas 0 0
memcached.sess_persistent 0 0
memcached.sess_prefix memc.sess. memc.sess.
memcached.sess_randomize_replica_read 0 0
memcached.sess_remove_failed_servers 0 0
memcached.sess_sasl_password no value no value
memcached.sess_sasl_username no value no value
memcached.sess_server_failure_limit 0 0
memcached.store_retry_count 2 2
有人有类似经验或知道出路吗?预先感谢
答案 0 :(得分:0)
问题在于这些值:
memcached.sess_lock_wait_max 2000 2000
memcached.sess_lock_wait_min 1000 1000
memcached.sess_locking 1 1
了解每个ajax调用将独立运行,这意味着它们将根据需要请求session_lock。当锁定尝试失败时,它将使等待时间加倍,然后重试,直到达到wait_max为止。换句话说,您的配置指出如果您尝试锁定但失败,请不要打扰。
解决方案是降低您的wait_min并增加您的wait_max。应该可以解决您的问题。 还有另一个变量可以自动释放锁,这应该可以解决您遇到的赛车问题。