昨晚听群友说由于不注意看swoole文档,导致挖出大坑,项目进度变得紧张。我也一直使用的是1.X版本,到目前还未使用2.X,听到网友这么说,也算给自己上了一堂课。
了解情况是这样,群友使用的是swoole2.* 版本, 使用了扩展函数作为回调(1.X版本没有问题),最新协程版本(2.X)还不支持,导致问题的出现。
swoole 官方也在文档标出,使用协程Server编程须知
https://wiki.swoole.com/wiki/page/853.html
禁止使用协程 API 的场景
在ZendVM
中魔术方法、反射函数、call_user_func
、call_user_func_array
是由C
函数实现的,并未opcode
,这些操作可能会与Swoole
底层的协程调度发生冲突。因此严禁在这些地方使用协程的API
。请使用PHP
提供的动态函数调用语法来实现相同的功能。
禁止使用协程的场景
__get
__set
__call
__callStatic
__toString
__invoke
__destruct
call_user_func
call_user_func_array
ReflectionFunction::invoke
ReflectionFunction::invokeArgs
ReflectionMethod::invoke
ReflectionMethod::invokeArgs
array_walk
/array_map
字符串函数
错误的代码
$func = "test";
$retval = call_user_func($func, "hello");
正确的代码
$func = "test";
$retval = $func("hello");
对象方法
错误的代码
$retval = call_user_func(array($obj, "test"), "hello");
正确的代码
$method = "test";
$retval = $obj->$method("hello");
目前swoole 描述的坑分享比较少,所以我就把网友这个坑拿出来分享, 由于swoole2.X 出来不久,所以使用前还是建议多看文档和官方的注意事项。