hyperf强制关闭swoole.use_shortname,因其在启动前检测function_exists('go'),若存在则报错中止;该ini指令不可动态修改,必须在php.ini或php-cli.ini中显式设为off,且需确保加载顺序正确。

开启 swoole.use_shortname 会让 Swoole 注册一堆全局函数(比如 go()、chan()、defer()),关掉后这些函数就不可用,必须改用完整命名(如 swoole_coroutine_create())。Hyperf 等现代框架强制要求关闭它,否则启动直接报错。
为什么 Hyperf 启动时提示 “Swoole short function names must be disabled”
Hyperf 内部做了显式检测:在 Server::start() 前检查 function_exists('go')。只要 go() 存在,就认为短名已启用,立即中止启动并抛出错误信息:Swoole short name have to disable before start server, please set swoole.use_shortname = 'Off' into your php.ini。
这不是警告,是硬性拦截 —— 框架设计上就拒绝和短名共存,避免运行时行为歧义(比如用户自己定义了 go() 函数,或不同版本 Swoole 对短名的实现不一致)。
-
swoole.use_shortname是 PHP INI 指令,**不能用ini_set()动态修改**,必须写在配置文件里 - 常见漏配位置:只改了
php.ini,但 CLI 环境读的是php-cli.ini(尤其宝塔、Docker、Mac Homebrew PHP 常见) - 值必须严格写成
swoole.use_shortname = 'Off',off、0、Off(无引号)都不生效
关掉 shortname 后,go() 还能用吗
不能。关掉后 go() 函数彻底消失,调用会触发 Fatal error: Uncaught Error: Call to undefined function go()。
对应替代写法是:
// 关闭 shortname 后必须这样写
swoole_coroutine_create(function () {
echo "in coroutine\n";
});
// 或更现代的写法(Swoole 4.5+)
co::create(function () {
echo "in coroutine\n";
});
注意:co::create() 属于类方法,不受 swoole.use_shortname 控制,始终可用;而 go() 是纯函数别名,开关全由该 INI 项决定。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
如何确认当前环境 shortname 是否已真正关闭
不要只看 phpinfo() 页面 —— 它可能显示的是 Web SAPI 的配置,而 CLI 启动服务用的是另一套。
最可靠的方式是执行:
php -r "var_dump(ini_get('swoole.use_shortname'));"
返回 string(3) "Off" 才算成功。如果返回空字符串或 false,说明该 INI 项未加载或拼写错误。
另外可快速验证函数是否消失:
php -r "var_dump(function_exists('go'));" // 应输出 bool(false)
若返回 true,说明仍有某个配置文件(比如 /etc/php/8.2/cli/conf.d/20-swoole.ini)偷偷启用了它,需要逐个排查。
最容易被忽略的一点:Swoole 扩展加载顺序会影响配置生效。如果 extension=swoole.so 写在 swoole.use_shortname=Off 之前,某些 PHP 版本下该配置会被忽略。确保 INI 行顺序是先设值、再加载扩展。










