牛骨文教育服务平台(让学习变的简单)
博文笔记

PHP扩展程序中返回数组对象

创建时间:2016-04-29 投稿人: 浏览次数:149

【前言】

在网上有好多文章写这块的相关内容,可是我为什么又要再写一遍呢?因为网上大部分都是错的,尤其是那种第一个写错了,后面的人抄来就用。

等后期发现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那边调用方法不变,运行对比后你会发现,显示的速度比以前快很多,也不会再出现服务器无响应的情况。

【再次强调】

大家在网上发布技术文章是好事,但一定要经过自己的多次测试和验证。别误人子弟,同时给自己带来不好的名声。

声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。