喜悦国际村 
» 游客:  注册 | 登录 | 统计 | 喜悦证交所 | 帮助

RSS 订阅当前论坛  

【北京】--【低薪】-【诚聘】--- 高级PHP工程师,WEB前台开发工程师

上一主题 下一主题
 12  1/2  1  2  > 
     
标题: [经验] json 频繁使用之双刃剑  
  本主题由 qh663 于 2008-4-21 04:48 AM 加入精华 
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



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 编辑 ]
2008-4-15 12:35 PM#1
查看资料  Blog  发短消息  QQ  顶部
 
uuq
高级会员
Rank: 4
中级会员


UID 28149
精华 1
积分 817
帖子 855
金钱 807 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2004-4-27
来自 广州
状态 离线
[推荐阅读] 北京国贸 高薪诚聘php程序员
你是不是用缓存了
2008-4-16 12:16 PM#2
查看资料  发短消息  顶部
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



UID 63534
精华 1
积分 534
帖子 655
金钱 524 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
[推荐阅读] 找呀找呀找工作
回复 #2 uuq 的帖子

文件是作为存储介质!
2008-4-17 02:12 AM#3
查看资料  Blog  发短消息  QQ  顶部
 
qh663
版主
Rank: 7Rank: 7Rank: 7
中级会员


UID 30020
精华 0
积分 546
帖子 580
金钱 546 喜悦币
威望 0
人脉 0
阅读权限 100
注册 2004-7-13
来自 河源
状态 离线
[推荐阅读] 看来大家最近都很闷,来个IQ智力题目玩玩
当遇到搜索的时候,用文件存储会不会太麻烦了。聊天室本身就太耗资源了,楼主这样做是有很大优势的!



五百多篇PHP学习资料
喜悦村BLOG
php团队接兼职项目QQ:80031807
PHP群:768844
2008-4-21 04:47 AM#4
查看资料  访问主页  Blog  发短消息  QQ  顶部
 
sanders_yao
版主
Rank: 7Rank: 7Rank: 7
or2 =333


UID 30286
精华 0
积分 2376
帖子 4371
金钱 2373 喜悦币
威望 0
人脉 3
阅读权限 100
注册 2004-7-23
来自 北京 菜户营
状态 离线
[推荐阅读] 最近有了租一台服务器的冲动,可是不会配置软件
我最近也在用 但不是聊天室
我是将json静态化成文件放到服务器端
当然 如果数据量还能控制的足够小的话 我还是想通过php直接将内存缓存中的数据读取输出json
这里有个问题 输出的时候速度还是没得说的 就是重建json文件的时候速度比较慢
还有个问题 是json_encode对中文的支持问题 我需要将中文都转成了utf-8编码才行 这样也消耗了很多效率
请高手不吝赐教




最近写的一些代码都会在以下地址发布,有兴趣的来批:
http://www.phpx.com/happy/thread-131368-1-1.html
2008-4-21 03:33 PM#5
查看资料  Blog  发短消息  顶部
 
gouki
注册会员
Rank: 2
一般会员



UID 15556
精华 0
积分 108
帖子 93
金钱 108 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2002-7-29
状态 离线
[推荐阅读] 【北京橙天华音音乐制作有限公司招聘】PHP开发工程师
JSON本来消耗的资源就挺大。而且。每次都会生成固定格式的发给客户端,再通过客户端反向解析……
如果这样的消耗非常大。还不如尝试着直接发送类似于XML格式的字符串,然后客户端用JS来解析这个XML字符串呢?

这样的话,也可以减少一部分的开销。毕竟每次发回的数据都有限的。




http://www.cnitblog.com/neatstudio/
http://www.neatcn.com
飞天小肥猪的简单人生
2008-4-21 11:56 PM#6
查看资料  Blog  发短消息  QQ  顶部
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



UID 63534
精华 1
积分 534
帖子 655
金钱 524 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
[推荐阅读] 带宽100M独享价格/100M独享服务器租用/100M服务器QQ445676667
回复 #5 sanders_yao 的帖子

json 可以支持中文,你需要做下json文件的修改! 对一些关键的小存储,如果变换不大,不如生成文件存储,本身修改的频率不大,没必要扔内存里,放在内存里,你每次打开页面,还要php请求返回,并不轻松
2008-4-22 11:01 AM#7
查看资料  Blog  发短消息  QQ  顶部
 
sanshi0815 (sanshi0815)
高级会员
Rank: 4
中级会员



UID 63534
精华 1
积分 534
帖子 655
金钱 524 喜悦币
威望 10
人脉 0
阅读权限 50
注册 2005-3-18
状态 离线
[推荐阅读] 救命 LINUX下用rm -f删除的文件怎么恢复 ,误删除了


QUOTE:
原帖由 gouki 于 2008-4-21 11:56 PM 发表
JSON本来消耗的资源就挺大。而且。每次都会生成固定格式的发给客户端,再通过客户端反向解析……
如果这样的消耗非常大。还不如尝试着直接发送类似于XML格式的字符串,然后客户端用JS来解析这个XML字符串呢?

...
json 消耗的是那里的资源,php把数组生成json这里吗? json只是一个存储格式,不存在什么其他的复杂的东西,可以说跟生成xml基本一样.

如果说json 在客户端消耗资源多的话,那就更不合适了,其实json就相当与一个js的数组,所以再客户端不需要对json再解析了,这里比xml要节约资源了
2008-4-22 11:04 AM#8
查看资料  Blog  发短消息  QQ  顶部
 
gouki
注册会员
Rank: 2
一般会员



UID 15556
精华 0
积分 108
帖子 93
金钱 108 喜悦币
威望 0
人脉 0
阅读权限 20
注册 2002-7-29
状态 离线
[推荐阅读] 招聘想成功的PHP程序员
因为JSON要求是UTF8的。而XML你可以指定字符集。



http://www.cnitblog.com/neatstudio/
http://www.neatcn.com
飞天小肥猪的简单人生
2008-4-22 11:15 AM#9
查看资料  Blog  发短消息  QQ  顶部
 
剑枫 (雪花)
论坛元老
Rank: 8Rank: 8
欧玛嘎


UID 26144
精华 1
积分 7411
帖子 1669
金钱 7401 喜悦币
威望 10
人脉 0
阅读权限 90
注册 2004-2-14
来自 山东郓城
状态 离线
[推荐阅读] 招聘PHP开发工程师
耗费内存么?



在场外支持奥运.....
2008-5-5 02:06 PM#10
查看资料  访问主页  发短消息  QQ  顶部
 12  1/2  1  2  > 
     


  可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题 | 开通个人空间  


 


Powered by Discuz! 6.1.0  © 2001-2010 Comsenz Inc.
Processed in 0.027248 second(s), 7 queries

(冀ICP备05009913号) 管理员:sadly 邮箱/MSN: sadly@phpx.com QQ:824008(长隐) 清除 Cookies - - Archiver - WAP