phpenv是windows下绿色免安装的多版本php集成环境,区别于常规php环境:它不依赖系统级配置,为每个php版本维护独立php.ini和扩展目录,支持apache/nginx、mysql/redis等组件共存,且不修改注册表或环境变量。

phpEnv 是什么,它和常规 PHP 环境有啥区别?
phpEnv 是一个 Windows 下的多版本 PHP 环境管理工具(类似 Linux 的 phpbrew),它不依赖系统级 php.ini,而是为每个 PHP 版本维护独立的配置目录(如 phpenv/versions/8.1.0/etc/php.ini)。这意味着:你装了 memcached.so,但若没把它加到对应版本的 php.ini 里,phpinfo() 就看不到;服务端也不能靠 apt 或 yum 装——Windows 没这些。
Windows 下安装 Memcached 服务端(非 WSL)
phpEnv 运行在 Windows 原生环境,所以 Memcached 服务端必须用 Windows 兼容的二进制版:
- 去官方推荐源下载预编译的
memcached.exe(例如:memcached GitHub Releases 中找带win64的 zip 包,或可信第三方如 nono303/memcached-win64) - 解压后放到固定路径,比如
C:\memcached\memcached.exe - 以管理员身份运行命令行,执行:
cd C:\memcached memcached.exe -d install memcached.exe -d start
- 验证是否跑起来:
telnet 127.0.0.1 11211,连上后输入stats回车,有输出即成功 - 注意:默认监听
127.0.0.1:11211,如果 phpEnv 中 PHP 脚本要访问,确保没防火墙拦截,且不要改-l成0.0.0.0(Windows 下可能失败或报错failed to listen on TCP port 11211)
给 phpEnv 的某个 PHP 版本装 memcached 扩展(不是 memcache)
phpEnv 默认不带 memcached 扩展 DLL。你得手动匹配 PHP 版本、线程安全(TS/NTS)、架构(x64/x86):
- 去 PECL 官网找对应版本的 DLL:https://www.php.cn/link/994a333e90d888a480e45e6e6e41707a
- 选包名含
php_memcached-xxx-<strong>php</strong>-<strong>8.1</strong>-<strong>nts</strong>-<strong>vc15</strong>-x64.zip这类格式的(其中8.1对应你的 phpEnv 版本,nts对应 Non-Thread-Safe —— phpEnv 默认用 NTS,vc15对应 VS2017 编译器,需和你的 PHP 一致) - 解压出
php_memcached.dll,放进该 PHP 版本的ext目录,例如:phpenv/versions/8.1.0/ext/php_memcached.dll - 编辑对应版本的
php.ini(不是系统全局那个),加上一行:extension=php_memcached.dll - 重启 phpEnv 的 Web 服务(如 Apache/Nginx)或 CLI 重载,再跑
phpinfo(),搜索memcached,看到模块信息才算成功 - 常见失败点:
PHP Startup: Unable to load dynamic library 'php_memcached.dll'—— 一般是 DLL 和 PHP 版本/VCR/架构不匹配,或缺libmemcached.dll(新版 PECL 包已静态链接,一般不用额外放)
写代码前先确认连接和序列化行为
Memcached 扩展默认用 PHP 原生 serialize(),但如果你启用了 igbinary,性能更好、体积更小,且能跨语言兼容(比如和 Python 的 memcached 客户端共用缓存):
- 先确认
igbinary是否已装:在php.ini加extension=php_igbinary.dll,再重启 - 然后在 PHP 代码里设置序列化方式:
$m = new Memcached(); $m->setOptions([ Memcached::OPT_SERIALIZER => Memcached::SERIALIZER_IGBINARY ]); $m->addServer('127.0.0.1', 11211); - 不设的话,
set('key', ['a'=>1])存进去的是 PHPserialize字符串,其他语言读不了;设了IGBINARY,就得保证所有客户端都支持它,否则会get出来false - 另外注意:
Memcached::set()默认过期时间是 0(永不过期),但超过 30 天会被服务端自动转成时间戳处理,容易误判;建议显式传3600或0并注释清楚意图
php.ini 改错了文件、或者服务端根本没启动成功——别跳过 telnet 和 phpinfo() 这两步。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











