xampp 默认未启用 sockets 扩展,需在 php.ini 中取消 extension=sockets 行的注释并重启 apache;启用后仍报错常见原因包括权限限制、特权端口占用、防火墙拦截及协议理解偏差。

XAMPP 默认不启用 sockets 扩展,但它是 PHP 原生支持的扩展,无需额外编译或下载 DLL —— 只需在 php.ini 中取消注释对应行即可生效。如果你写 PHP 网络程序(比如 TCP 服务端、UDP 发包、WebSocket 服务端逻辑)时遇到 Call to undefined function socket_create(),问题就出在这里。
确认 sockets 扩展是否已加载
直接运行 php -m | findstr sockets(Windows)或 php -m | grep sockets(macOS/Linux),无输出即未启用。也可以建一个 info.php 放在 htdocs 下,内容为 <?php phpinfo(); ?>,浏览器访问后搜索 “sockets” —— 若模块名旁显示 “enabled”,说明已启用;若整块没出现,就是没加载。
启用 sockets 扩展只需一行配置
打开 XAMPP 安装目录下的 php\php.ini(不是 php.ini-development 或 php.ini-production,控制面板里 Apache → Config → PHP (php.ini) 会自动打开正确文件)。搜索 extension=sockets,确保这一行存在且**未被注释**(即开头不能有分号 ;):
extension=sockets
注意以下几点:
- 不要写成
extension=php_sockets.dll——sockets是 PHP 内置扩展,Windows 下不需要指定 .dll,写全名反而报错 - 该行通常位于
; Dynamic Extensions区块下方,靠近extension=curl、extension=mbstring等附近 - 改完必须重启 Apache(Stop → Start),仅刷新页面无效
- 如果用的是 PHP 8.1+,仍适用;XAMPP 8.x 自带的 PHP 版本全部内置 sockets,不存在版本兼容问题
sockets 扩展启用后仍报错的常见原因
即使 phpinfo() 显示 sockets 已启用,运行 socket_create() 还是失败,大概率是权限或系统限制:
- Windows 上某些杀毒软件(如 Windows Defender 实时防护)会拦截 socket 绑定行为,临时关闭测试可验证
- 绑定
127.0.0.1:80或:443等特权端口会失败,PHP 报Permission denied—— 改用 8000 以上端口(如:8080) - 若代码中用了
socket_bind($sock, '0.0.0.0', 8080)却在浏览器里用localhost访问,注意:浏览器发的是 HTTP 请求,不是 raw socket;sockets扩展本身不处理 HTTP 协议,它只负责底层连接收发 - 防火墙可能阻止非 Apache 进程监听端口 —— 比如你用 PHP 写了个独立 socket server(非通过 Apache 执行),需手动放行该 PHP 进程或对应端口
真正容易被忽略的是:sockets 扩展只是“让 PHP 能调用系统 socket API”,它不提供 WebSocket 服务、不替代 Apache/Nginx、也不自动处理协议升级。你要跑 WebSocket,得自己实现握手和帧解析,或用 Ratchet、ReactPHP 等库 —— 而这些库的第一步,就是确保 sockets 已启用且能正常创建监听套接字。











