Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

====开心农场====加载代码优化,数据表压缩,为CPU减负~~

[复制链接]
liuzhly 发表于 2010-1-15 11:21:11 | 显示全部楼层 |阅读模式
本帖最后由 liuzhly 于 2010-01-15 12:12 编辑

用户打开农场,程序就开始 foreach 循环判断!

读取数据表,dog ,就是狗的数据,数据表中存在 12 条狗,所以循环 12 次,取出状态启用狗的数据进行输出显示,所以,稍微修改代码将这 12次减少为0-1或者2次 !

首先清除狗的所有数据,设置表 字段 dog 为空!

如果想无缝转换,看下面的蓝色字体,只有等用户买狗后才清除多余的数据,这样只能等用户操作了~~大家修改的时候,蓝色字体可不加!

红色字体是增加的!

灰色字体是要求去掉的!


if ( $_REQUEST['mod'] == "shop" && $_REQUEST['act'] == "buy" && $_REQUEST['type'] == "4" )
{
                                $query = $_SGLOBAL['db']->query( "SELECT dog,fertilizer,fb FROM ".tname( "plug_newfarm" )." where uid=".$_SGLOBAL['supe_uid'] );
                                while ( $value = $_SGLOBAL['db']->fetch_array( $query ) )
                                {
                                                                $list[] = $value;
                                }
                                if ( $list[0][fb] < $dogs[$_REQUEST['id']]['list'][1][FBPrice] )
                                {
                                                                exit( );
                                }
                                $dog = json_decode( $list[0][dog] );
                                $fertilizerarr = json_decode( $list[0][fertilizer] );
                                $dog->$_REQUEST['id']->dogFeedTime = $_SGLOBAL['timestamp'] + 172800;
                                $dogsql = 0;
                                foreach ( $dog as $key => $value )
                                {
                                                                if ( $key == $_REQUEST['id'] )
                                                                {
                                                                        $value->status = 1;
                                                                        $value->dogFeedTime = $_SGLOBAL['timestamp'] + 172800;
                                                                        $dogsql = 1;


                                                                }
                                                                else
                                                                {
                                                                        $value->status = 0;
                                                                        if($value->dogValidTime ==0){
                                                                           unset($dog->$key);
                                                                        }

                                                                }
                                }
        if($dogsql == 0){
                $dog->$_REQUEST['id']->id = $_REQUEST['id'];
                $dog->$_REQUEST['id']->dogValidTime = 1;
                $dog->$_REQUEST['id']->status = 1;
                $dog->$_REQUEST['id']->dogFeedTime = $_SGLOBAL['timestamp'] + 172800;
                $dog->$_REQUEST['id']->dogUnWorkTime = 0;
        }
                                $gouliang = 501;
                                $fertilizerarr->$gouliang = $fertilizerarr->$gouliang + $dogs[$_REQUEST['id']]['list'][1][gouliang];
                                $fertilizerarr_srt = json_encode( $fertilizerarr );
                                $dog_srt = json_encode( $dog );
                //echo $dog_srt ;
                //echo "--------" ;
                                $_SGLOBAL['db']->query( "UPDATE ".tname( "plug_newfarm" )." set fb=fb-".$dogs[$_REQUEST['id']]['list'][1][FBPrice].",dog='".$dog_srt."',fertilizer='".$fertilizerarr_srt."' where uid=".$_SGLOBAL['supe_uid'] );
                                echo "{\"code\":1,\"id\":".$dog->$_REQUEST['id']->id.",\"dogName\":\"".$dogs[$_REQUEST['id']][tName]."\",\"userDog\":{\"dogId\":\"".$_REQUEST['id']."\",\"dogValidTime\":".$dog->$_REQUEST['id']->dogValidTime.",\"dogFeedTime\":".$dog->$_REQUEST['id']->dogFeedTime.",\"dogUnWorkTime\":0},\"direction\":\"\\u8d2d\\u4e70\\u6210\\u529f\\u3002\",\"money\":0,\"FB\":-".$dogs[$_REQUEST['id']]['list'][1][FBPrice].",\"type\":4,\"item\":{\"eType\":3,\"eParam\":501,\"eNum\":".$dogs[$_REQUEST['id']]['list'][1][gouliang].",\"name\":\"\\u7CAE\\u98DF\"}}";
                                $sql = "INSERT INTO ".tname( "plug_newfarm_logs" )." (`uid`, `type`, `count`, `fromid`, `time`, `cropid`, `isread` ) VALUES (".$_SGLOBAL['supe_uid'].", 3, 1, ".$_SGLOBAL['supe_uid'].", ".$_SGLOBAL['timestamp'].", ".$_REQUEST['id'].", 1);";
                                                                $_SGLOBAL['db']->query( $sql );
                                include_once( S_ROOT."./source/function_cp.php" );
                                $icon = "farm";
                                $title_template = "{actor} 在自己的 <a href=\"newfarm.php\">农场</a> 放了一条旺财,嘿嘿!";
                                $body_general = "我让你们知道什么叫肉包子打旺财,有去无回!";
                                feed_add( $icon, $title_template );
                                exit( );
}

评分

2

查看全部评分

 楼主| liuzhly 发表于 2010-1-15 11:21:30 | 显示全部楼层
本帖最后由 liuzhly 于 2010-01-15 11:33 编辑

狗的数据节省了10多次循环,然后再看农场装饰吧!!新手勿动,修改地方比较多,只是简单说明。

农场装饰字段:目前是 72种装饰存进数据表中,当用户加载时,需要循环72次 !修改代码,压缩字段,让循环次数减少到4-8次!

说明:4次循环是用户没有买装饰 ,8次是用户购买一套装饰


如下两次加载好友和自己代码:


                                                                $decorativearr = ( array )json_decode( $list[0][decorative] );
                                                                foreach ( $decorativearr as $itemtype => $value )
                                                                {
                                                                                                foreach ( $value as $key => $value1 )
                                                                                                {
                                                                                                                                if ( $value1->status == 1 )
                                                                                                                                {
                                                                                                                                                                if ( $_SGLOBAL['timestamp'] < $value1->validtime || $value1->validtime == 0 )
                                                                                                                                                                {
                                                                                                                                                                                                $decorativearr_srt[] = "".$itemtype."\":{\"itemId\":".$key."}";
                                                                                                                                                                }
                                                                                                                                                                else if ( ( $value1->validtime < $_SGLOBAL['timestamp'] ) || ( $value1->validtime != 0 ) )
                                                                                                                                                                {
                                                                                                                                                                                                foreach ( $value as $key2 => $value2 )
                                                                                                                                                                                                {
                                                                                                                                                                                                                                if ( $itemtype == $key2 )
                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                $value2->status = 1;
                                                                                                                                                                                                                                }
                                                                                                                                                                                                                                else
                                                                                                                                                                                                                                {
                                                                                                                                                                                                                                                                $value2->status = 0;
                                                                                                                                                                                                                                }
                                                                                                                                                                                                }
                                                                                                                                                                                                $decorativearrsql = json_encode( $decorativearr );
                                                                                                                                                                                                $_SGLOBAL['db']->query( "UPDATE ".tname( "plug_newfarm" )." set decorative='".$decorativearrsql."' where uid=".$_SGLOBAL['supe_uid'] );
                                                                                                                                                                                                $decorativearr_srt[] = "".$itemtype."\":{\"itemId\":".$itemtype."}";

                                                                                                                                                                }
                                                                                                                                }
                                                                                                }
                                                                }
                                                                $decorative_srt = json_encode( $decorativearr_srt );

修改成如下:

                $decorativesql = 0;
                foreach ( $decorativearr as $itemtype => $value ){
                                foreach ( $value as $key => $value1 ){
//一下代码判断:如果是系统默认装饰,保留,购买时间没到期的,保留,剩下的,全部清除掉!节省数据库空间,提高程序运行效率!
                                        if ( $value1->status == 1 ){
                                                if ( $_SGLOBAL['timestamp'] < $value1->validtime || $value1->validtime == 0 ){
                                                        $decorativearr_srt[] = "".$itemtype."\":{\"itemId\":".$key."}";
                                                }else{
                                                        unset($decorativearr->$itemtype->$key);
                                                        $decorativesql = 1;
                                                        $value->$itemtype->status = 1;
                                                        $decorativearr_srt[] = "".$itemtype."\":{\"itemId\":".$itemtype."}";
                                                }
                                        }else{
                                                if($value1->validtime != 0 && $_SGLOBAL['timestamp'] >= $value1->validtime){
                                                        unset($decorativearr->$itemtype->$key);
                                                        $decorativesql = 1;
                                                }
                                        }
                                }
                }
//将数据库更改在这里,一次更新就行了,上面代码如果4个场景过期,要更新4次!
                $decorativesql == 1 && $_SGLOBAL['db']->query( "UPDATE ".tname( "plug_newfarm" )." set decorative='".json_encode( $decorativearr )."' where uid=".intval( $_REQUEST['ownerId'] ) );


这样,用户访问的时候,自动压缩了数据库!!!!

另外,还需要修改两个地方,

1、用户购买装饰!
                $decorativearr = json_decode( $list[0][decorative] );
                $kk = 0;
                $decorativesql = 0;
                for ( $a=0; $a<count($ids); $a++ ) {
                        foreach ( $decorativearr as $itemtype => $value ){
                                foreach ( $value as $key => $value1 ){
                                        if ( $key == $ids[$a] ){
                                                $decorativesql = 1;
                                                $value1->validtime = $_SGLOBAL['timestamp'] + $decorative[$key][itemValidTime];
                                                $decorative[$key][itemName] = str_replace("\\u","\\\\u",$decorative[$key][itemName]);
                                                $item_Name = $decorative[$key][itemName];
                                                if ( $kk == 0 ) {
                                                        $decorativearr_srt = "{\"id\":".$key.",\"itemId\":".$key.",\"itemType\":".$itemtype.",\"itemName\":\"".$item_Name."\",\"validTime\":".$value1->validtime.",\"status\":".$value1->status."}";
                                                        $kk++;
                                                } else {
                                                        $decorativearr_srt .= ",{\"id\":".$key.",\"itemId\":".$key.",\"itemType\":".$itemtype.",\"itemName\":\"".$item_Name."\",\"validTime\":".$value1->validtime.",\"status\":".$value1->status."}";
                                                }
                                        }
                                }
                        }
                        if($decorativesql == 0){
                                $ids_id = $ids[$a];
                                $keyid = $decorative[$ids_id][itemType];
                                $item_Name = str_replace("\\u","\\\\u",$decorative[$ids_id][itemName]);
                                $decorativearr->$keyid->$ids_id->validtime = $_SGLOBAL['timestamp'] + $decorative[$key][itemValidTime];
                                $decorativearr->$keyid->$ids_id->status = 0;
                                if ( $kk == 0 ) {
                                        $decorativearr_srt = "{\"id\":".$ids_id.",\"itemId\":".$ids_id.",\"itemType\":".$keyid.",\"itemName\":\"".$item_Name."\",\"validTime\":".$decorativearr->$keyid->$ids_id->validtime.",\"status\":0}";
                                        $kk++;
                                } else {
                                        $decorativearr_srt .= ",{\"id\":".$ids_id.",\"itemId\":".$ids_id.",\"itemType\":".$keyid.",\"itemName\":\"".$item_Name."\",\"validTime\":".$decorativearr->$keyid->$ids_id->validtime.",\"status\":0}";
                                }
                        }
                }
                $decorativearr = json_encode( $decorativearr );


                $decorativearr = json_decode( $list[0][decorative] );
                $decorativesql = 0;
                foreach ( $decorativearr as $itemtype => $value ){
                        foreach ( $value as $key => $value1 ){
                                if ( $key == $_REQUEST['id'] ){
                                        $decorativesql = 1;
                                        $value1->validtime = $_SGLOBAL['timestamp'] + $decorative[$_REQUEST['id']][itemValidTime];
                                        $decorative[$key][itemName] = str_replace("\\u","\\\\u",$decorative[$key][itemName]);
                                        $decorativearr_srt = "{\"id\":".$key.",\"itemId\":".$key.",\"itemType\":".$itemtype.",\"itemName\":\"".$decorative[$key][itemName]."\",\"validTime\":".$value1->validtime.",\"status\":".$value1->status."}";
                                }
                        }
                }
                if($decorativesql == 0){
                        $ids_id = $_REQUEST['id'];
                        $keyid = $decorative[$ids_id][itemType];
                        $decorativearr->$keyid->$ids_id->validtime = $_SGLOBAL['timestamp'] + $decorative[$key][itemValidTime];
                        $item_Name = str_replace("\\u","\\\\u",$decorative[$ids_id][itemName]);
                        $decorativearr->$keyid->$ids_id->status = 0;
                        $decorativearr_srt = "{\"id\":".$ids_id.",\"itemId\":".$ids_id.",\"itemType\":".$keyid.",\"itemName\":\"".$item_Name."\",\"validTime\":".$decorativearr->$keyid->$ids_id->validtime.",\"status\":0}";
                }
                $decorativearr = json_encode( $decorativearr );
回复

使用道具 举报

 楼主| liuzhly 发表于 2010-1-15 11:21:46 | 显示全部楼层
本帖最后由 liuzhly 于 2010-01-15 11:38 编辑

2、用户赠送收到装饰

if ( $_REQUEST['mod'] == "message" && $_REQUEST['act'] == "openMessage" && $_REQUEST['type'] == "4" ){ //[=27=]
        $query = $_SGLOBAL['db']->query( "SELECT message,decorative FROM ".tname( "plug_newfarm" )." where uid=".$_SGLOBAL['supe_uid'] );
        while ( $value = $_SGLOBAL['db']->fetch_array( $query ) ){
                $list[] = $value;
        }
        $message = json_decode( $list[0][message] );
        $decorativearr = json_decode( $list[0][decorative] );
        $writesql = 0;
        $value_itemId = 0;
        $value_validTime = 1;
        foreach ( $message->d as $key => $value ){
                if ( $_REQUEST['id'] == $value->id ){
                        if ( $value->status == 0 ){
                                $writesql = 1;
                                $value->status = 1;
                        }
                        $value_itemId = $value->itemId;
                        $value_validTime = $value->validTime;
                        $messagetype4 = "{\"id\":\"".$value->id."\",\"itemId\":\"".$value->itemId."\",\"itemType\":\"".$value->itemType."\",\"validTime\":\"".$value->validTime."\",\"status\":\"2\",\"itemName\":\"\",\"name\":\"".$value->name."\"}";
                }
        }
        $value_itemId == 0 && exit();
        if ( $writesql == 1 ){
                foreach ( $decorativearr as $key1 => $value1 ){
                        foreach ( $value1 as $key2 => $value2 ){
                                if ( $key2 == $value_itemId ){
                                        $value2->validtime = $value_validTime;
                                        $writesql = 0;
                                }
                        }
                }
                if($writesql == 1){
                        $keyid = $decorative[$value_itemId][itemType];
                        $decorativearr->$keyid->$value_itemId->validtime = $value_validTime;
                        $decorativearr->$keyid->$value_itemId->status = 0;
                }
                $message = str_replace( "\\", "\\\\", json_encode( $message ) );
                $decorativearr = json_encode( $decorativearr );
                $_SGLOBAL['db']->query( "UPDATE ".tname( "plug_newfarm" )." set message='".$message."',decorative='".$decorativearr."' where uid=".$_SGLOBAL['supe_uid'] );
        }
        echo $messagetype4;
        exit( );
} //[=27=]


说明:修改方法我就不说了,太麻烦,只是把代码放出来,还是:新手勿动!

判断用户装饰,如果表中有,就更新装饰,如果表中没有,就添加装饰!!

就是需要就拿过来用,不需要就删掉,这样,程序循环的时候,就不用循环那么多次了!

修改后,每个用户加载的时候,CPU至少减少 70 次运算 !!可以有效降低CPU使用率!!!
回复

使用道具 举报

iamxyh 发表于 2010-1-15 11:27:52 | 显示全部楼层
前排就坐!这是绝好的代码
回复

使用道具 举报

hs999 发表于 2010-1-15 11:43:51 | 显示全部楼层
感谢无私分享~~~~
回复

使用道具 举报

Gets 发表于 2010-1-15 11:45:34 | 显示全部楼层
优化了 不错。。。
回复

使用道具 举报

patiku 发表于 2010-1-15 12:33:19 | 显示全部楼层
顶~~
考虑的很周到、很棒!!
回复

使用道具 举报

kazzak 发表于 2010-1-15 13:17:47 | 显示全部楼层
又顶来了,建议整理发文件
回复

使用道具 举报

beian 发表于 2010-1-15 14:37:58 | 显示全部楼层
顶起来啊。。。。。
回复

使用道具 举报

dansui1314 发表于 2010-1-15 16:18:53 | 显示全部楼层
支持下!!!可惜不会改啊
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-11-19 01:31 , Processed in 0.039754 second(s), 6 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表