我决定迁移我的系统并进行一些必要的更新。在使用Codeigniter 3和php 7.2时,我遇到了这个问题。当我发现这个问题后,我意识到它是多么荒谬,并想知道为什么我没有早点发现它。
无论如何,这是至少对我有效的解决方案。
显然,确保已安装memcacheD:
sudo apt-get update
sudo apt-get install php7.2-memcached
如果一切顺利,我们可以继续检查其他事项。
在Codeigniter的配置文件"/application/config/config.php"中,有一个部分用于指定会话选项:
$config['sess_driver'] = 'memcached';
$config['sess_cookie_name'] = 'some_session_name';
$config['sess_expiration'] = 7200;
$config['sess_save_path'] = NULL;
$config['sess_match_ip'] = FALSE;
$config['sess_time_to_update'] = 300;
$config['sess_regenerate_destroy'] = FALSE;
对我而言需要更改的代码行是这一行:
$config['sess_save_path'] = NULL;
请确保将此设置为CI3手册中记录的有效路径。正确的设置应该如下所示:
$config['sess_driver'] = 'memcached';
$config['sess_save_path'] = 'localhost:11211';
请确保将“localhost”更改为反映您的memcached服务器位置。
有关更多信息,请查看-Codeignier会话手册
还可以在此处查看:php memcacheD会话支持
如果页面上的评论被删除,我会在这里发布:
如果要使用'memcacheD'扩展而不是'memcache'(有两个不同的扩展名)进行会话控制,则应注意修改php.ini文件。
大多数谷歌网页资源都是基于memcache,因为它比memcacheD早。他们会说如下:
session.save_handler = memcache session.save_path =
"tcp://localhost:11211"
但是对于memcacheD来说,这是无效的
您应该像这样修改php.ini:
session.save_handler = memcached session.save_path = "localhost:11211"
看,没有协议标识符
为了测试,我做了这个,以确保php本身没有遇到访问memcacheD的问题:
session_start();
header('Content-Type: text/plain');
session_start();
if(!isset($_SESSION['visit']))
{
echo "This is the first time you're visiting this server\n";
$_SESSION['visit'] = 0;
}
else
echo "Your number of visits: ".$_SESSION['visit'] . "\n";
$_SESSION['visit']++;
echo "Server IP: ".$_SERVER['SERVER_ADDR'] . "\n";
echo "Client IP: ".$_SERVER['REMOTE_ADDR'] . "\n";
print_r($_COOKIE);
$servers = explode(",", ini_get("session.save_path"));
$c = count($servers);
for ($i = 0; $i < $c; ++$i) {
$servers[$i] = explode(":", $servers[$i]);
}
$mem = new memcached();
$mem->addServer('127.0.0.1', '11211', '1');
$mem->set('011', 'Hello There');
print_r($mem->get('011'));
print_r($mem->getAllKeys());
这让我看到memcacheD工作正常。
此外,在您的php.ini文件中,有一些需要注意的选项。只需搜索[session]或session.save_path即可。CI3表示它不使用php.ini文件中的此选项,但如果您计划在框架外部使用memcacheD并保持一致性,则值得设置。
此选项从php.ini文件的第1327行左右开始:
[Session]
session.save_handler = memcached
session.save_path = "locahost:11211"
检查设置的另一个地方是mecacheD服务器配置文件。根据系统,其位置可能会有所不同。对我而言,它位于/etc/目录下。
/etc/memcached.conf
以下是我遇到的错误的参考图:
![错误图片](https://istack.dev59.com/rgYs0.webp)
编辑
如果您正在使用socket,例如unix:///some/place/memcached.sock连接到Memcached服务器,则没有文档说明如何使其工作。您只需在配置中执行以下操作:
$config['sess_save_path'] = "/some/place/memcached.sock:11211";