sanshi0815
(sanshi0815)
高级会员

中级会员
UID 63534
精华
1
积分 534
帖子 655
金钱 524 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
|
   
json 频繁使用之双刃剑
最近,弄了一个聊天室,使用json作为中间存储介质,这样在单个页面实现聊天室功能,json有好处,就是方便解析,而且json的串可以放在内存里面,这样减少了io操作,而且js解析起来也很方便,减少了语言解析的过程.采用的是js框架是jquery.
进入正文
//取得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();
}
} 此函数为核心代码
调用
$("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 代码
<?php //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 文件,修改成
<?php $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 : sanshi0815@tom.com
[ 本帖最后由 sanshi0815 于 2008-4-15 12:53 PM 编辑 ]
|
|