json 频繁使用之双刃剑
最近,弄了一个聊天室,使用json作为中间存储介质,这样在单个页面实现聊天室功能,json有好处,就是方便解析,而且json的串可以放在内存里面,这样减少了io操作,而且js解析起来也很方便,减少了语言解析的过程.采用的是js框架是jquery.
进入正文
CODE:
[Copy to clipboard]
//取得json的url地址
var url_get_json = "get.php";
function getChatList()
{
$.getJSON(''+url_get_json+'?r='+Math.random(),function(json){createDiv(json);});
if($('#'+form_isGotoEnd).val()==1 && $('#'+form_isGotoEnd).attr('checked')==true)
{
}else{
gotoEnd();
}
}
此函数为核心代码
调用
CODE:
[Copy to clipboard]
$("document").ready(
function(){
//建立选择
makeSelect(div_look_chat_select,form_look_chat_select,chat_type_array,0);
makeSelect(div_send_chat_select,form_send_chat_select,chat_type_array,0);
//监听点击按钮事件
$('#'+form_send_button).click(function(){checkForm();});
//getChatList();
setInterval('getChatList()',1000);
$("#"+div_chat_send).keyup(function(e){keyup(e);});
}
);
//setInterval('getChatList()',1000); 这里为频繁调用
get.php 代码
CODE:
[Copy to clipboard]
//include_once("JSON.php");
include_once("classes/FileIO.class.php");
//设置cache文件名
$cacheFile = "cache/chat.data";
//聊天记录数组
$charArr = array();
if(FileIO::isFileExists($cacheFile))
{
$chatStr = FileIO::getFileContent($cacheFile);
$charArr = unserialize($chatStr);
}
//echo FastJSON::encode($charArr);
//$json = new Services_JSON();
//echo $json->encode($charArr);
echo json_encode($charArr);
?>
我这个文件做了很多注释,而且这个文件的功能也不复杂,现在开启的是,php本身对json的支持函数
经过测试
1,采用 非php模块加载方式进行数组转换成json串的
ie内存使用量,无明显变化 apache 进程使用内存量,明显快速增加
2 ,采用 php模块方式 进行数组转换成json串的
ie内存使用量,无明显变化 apache 进程使用内存量,增加 但是属于缓慢增加,或者说,基本可以接受
现在说明下,为什么我会把瓶颈确定在这里
我查了下,有2种声音,一种说 频繁的ajax请求,造成js使用ie内存不段增加,解决办法是js的内存回收机制
我观察了下,我ie的内存使用量,没有明显的增加,也就是说,我没用产生 ajax请求浪费,还有就是我使用的是jquery,应该这个框架是靠的住的。不过说实话,我读了下代码,ajax请求过度,释放的问题我解决不了。那好,我做测试
大家可以看到 getChatList() 这个函数里,我吧请求回来的json给了 createDiv(json) 来处理,我这个函数就写成 function createDiv(json){rerurn false}
如果是ajax请求过度,那么内存的量应该会下来,我测试,没有好转,内存使用依然快速增加。那好我注释掉了,json的请求,内存使用平缓。
那问题就在这里,那好,我修改了,我的get.php 文件,修改成
CODE:
[Copy to clipboard]
$json = new Services_JSON();
echo $json->encode(array());
?>
这样内存使用基本平缓 修改成使用的样子,内存快速增加
这就说明,是 生成js编码的情况下,造成了,apache的内存使用快速增加,并不是ajax请求过度造成的
以上大家可以测试。
问题,我也想不明白的原因,同样是json串的生成,就算是php 模块加载形式,也只是生成了json的格式,并没有其他什么情况,为什么使用可以保持服务器内存的稳定,而采用php语言来生成的json方式,就不能成呢? 这个需要明白php内存使用的人来解释下了。
我上面的方案,比较极端,因为get.php文件会被频繁调用,所以内存使用上看起来更明显些。
把json串的生成直接放到post.php里,是个好的方案,get.php只提供文件读取,这样更好一些,但是上面的问题依然存在。
作者 :叁石
blog : http://blog.csdn.net/sanshi0815
mail :
[email protected]