PHP 和 Python 基于 UDP 协议操作 memcached

文章目录

[隐藏]

  • memcached 服务如何开启 UDP
  • 命令行 UDP 连接 memcached
  • PHP 以 UDP 协议操作 memcached
  • Python 以 UDP 协议操作 memcached

在写完(https://mp.weixin.qq.com/s?__biz=MzAwOTU4NzM5Ng==&mmemcached 服务如何开启 UDP”>memcached 服务如何开启 UDP

由于出现过 memcached UDP 反射攻击,所以很多 linux 发行版默认启动的是关闭 UDP 端口的,如果你想开启,可以执行下列命令:

$ memcached -m 64 -p 11212 -U 11211 -u memcache -l 127.0.0.1  

-U 参数表示指定 UDP 端口,如果 -U 参数的值为0 表示关闭 UDP 端口。

一旦执行上列命令,表示 memcached 服务器端同时监听 11211 的 UDP 和 TCP 端口,通过下列命令可看出:

$ netstat -an | grep 11211  tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN  udp 0 0 127.0.0.1:11211 0.0.0.0:*  
命令行 UDP 连接 memcached

在 Linux 中,telnet 只能运行于 TCP 模式,所以为了演示,只能采用 nc 命令行。UDP 操作 memcached,在操作数据的时候必须增加一个 frame 头,后续的数据格式和 TCP 操作 memcached 一样,查看官方手册:

 The frame header is 8 bytes long, as follows (all values are 16-bit integers     in network byte order, high byte first):       0-1 Request ID.     2-3 Sequence number.     4-5 Total number of datagrams in this message.     6-7 Reserved for future use; must be 0.  

为了说的简单点,可以执行下列命令,以 UDP 协议操作 memcached:

$ printf 'x00x00x00x00x00x01x00x00statsrn' | nc -u 127.0.0.1 11211  $ printf 'x00x00x00x00x00x01x00x00set v 0 0 1rnxrn' | nc -u 127.0.0.1 11211  $ printf 'x00x00x00x00x00x01x00x00get vrn' | nc -u 127.0.0.1 11211  
PHP 以 UDP 协议操作 memcached

php-memcached 扩展也支持 UDP 协议操作 memcached,但并不鼓励,所以官方文档介绍 UDP 操作非常少,我也是查了官方的 Issues 才明白的。另外即使支持,UDP 操作也有限制,比如 set 命令支持 UDP 协议,但 get 命令就不支持,至于原因,大家可以思考下,后续我会简单说一说。

先看代码:

$m_udp = new Memcached();  # 使用 UDP 协议模式  $m_udp->setOption(Memcached::OPT_USE_UDP, true);  # 注意,支持文本模式的协议,而非二进制协议  $m_udp->setOption(Memcached::OPT_BINARY_PROTOCOL, false);    $m_udp->addServer('127.0.0.1', 11211, 1);    echo $m_udp->get('y');  var_dump($m_udp->getResultMessage());  

输出 string(20) “ACTION NOT SUPPORTED”,可以看出 php-memcached 扩展做了限制,不允许 UDP 协议操作 get 命令。

$m_udp->set('y',"ok");  var_dump($m_udp->getResultMessage());  $m_tcp =new Memcached();  # 切换为默认的 TCP 连接方式  $m_tcp->addServer('127.0.0.1', 11211, 1);  echo $m_tcp->get("y");  

执行完毕,成功输出 ok。

Python 以 UDP 协议操作 memcached

Python 有专门的包基于 UDP 协议操作 memcached,这就是 python-memcached-udp 包,安装后,演示一个例子:

client = memcached_udp.Client([('localhost', 11211)])  client.set('key1', 'value1')  r = client.get('key1')  print (r)  

大家可以看看这个包的源代码,非常有意思,可以学到很多 memcached 命令知识。

原文出处:tuisec -> https://paper.tuisec.win/detail/3ca8934a5a548a7

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。