数据库 - Model 前置说明
官方开源项目 抓取代理IP

内存溢出问题

在Swoole中很难定位内存溢出的bug点,为了防止内存溢出,在应用中不要直接调用自定义的静态类,若有必要调用,可以先将实例存储在\x\context\Container上下文容器中。
而且在sw-x status指令中,可以查看到当前应用的内存状态,
若内存一直飙升无法下降的话的,就表示应用代码中发生了溢出现象,需要自行审计代码。

如果担心sw-x status不准的话,也可以使用linux的free -h,压测的过程中,开新窗口,查看打印出来的free有没有被回收,没的话就代表内存溢出了。

关于内存溢出的一些基础知识

关于Swoole内存溢出的问题,之前认为没必要在文档中解析这个问题,但最近有些开发者向我咨询了,我还是觉得有必要讲解下。

  • 由于Swoole是常驻内存的,所以静态类 或 静态方法所占用的内存开销,在Swoole中不会自动释放,需要手动unset销毁,这点需要注意,SW-X已经强制控制器的方法不再支持静态方法定义。
    但若开发者自行封装处业务类时,也要谨慎使用静态属性定义。
  • 还有global全局变量声明,在Swoole中服务可分为进程级、请求级,进程级对应Worker进程,请求级则对应其下的子线程,若在业务代码中声明变量为global,则该变量会从请求级升级为进程级变量,届时变量将无法自动销毁,因为Swoole会在请求结束自动释放其子线程所占用的内存开销,但不会销毁Worker进程相关的内存占用。
  • 不要在代码中执行sleep以及其他睡眠函数,这样会导致整个Worker进程阻塞
  • 不要在代码中执行exit\die,这样会导致整个Worker进程死亡,进而不断自动重启

SW-X

企业级 - 高性能 PHP 框架

最后更新:3年前 . 作者-小黄牛

本篇目录