Memcached-win64-1.4.24-alpha 发布
该文章根据 CC-BY-4.0 协议发表,转载请遵循该协议。
本文地址:https://fenying.net/post/2015/07/10/announcing-of-memcached-win64-1.4.24-alpha/
文章目录
目前网络上流行的 memcached-win32 都是 1.2.x 版本,过于古老。后来在网上找到一个 1.4.5 版本的 memcached-win32 服务端程序。于是尝试自己编译一个适用于 Windows 的 memcached-1.4.24 最新版本。
参考了多篇文章,并对源代码做了许多适应修改。尝试了一个晚上,总算编译成功,不得不吐槽下,在 Windows 下编译 memcached 一点儿也不是件快乐的事情。目前已经发布到 GitHub,需要的朋友可以自己去查看下:GitHub/memcached-win64(包含编译好的 memcached-win64-1.4.24a.exe 以及运行库、依赖包等)。
如果想使用编译好的可执行文件
» memcached-win64-1.4.24.tar.gz(包含运行库)
如果想尝试自行编译
先说说需要哪些东西:
- libevent 这里用的是 libevent-2.0.11-stable。(GitHub/memcached-win64 里已包含)
- pthreads-w32 这里用的是 pthreads-w32-2.9.1-x64。(GitHub/memcached-win64 里已包含)
- MinGW-w64 这里用的是 mingw-w64-bin_i686-mingw_20111220.zip。
- msys,这里使用的是 MSYS-1.0.11.exe。
- memcached,必不可缺的,当前版本是 memcached-1.4.24。
然后按照如下步骤编译:
-
在 Windows 下安装 msys 1.0.11,然后配置 MinGW-w64,确保 gcc 可用。
-
从 GitHub 里把当前源代码完整拖下来,放到(msys shell 环境) 根目录
/memcached-win64
下。 -
将其中
deps/1.4.24/libevent-2.0.11-stable-for-memcached-w64.tar.gz
解压到/memcached-win64/libevent-2.0.11-stable
。 -
将其中
deps/1.4.24/pthreads-w32_64-dll-2-9-1-release.zip
解压到/memcached-win64/pthreads-w32_64-dll-2-9-1-release
。 -
执行如下语句:
1cd /memcached-win64 2make clean -C libevent-2.0.11-stable 3make -C libevent-2.0.11-stable 4 5make clean -C memcached-win64 6make -C memcached-win64 7 8mkdir binary 9cp memcached-win64/memcached-win64-1.4.24a.exe binary/memcached-win64-1.4.24a.exe 10cp pthreads-w32_64-dll-2-9-1-release/dll/x64/pthreadGC2.dll binary/pthreadGC2.dll
就可以得到编译好的 memcached.exe 了。
安装服务
在 Windows 下,启动管理员命令行执行以下命令:
1set MEMCACHED_HOME=C:\DevEnv\Memcached
2sc create Memcached binPath= "%MEMCACHED_HOME%\memcached.exe -d runservice -m 128" start= demand DisplayName= "Memcached Server"
移植过程
我尝试移植时,参考的是 memcached-win32-1.4.5 的代码,因此和 memcached-1.4.24 有较大的区别。具体需要修改的内容如下:
头文件引用
去掉 Linux 专有的 SDK 头文件。
关于连接管理机制(Connections Management)
memcached-1.4.24 内的 conns 连接池采用大数组,下标即为 socket fd,按需分配。其中使用 dup(1) 来确定 max socket fds。而在 Windows 下 dup(1) 法无效,会导致 sfd 远远超过 max_sfd,而出现 ASSERT 异常。因此将链接管理机制用 1.4.5 的替代掉。
64位移植问题
64 位系统中 GCC 使用 %llu 格式化字符串会出错,需要用 PRIu64 修正。
缺少 Linux 专有函数
编译时另外的报错是 strtok_r 和 getsubopt 两个函数,这两个函数在 Windows 中不存在,因此需要到别的地方寻找。最后在 glibc 里找到了 strtok_r,在 sals 里找到了 getsubopt 。
此外凡是 Linux 特有的系统调用,比如信号机制,都要遮蔽掉。
参数命名报错
server_socket 的第一个参数名为 interface,gcc 报错,改为 sInterface 即可。
添加 Deamonization
添加 Windows 下的 deamonization。
关闭 SALS
SALS 在 Windows 下工作不正常,因此不启用它。