phpEnv 默认不启用 soap 扩展,需手动编辑对应 PHP 版本的 php.ini(如 C:\phpenv\php\8.1.22\php.ini),取消 ;extension=soap 前的分号,重启 PHP 服务后验证加载成功。

phpEnv 默认不启用 soap 扩展,必须手动开启才能使用 SoapServer 和 SoapClient —— 否则运行时会报 Class 'SoapServer' not found 或 Call to undefined function soap_version()。
确认当前 PHP 版本的 php.ini 路径
phpEnv 界面右下角显示「当前 PHP:8.1.22」这类信息,点击它可打开对应版本的配置目录。真实路径类似:C:\phpenv\php\8.1.22\php.ini(不是系统级的 php.ini,也不是 Apache 的 conf 目录下的副本)。
常见错误是改错了文件:比如编辑了 C:\Windows\php.ini,或 Apache conf\extra\php.ini,这些修改对 phpEnv 无效。
- 在 phpEnv 主界面点「PHP」→「配置文件」,它会自动用记事本打开正确的
php.ini - 或进
C:\phpenv\php\{版本号}\目录,找未带.bak后缀的php.ini - 搜索
;extension=soap,去掉前面的分号
重启服务并验证 soap 是否加载成功
仅修改 php.ini 不够,必须重启 phpEnv 的 PHP 服务(不是重启整个软件,而是点「PHP」→「重启」)。否则 php -m | findstr soap 仍看不到 soap。
立即学习“PHP免费学习笔记(深入)”;
验证方式有二:
- 命令行执行:
php -m | findstr soap(Windows),输出soap即生效 - 建一个
info.php放在站点根目录,内容为<?php phpinfo(); ?>,浏览器访问后搜索「soap」,看到「Soap Client» enabled」和「Soap Server» enabled」两行
若仍失败,检查 extension_dir 是否指向正确目录(如 ext 子目录),且 php_soap.dll 确实存在于该路径下 —— phpEnv 自带的 PHP 包通常已包含该 DLL,但极少数精简版可能漏掉。
用 phpEnv 运行 SOAP Web 服务要注意端口与路由
phpEnv 内置 Apache,默认监听 80 端口,而 SOAP 示例代码中 location 常写成 http://localhost/server.php —— 这没问题;但如果你启用了 Nginx 模式,或改过端口(如 8080),location 和 uri 必须同步更新,否则客户端调用时会卡住或返回 404。
-
SoapServer构造时的location必须是能被客户端直接访问的真实 URL(含端口) - Apache 下确保
server.php文件放在 phpEnv 的默认站点目录(如C:\phpenv\www\),不要放错层级 - 如果用 HTTPS 测试,
location必须写https://,且 phpEnv 本身不自带 SSL,需自行配置证书或改用 HTTP
另外,phpEnv 的 Apache 默认关闭了 AllowOverride All,所以无法靠 .htaccess 重写 SOAP 请求;SOAP 服务必须通过明确的 PHP 文件路径访问,不能依赖伪静态路由。
替代方案:不用 soap 扩展也能调用 Web 服务
如果你只是想「调用」外部 WebService(比如天气、物流接口),而不想开 soap 扩展,可以用 NuSOAP 库 —— 它纯 PHP 实现,无需 DLL,只要把 nusoap.php 放进项目目录,include 就能用 new nusoap_client()。
但注意:NuSOAP 不支持 PHP 8.2+ 的部分语法(如弃用的 create_function),phpEnv 若用的是 PHP 8.2 或更高版本,建议降级到 8.1 或改用原生 SoapClient(即老老实实开扩展)。
真正容易被忽略的一点:phpEnv 的「PHP 版本切换」只影响 CLI 和 Web SAPI,但不会自动重载 Apache/Nginx 配置 —— 切换 PHP 版本后,务必点「Web 服务器」→「重启」,否则新版本的扩展根本不会加载。



















