xampp 默认内置 sockets 扩展但禁用,需通过 phpinfo() 确认配置路径,在对应 php.ini 中取消 extension=sockets 注释并重启 apache,再用 php -m 或 extension_loaded() 验证;注意避免端口权限、disable_functions 拦截等问题。

XAMPP 默认已内置 sockets 扩展,但默认是禁用状态;只要正确启用,就能直接使用 socket_create()、socket_bind() 等函数进行底层网络编程。
确认 sockets 扩展是否已编译进 PHP
别急着改配置 —— 先验证它是否存在。打开命令行,执行:
php -m | findstr sockets
Windows 下若输出 sockets,说明已编译;macOS/Linux 用 grep。若无输出,再查 phpinfo() 页面的 “Registered PHP Streams” 是否含 tcp, udp, unix, ssl —— 有就代表 sockets 基础能力已就绪(即使扩展名没列出来)。
- 绝大多数 XAMPP Windows 版(7.4+ 及 8.x)都静态链接了
sockets,无需额外 DLL - macOS 版 XAMPP(如 M1/M2 包)通常也自带,但部分精简版可能剔除,此时需重装完整包
- 不推荐手动编译安装:XAMPP 的 PHP 是定制构建,自行编译
sockets极易因 ABI 不兼容导致 Apache 启动失败
在 php.ini 中启用 sockets 扩展
关键陷阱:很多人改错了 php.ini 文件。务必以 phpinfo() 页面顶部显示的 Loaded Configuration File 路径为准 —— 它可能不是 XAMPP 控制面板里“Config → PHP”打开的那个。
XAMPP 8.0.30 是一款免费、开源的跨平台 Web 服务器集成包,专为快速搭建本地 PHP 开发环境而设计。该版本核心组件包括:Apache 2.4.56、MySQL 8.0.33、PHP 8.0.30、phpMyAdmin 5.2.1 等。它支持 Windows、Linux 和 macOS 系统,可让开发者在个人电脑上轻松模拟服务器环境,无需复杂配置即可运行 WordPress、Thin
- 新建
htdocs/info.php,内容为<?php phpinfo(); ?>,浏览器访问后记下该路径 - 用文本编辑器打开该
php.ini,搜索extension=sockets - 若存在且被注释(即
;extension=sockets),删掉分号;若整行不存在,**不要手动添加**,说明 PHP 未启用该模块或版本不支持 - Windows 下注意区分:
extension=php_sockets.dll是旧版写法(PHP 5.x),XAMPP 7.4+ 应统一用extension=sockets
重启 Apache 并验证是否真正加载
改完配置不重启 = 白改。XAMPP 控制面板中必须点击 Stop 再 Start Apache,不能只点“Restart Module”。
- 验证方式一:命令行再跑一次
php -m | findstr sockets,应有输出 - 验证方式二:写个
test_socket.php放入htdocs:<?php var_dump(extension_loaded('sockets'));
访问后返回bool(true)才算成功 - 常见失败现象:
socket_create(): unable to create socket [10013]: An attempt was made to access a socket in a way forbidden by its access permissions—— 这不是扩展问题,是 Windows 防火墙/UAC 或端口被占用(如 80/443 被 Skype 占用),换高编号端口(如 8081)测试
能用 sockets 做什么?和 stream_* 函数怎么选
sockets 扩展提供的是最底层 BSD socket API 封装,适合写自定义 TCP/UDP 服务器、实现非 HTTP 协议(如 MQTT 客户端)、或需要精细控制连接生命周期的场景。
- 日常 HTTP 请求、简单客户端通信,优先用
file_get_contents()、curl_init()或stream_socket_client()—— 更安全、自动处理 DNS、超时、SSL 握手 -
socket_create()等函数不自动解析域名,得先调gethostbyname();也不自动处理 TLS,加密通信要自己套socket_connect()+stream_socket_enable_crypto() - 写服务端时注意:Apache/Nginx 无法托管
socket_create_listen()这类长期运行的 socket 服务,必须用 CLI 模式启动独立脚本(如php server.php),并配合screen或supervisor守护
真正容易被忽略的点:启用 sockets 后,allow_url_fopen 和 disable_functions 配置仍可能拦截 socket_* 函数 —— 检查 php.ini 中 disable_functions 行是否包含 socket_create 等关键字,有就删掉。










