根本原因是Cygwin的httpd不支持Windows版libphp7.so;应改用Cygwin原生php+lighttpd,启用mysqli、mbstring扩展,修正socket路径为/var/run/mysqld/mysqld.sock或改用127.0.0.1。
phpMyAdmin 在 Cygwin 下无法启动 Apache 或报 Cannot load modules/libphp7.so
根本原因是 cygwin 的 httpd(apache)默认不支持 php 模块直连,它不是原生 windows apache,也不是 linux 上的 httpd,而是基于 posix 层模拟的轻量实现,不加载 .so 二进制模块。你下载的 phpmyadmin\_windows 包里附带的 libphp7.so 是为 windows 原生 apache 编译的,cygwin 完全不能识别。
实操建议:
- 别试图把 Windows 版 PHP 模块塞进 Cygwin 的
httpd—— 路径、ABI、符号表全错,必然失败 - 改用 Cygwin 自带的
php+lighttpd或nginx(推荐lighttpd,Cygwin 仓库维护更稳) - 确保安装了
php、php-mysql、lighttpd三个 Cygwin 包(用setup-x86_64.exe勾选) -
lighttpd配置里必须启用mod_fastcgi和mod_alias,并把.php请求转发给php-cgi
访问 phpMyAdmin 页面时提示 mysqli extension is missing
这是典型的 PHP 扩展未启用或 MySQL 客户端库找不到。Cygwin 的 php 默认不自动加载 mysqli,且它依赖的 libmysqlclient 不在标准搜索路径中。
实操建议:
- 运行
php -m | grep mysqli确认扩展是否已载入;若无输出,说明没启用 - 编辑
/etc/php.ini,取消注释extension=mysqli(不是extension=php_mysqli.dll,Cygwin 用 .so) - 确认
/usr/bin/php-cgi能正常连接 MySQL:执行php-cgi -v应无警告;再跑php -r "var_dump(function_exists('mysqli_connect'));"应返回bool(true) - 如果仍报错,手动指定库路径:在
php.ini中加extension_dir = "/usr/lib/php/extensions",并检查该目录下是否存在mysqli.so
登录 phpMyAdmin 后显示空白页或 500 错误,日志里有 PHP Fatal error: Uncaught Error: Call to undefined function mb_detect_encoding()
phpMyAdmin 依赖 mbstring 扩展做字符编码检测,而 Cygwin 的 php 包默认不启用它,也不自带 mbstring.so —— 这个扩展需要单独编译或启用。
立即学习“PHP免费学习笔记(深入)”;
实操建议:
- 运行
php -m | grep mbstring;若无结果,先装 Cygwin 包php-mbstring - 编辑
/etc/php.ini,添加或取消注释extension=mbstring - 注意顺序:
mbstring必须在mysqli之前加载(否则某些函数注册会失败),所以把它放在extension=mysqli上方 - 重启
lighttpd后,用php -i | grep 'mbstring'验证是否生效
Cygwin 下 phpMyAdmin 连不上本地 MySQL:错误是 mysqli_real_connect(): (HY000/2002): No such file or directory
这不是权限或密码问题,而是 Unix socket 路径不匹配。Cygwin 的 MySQL 客户端默认找 /tmp/mysql.sock,但 Cygwin 的 MySQL 服务(如果用的是 mysqld 包)实际把 socket 放在 /var/run/mysqld/mysqld.sock,而 phpMyAdmin 的 config.inc.php 里又可能硬编码了 Windows 路径。
实操建议:
- 先确认 MySQL 是否在运行:
ps aux | grep mysqld;若无,运行mysqld --defaults-file=/etc/my.cnf & - 查 socket 实际位置:
mysql -u root -e "SHOW VARIABLES LIKE 'socket';" - 在 phpMyAdmin 的
config.inc.php中,把$cfg['Servers'][$i]['host'] = 'localhost';改成$cfg['Servers'][$i]['host'] = '127.0.0.1';(强制走 TCP,绕过 socket) - 或者更稳妥:显式指定 socket 路径:
$cfg['Servers'][$i]['socket'] = '/var/run/mysqld/mysqld.sock';
.so、每个 php.ini 路径、每个 socket 位置,都在悄悄不同。

















