"Warning: Memcached::setOption() expects parameter 1 to be integer, string given" 将 Redis Memcached



以下是我的服务配置.yaml of Symfony 项目, [我正在尝试将会话存储在 Redis 企业云内存缓存上]

parameters:
session_memcached_host: memcached-11999.someurl.redislabs.com
session_memcached_port: 11999
session_memcached_prefix: test
session_memcached_expire: 3600 # this is in seconds
session_memcached_user: abcd
session_memcached_pass: abcd
services:
session.memcached:
class: Memcached
arguments:
calls:
- [addServer, ['%session_memcached_host%','%session_memcached_port%']]
#           - [setSaslAuthData, ['%session_memcached_user%','%session_memcached_pass%']]
- [setOption, [Memcached::OPT_BINARY_PROTOCOL, true]]
session.handler.memcached:
class: SymfonyComponentHttpFoundationSessionStorageHandlerMemcachedSessionHandler
arguments: ["@session.memcached", { prefix: '%session_memcached_prefix%', expiretime: '%session_memcached_expire%' }]

获取以下错误异常

in var/cache/dev/ContainerIG8bgiG/App_KernelDevDebugContainer.php (line 1635)
include_once dirname(__DIR__, 4).'/vendor/symfony/http-foundation/Session/SessionBagInterface.php';
include_once dirname(__DIR__, 4).'/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php';        
$a = new Memcached();       
$a->addServer('memcached-11999.someurl.redislabs.com', 11999);        
$a->setOption('Memcached::OPT_BINARY_PROTOCOL', true);        
return $this->privates['session.storage.native'] = newSymfonyComponentHttpFoundationSessionStorageNativeSessionStorage($this->parameters['session.storage.options'], new SymfonyComponentHttpFoundationSessionStorageHandlerMemcachedSessionHandler($a, ['prefix' => 'test', 'expiretime' => 3600]), new SymfonyComponentHttpFoundationSessionStorageMetadataBag('_sf2_meta', 0));    }    /**

如果我取消注释以下行

- [setSaslAuthData, ['%session_memcached_user%','%session_memcached_pass%']]

然后它会给出以下警告,因为它不支持没有二进制的 SASL。

Warning: Memcached::setSaslAuthData(): SASL is only supported with binary protocol

获取以下错误异常

in var/cache/dev/ContainerNVvLqte/App_KernelDevDebugContainer.php (line 1635)
include_once dirname(__DIR__, 4).'/vendor/symfony/http-foundation/Session/SessionBagInterface.php';        
include_once dirname(__DIR__, 4).'/vendor/symfony/http-foundation/Session/Storage/MetadataBag.php';
$a = new Memcached();
$a->addServer('memcached-11999.someurl.redislabs.com', 11999);
$a->setSaslAuthData('abcd', 'abcd');        
$a->setOption('Memcached::OPT_BINARY_PROTOCOL', true);        
return $this->privates['session.storage.native'] = new SymfonyComponentHttpFoundationSessionStorageNativeSessionStorage($this->parameters['session.storage.options'], new SymfonyComponentHttpFoundationSessionStorageHandlerMemcachedSessionHandler($a, ['prefix' => 'test', 'expiretime' => 3600]), 
new SymfonyComponentHttpFoundationSessionStorageMetadataBag('_sf2_meta', 0));    }

我不明白为什么Symfony仅在将其添加到services.yaml中时才将第一个参数"Memcached::OPT_BINARY_PROTOCOL"视为字符串!

我通过启用默认memcached.default_binary_protocol解决了这个问题

我在/etc/php/7.2/mods-available/memcached 中添加了这一行.ini

memcached.default_binary_protocol = On

检查此信息的屏幕截图.php

以下是我对Symfony项目的services.yaml文件的最终配置

parameters:
session_memcached_host: memcached-11999.someurl.redislabs.com
session_memcached_port: 11999
session_memcached_prefix: test
session_memcached_expire: 3600 # this is in seconds
session_memcached_user: abcd
session_memcached_pass: abcd
services:
session.memcached:
class: Memcached
arguments:
calls:
- [setSaslAuthData, ['%session_memcached_user%','%session_memcached_$
- [addServer, ['%session_memcached_host%','%session_memcached_port%'$
session.handler.memcached:
class: SymfonyComponentHttpFoundationSessionStorageHandlerMemcach$
arguments: ["@session.memcached", { prefix: '%session_memcached_prefix%$

现在它正在将会话存储在Redislabs Memcached:)

最新更新