Git --NB Framework 中文教程
目录 ▾ 使用指引

最后更新于:2018-10-26 11:33
55次阅读0条评论

关于Swoole

可以从下面地址获取swoole的详细信息和指引。
https://wiki.swoole.com/

必须安装的

  • 安装PHP并且版本至少 >7.0,推荐 7.1+

  • 连接迭代器依赖 pcre 库

  • 安装php扩展swoole, 并且版本至少 >=2.1

有冲突的

下面列出一些已知的和swoole有冲突的php扩展,请使用NB时不要安装或禁用它们:

  • xdebug

  • xhprof

  • blackfire

  • zend

  • trace

  • uopz

使用须知

下面列出了一些和传统PHP使用方式不同的事项,部分是引用swoole官方文档,并结合NB对一些问题给出处理方式。

注意事项

  • 不要在代码中执行sleep以及其他睡眠函数,这样会导致整个进程阻塞

  • exit/die是危险的,会导致Worker进程退出
    如果要代码中需要使用 exit/die,请使用框架提供的quit()函数,它和exit/die具有相同的作用

  • 可通过register_shutdown_function来捕获致命错误,在进程异常退出时做一些清理工作。
    这个NB已经进行了封装,按NB的错误处理即可。

  • Worker进程不得共用同一个Redis或MySQL等网络服务客户端,Redis/MySQL创建连接的相关代码可以放到onWorkerStart回调函数中。

类/函数重复定义

新手非常容易犯这个错误,由于Swoole是常驻内存的,所以加载类/函数定义的文件后不会释放。因此引入类/函数的php文件时必须要使用include_once或require_once,否会发生cannot redeclare function/class 的致命错误。

在NB中,类都是由框架自动加载的,使用者倒不必太关心这个。除非有特殊需要你自己include文件的地方,你需要小心处理一下。

进程隔离

进程隔离也是很多新手经常遇到的问题。修改了全局变量的值,为什么不生效,原因就是全局变量在不同的进程,内存空间是隔离的,所以无效。所以使用Swoole开发Server程序需要了解进程隔离问题。

  • 不同的进程中PHP变量不是共享,即使是全局变量,在A进程内修改了它的值,在B进程内是无效的

  • 如果需要在不同的Worker进程内共享数据,可以用Redis、MySQL、文件、SwooleTable、APCu、shmget等工具实现

  • 不同进程的文件句柄是隔离的,所以在A进程创建的Socket连接或打开的文件,在B进程内是无效,即使是将它的fd发送到B进程也是不可用的

mt_rand随机数

在Swoole中如果在父进程内调用了mt_rand,不同的子进程内再调用mt_rand返回的结果会是相同的。所以必须在每个子进程内调用mt_srand重新播种。详细的解决方法参考下面:
https://wiki.swoole.com/wiki/page/732.html

上一篇:响应输出
下一篇:重定向

相关评论

您需要登录后才可以发表评论