昨晚听群友说由于不注意看swoole文档,导致挖出大坑,项目进度变得紧张。我也一直使用的是1.X版本,到目前还未使用2.X,听到网友这么说,也算给自己上了一堂课。

了解情况是这样,群友使用的是swoole2.* 版本, 使用了扩展函数作为回调(1.X版本没有问题),最新协程版本(2.X)还不支持,导致问题的出现。

swoole 官方也在文档标出,使用协程Server编程须知

https://wiki.swoole.com/wiki/page/853.html

禁止使用协程 API 的场景

ZendVM中魔术方法、反射函数、call_user_funccall_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 出来不久,所以使用前还是建议多看文档和官方的注意事项。 

Logo

「智能机器人开发者大赛」官方平台,致力于为开发者和参赛选手提供赛事技术指导、行业标准解读及团队实战案例解析;聚焦智能机器人开发全栈技术闭环,助力开发者攻克技术瓶颈,促进软硬件集成、场景应用及商业化落地的深度研讨。 加入智能机器人开发者社区iRobot Developer,与全球极客并肩突破技术边界,定义机器人开发的未来范式!

更多推荐