簡體   English   中英

Memcached PHP 會話錯誤:session_start():讀取會話數據失敗

[英]Memcached PHP Session error: session_start(): Failed to read session data

我的 Web 應用程序使用CodeIgniter 3.1.10作為框架和php 7.1 ,我想嘗試使用memcached ,因為我計划使用負載均衡器和多個 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 返回如上所述的錯誤。 但是當我設置使用文件 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

有沒有人有類似經歷或知道出路? 提前致謝

我在Debian 9的memcached 3.1.13和libmemcached 1.0.18上遇到了PHP 7.3的相同問題。

如上所述,使用文件會話處理程序時,錯誤不再發生。 文件會話處理程序不是我們項目中的選項,我們必須堅持使用memcached。

禁用memcached會話鎖定也可以解決以下問題:

memcached.sess_locking = Off

這不是一個好選擇,因為它可能導致並發訪問問題。

有沒有人有類似的經驗或知道出路? 提前致謝

問題在於這些值:

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。 這應該可以解決您的問題。 還有另一個變量可以自動釋放鎖定,這應該有助於解決您遇到的賽車問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM