PHP扩展程序中返回数组对象
2016-04-29 10:30
363 查看
【前言】
在网上有好多文章写这块的相关内容,可是我为什么又要再写一遍呢?因为网上大部分都是错的,尤其是那种第一个写错了,后面的人抄来就用。等后期发现php使得apache等服务经常挂掉时,也没想到是这里的问题。特此写本篇文章纠正网上的错误,解决PHP扩展程序的内存释放问题,减轻对服务的压力。
【错误写法】
用网上的错误写法举个例子,代码如下:PHP_FUNCTION(ListUsers) { //构造给PHP返回的值 array_init(return_value); std::vector<utf8String>users; pri.listUser(users); for(int i=0; i<users.size(); i++) { add_next_index_string(return_value, users[i].c_str(), 1); } }这个扩展函数被php调用后,会得到用户的信息。该信息以数组的方式被PHP获得,然后可以通过for...in...语句遍历数组。
虽然显示的结果有时是正确的,可当你频繁刷新网页时会发现经常会有页面无响应或者数组项缺失的情况。
【正确写法】
PHP_FUNCTION(ListUsers) { //构造给PHP返回的值 zval *retValue =NULL; ALLOC_ZVAL(retValue); array_init(retValue); std::vector<utf8String>users; pri.listUser(users); for(int i=0; i<users.size(); i++) { add_next_index_string(retValue, users[i].c_str(), 1); } RETURN_ZVAL(retValue,1,1); }这样我们就保证了每次调用此函数,都会有新的数组变量被初始化并分配内存。最后通过RETURN_ZVAL返回并释放本地内存。
PHP那边调用方法不变,运行对比后你会发现,显示的速度比以前快很多,也不会再出现服务器无响应的情况。
【再次强调】
大家在网上发布技术文章是好事,但一定要经过自己的多次测试和验证。别误人子弟,同时给自己带来不好的名声。相关文章推荐
- 一个关于if else容易迷惑的问题
- PHP5.2.*防止Hash冲突拒绝服务攻击的Patch
- 深入理解PHP之匿名函数
- JSP/PHP基于Ajax的分页功能实现
- 关于PHP通过PDO用中文条件查询MySQL的问题。
- 什么是设计模式
- PHP数据库长连接mysql_pconnect的细节
- Php Installing An Expansion
- php7 扩展类的写法[2]
- php7 类的方法传参[3]
- php7 读取php.ini[4]
- Mootools 1.2教程 函数
- autoit InputBox 函数
- IE7降低内存和降低CPU的几个技巧
- 文件遍历排序函数
- ruby 数组使用教程
- Ruby中的数组和散列表的使用详解
- C#实现AddRange为数组添加多个元素的方法