禁止使用协程 API 的场景(2.x 版本)
在ZendVM中魔术方法、反射函数、call_user_func、call_user_func_array是由C函数实现的,并未opcode,这些操作可能会与Swoole底层的协程调度发生冲突。因此严禁在这些地方使用协程的API。请使用PHP提供的动态函数调用语法来实现相同的功能。
在
4.0版本后已解决此问题,可以在任意函数中使用协程,下列禁用场景仅针对2.x版本
__get__set__call__callStatic__toString__invoke__destructcall_user_funccall_user_func_arrayReflectionFunction::invokeReflectionFunction::invokeArgsReflectionMethod::invokeReflectionMethod::invokeArgsarray_walk/array_map
字符串函数
错误的代码
$func = "test";$retval = call_user_func($func, "hello");
正确的代码
$func = "test";$retval = $func("hello");
对象方法
错误的代码
$retval = call_user_func(array($obj, "test"), "hello");$retval = call_user_func_array(array($obj, "test"), "hello", array(1, 2, 3));
正确的代码
$method = "test";$args = array(1, 2, 3);$retval = $obj->$method("hello");$retval = $obj->$method("hello", ...$args);
