swoole_server中内存管理机制
来源:互联网 发布:档案数据存储制度 编辑:程序博客网 时间:2024/06/07 01:08
swoole_server启动后内存管理的底层原理与普通php-cli程序一致。具体请参考Zend VM内存管理方面的文章。
局部变量
在事件回调函数返回后,所有局部对象和变量会全部回收,不需要unset。如果变量是一个资源类型,那么对应的资源也会被PHP底层释放。
function test(){ $a = new Object; $b = fopen('/data/t.log', 'r+'); $c = new swoole_client(SWOOLE_SYNC); $d = new swoole_client(SWOOLE_SYNC); global $e; $e['client'] = $d;}
●
全局变量
在PHP中,有3类全局变量。
● 使用global关键词声明的变量
● 使用static关键词声明的类静态变量、函数静态变量
● PHP的超全局变量,包括
全局变量和对象,类静态变量,保存在swoole_server对象上的变量不会被释放。需要程序员自行处理这些变量和对象的销毁工作。
class Test{ static $array = array(); static $string = '';}function onReceive($serv, $fd, $reactorId, $data){ Test::$array[] = $fd; Test::$string .= $data;}
● 在事件回调函数中需要特别注意非局部变量的array类型值,某些操作如 TestClass::
解决方法
● 同步阻塞并且请求响应式无状态的Server程序可以设置max_request,当Worker进程/Task进程结束运行时或达到任务上限后进程自动退出。该进程的所有变量/对象/资源均会被释放回收。
● 程序内在onClose或设置定时器及时使用unset清理变量,回收资源
异步客户端
Swoole提供的异步客户端与普通的PHP变量不同,异步客户端在发起connect时底层会增加一次引用计数,在连接close时会减少引用计数。
包括swoole_client、swoole_mysql、swoole_redis、swoole_http_client
function test(){ $client = new swoole_client(SWOOLE_TCP | SWOOLE_ASYNC); $client->on("connect", function($cli) { $cli->send("hello world\n"); }); $client->on("receive", function($cli, $data){ echo "Received: ".$data."\n"; $cli->close(); }); $client->on("error", function($cli){ echo "Connect failed\n"; }); $client->on("close", function($cli){ echo "Connection close\n"; }); $client->connect('127.0.0.1', 9501); return;}
●
● 执行onReceive回调函数时进行了close或者服务器端主动关闭连接触发onClose,这时底层会减少引用计数,$client才会被销毁
- swoole_server中内存管理机制
- java中内存管理机制
- OC中内存管理机制
- CUDA编程中内存管理机制
- ffmpeg中264部分的内存管理机制
- iOS中引用计数内存管理机制分析
- iOS中引用计数内存管理机制分析
- iOS中引用计数内存管理机制分析
- iOS中引用计数内存管理机制分析
- iOS中引用计数内存管理机制分析
- iOS(4)OC中内存管理机制
- 内存管理机制
- 内存管理机制
- 内存管理机制
- 内存管理机制
- 内存管理机制
- 内存管理机制
- 内存管理机制
- 如果你想从自己的应用程序检查GitHub的状态,我们提供一个基本的JSON API
- RecyclerView自定义进入动画
- Unity 读取XML文件
- Opencl paltform id
- 查看linux的cpu个数
- swoole_server中内存管理机制
- JAVA类加载机制详解
- 项目经理必备的八大能力
- <input style="ime-mode:disabled">
- 使用jsonp完美解决跨域问题
- FormData实现上传多图片,学习使用FormData
- JavaScript 中的工厂函数
- 《数据结构和算法》之栈的创建、插入和取出 二进制转换成十进制
- Swift类和结构体详解