作者存档: yangzhiyong

LBcms告一段落

利用业余时间使用thinkphp做了一款cms:【热点中国】,现在终于实现了其基本功能,算是告一段落了。
以后要做的就是在推销网站时根据需要增加相应的功能
热点中国
前台界面:

后台界面

减少MySQL的Sleep进程有效方法

减少MySQL的Sleep进程有效方法
Post by vohot. Filed under PHP & MySQL.

经常遇到很多朋友问到,他的MySQL中有很多Sleep进程,严重占用MySQL的资源,现在分析一下出现这种现象的原因和解决办法:

1,通常来说,MySQL出现大量Sleep进程是因为采用的PHP的MySQL长链接数据库方式,即使用了mysql_pconnect来打开链接数据库,解决办法就是使用“短”链接,即mysql_connect函数。

2,在使用mysql_connect短链接方式打开数据库,每个页面在打开数据库后,执行SQL完成,当页面脚本结束的时候,这个MySQL连接会自动关闭并且释放内存。但仍然出现大量Sleep进程,可以看看网站是否存在以下几个方面的问题。

A,硬盘上存在大量的静态文件,或者WEB服务器负荷太重,在处理HTTP请求响应变得太慢,这样也有可能导致出现大量Sleep进程,解决方法适当调整WEB服务参数和文件,一味的静态或者缓存化网页内容并不是灵丹妙药。

B,在网页脚本中,有些计算和应用可能非常耗时,比如在0秒的时候打开数据库执行完一段SQL代码后,网页脚本随即花了20秒钟进行一段复杂的运算,或者是require了一个庞大的PHP文件(比如含有几千个违规关键字的过滤函数),哪么这个时候在MySQL后台看到的进程中,这个20秒的过程MySQL并没有做任何事情了,一直处于Sleep状态,直到这个页面执行完毕或者达到wait_timeout值(被强行关闭),优化网页脚本,尽量让程序快速运行,或者在执行这段耗时的运行过程中,执行mysql_close把当前MySQL链接强行关闭。

C,在采集站中,MySQL中大量的Sleep进程这类现象尤其明显(比如很多网友问道DeDeCMS的MySQL中出现大量Sleep),因为大部的采集器页面在运行过程中,事先打开了一个MySQL链接(可能是为了验证用户权限等),然后开始使用file_get_contents之类的操作去获取一个远程的网页内容,如果这个远程的站点访问速度太慢,比如花了10秒时间才把网页取回,哪么当前采集脚本程序就一直阻塞在这里,并且MySQL啥事也没干,一直处于Sleep状态。解决方法同上,在发出file_get_contents采集远程网页的时候,使用mysql_close强行关闭MySQL的连接,等采集完成在适当需要的时候再重新mysql_connect即可。

总的说来,MySQL是一个非常高效快速的数据库,要让他发挥到最大的性能,同时也不要过量的去掘取他的优势所在,适当的分表(超过10G的表,在打开和关闭以前更新的时候效率明显下降很多),尽可能的优化SQL都可以做到事半功倍的。

dede 调用当前文章url

在dede里面调用当前文章的url稍作二次开发就可以了,不用像网上说那样添加什么js的。
过程如下:
1,首先在(”/include/common.func.php”)文件里添加一个函数:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//在文章页面显示当前url
function thisUrl($id) {
    $dsql = new DedeSql(false);
    $row  = $dsql->GetOne("SELECT * FROM `#@__archives` WHERE `id` = {$id} ORDER BY `id` DESC  LIMIT 0, 1");
    $row2 = $dsql->GetOne("SELECT * FROM `#@__arctype` WHERE `id` = {$row['typeid']} ORDER BY `id` DESC  LIMIT 0, 1");
    $y=date("Y",$row['senddate']);
    $m=date("m",$row['senddate']);
    $d=date("d",$row['senddate']);
    $row2['typedir']=str_replace('{cmspath}','http://www.58w.cn',$row2['typedir']);
    $row2['namerule']=str_replace('{typedir}',$row2['typedir'],$row2['namerule']);
    $row2['namerule']=str_replace('{timestamp}',$row2['senddate'],$row2['namerule']);
    $row2['namerule']=str_replace('{aid}',$row['id'],$row2['namerule']);
    $row2['namerule']=str_replace('{Y}',$y,$row2['namerule']);
    $row2['namerule']=str_replace('{M}',$m,$row2['namerule']);
    $row2['namerule']=str_replace('{D}',$d,$row2['namerule']);
    $row2['url']=$row2['namerule'];
    return $row2['url'];
}

2,在文章模板里面使用这串标签就可以实现调用当前文章url的功能了

1
{dede:field name='id' function='thisUrl(@me)'/}

dede在列表页面添加本栏目最新的文章

今天www.58w.cn要做新的模板,特殊之处在于在列表页面和文章页面使用同一套模板,但是列表页面调用的是本栏目最新的一片文章。
具体做法:
1,在include/common.func.php文件中添加函数

1
2
3
4
5
6
7
8
//在列表页下显示最新文章
function getlmactile($actileid,$key='body'){
    $dsql = new DedeSql(false);
    $row = $dsql->GetOne("SELECT * FROM `#@__addonarticle` WHERE `typeid` = {$actileid} ORDER BY `aid` DESC  LIMIT 0, 1");
    $row2 = $dsql->GetOne("SELECT * FROM `#@__archives` WHERE `typeid` = {$actileid} ORDER BY `id` DESC  LIMIT 0, 1");
    $arr= array_merge($row,$row2);
    return $arr[$key];
}

2,在列表页面中使用类似这样的标签

1
2
{dede:field.id function="getlmactile(@me,'title')"/}
//title代表返回文章标题,你想返回数据库里的那个字段就在这个地方写上数据库字段名

演示地址:http://www.58w.cn/plus/list.php?tid=153

游戏任务

游戏任务要重新做了..

任务流程:
用户申请完任务,去游戏里完成任务,当用户在牌友会里打开申请中的任务(/jobcenter.php?action=applied),牌友会到游戏里验证是否完成任务进行相关操作

开发过程:
一.在lib/job/job/config.job.php里面添加如下数据
1.var $_chess = “chess”;
2.函数getJobType中添加$data[$this->_chess] = $this->chess();
3.函数jobs中添加$this->_chess => “棋牌游戏类”,
4.condition函数中添加
case ‘doPlayErbagang’:
return $this->finish_doPlayErbagang($factor);
break;
5.添加函数
function finish_doPlayErbagang($factor){
return ‘在PK28游戏中完成’.$factor['num'].’局二八杠游戏即可’;
}
/*
* tl棋牌游戏类
*/
function chess($k = null){
$data = array(
‘doPlayErbagang’ =>’二八杠’,
//’doPlaySuoha’ =>’梭哈’,
//’doPlayDoudizhu’ =>’斗地主’,
);
return $k ? $data[$k] : $data;
}
二.在u/require/jobcenter/jobcenter.php中添加如下代码
//tl处理游戏中的任务
foreach($joblists as $k => $v){
$factors=unserialize($v['factor']);
if(isset($factors['type'])&&$factors['type']==’pk28′&&$v['status']==’1′){
//$result=file_get_contents(“http://”);//获得任务数据
$result=’4′;
if($factors['num']<=$result){
$db->update(“UPDATE `pw_jober` SET `status`=’2′ WHERE (`jobid`=’{$v[id]}’)”);
}
}
}
//td处理游戏中的任务
三.在lib/job/job/中添加文件doPlayErbagang.job.php
四.在模板文件template/admin/jobhander.htm中添加代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- 二八杠tl -->
  <div class="admin_table">
  <table width="100%" id="job_doPlayErbagang" style="display:none;" class="mb10">
    <tr class="tr1 vt">
      <td class="td1">二八杠任务</td>
      <td class="td2"> 在二八杠游戏中完成指定的游戏局数 </td>
      <td class="td2"><div class="help_a"></div></td>
    </tr>
    <tr class="tr1 vt">
      <td class="td1">设定完成局数</td>
      <td class="td2"><input name="factor[doPlayErbagang][num]" type="text" class="input input_wa"  value="$doPlayErbagang[num]"/><input name="factor[doPlayErbagang][type]" type="text" class="input input_wa"  value="pk28" style="display:none;"/> </td>
      <td class="td2"><div class="help_a">任务申请成功以后,会员完成指定局数的游戏即可获得奖励。必须填写</div></td>
    </tr>
  </table>
  </div>

相关数据表信息:
pw_jober任务申请表
status 任务状态(是否完成)
0 未进行
1 进行中
2 已完成
3 已领取奖励
4 放弃任务
current 任务状态
1 未完成
2 已完成