Archive for the ‘drupal’ category

drupal7 :限制用户发一定数量的node:限制一用户只能引用一次特定的node

June 17th, 2011

好久没写drupal的文章了,最近接了个项目,项目的源码和项目的目的等出于保密当然是不能公布的,但程序的逻辑分享一下。

客户要求:限制1用户只能引用一次特定的node(当然,这里有CCK的node reference字段).例如:USER-A 建立node1引用了nodeB后,他以后再也不能创建node2去引用nodeB了。

注:以往我都用drupal 6的,这次是第一次写drupal 7的模块,不过发现,没太大变化,建议如果真想学好drupal的朋友,要学好“print_r”和“db_query”这两个个函数,具体可看我以前的drupal anywhere :http://www.trackself.com/archives/551.html

1.要首先找到控制node表单(form)验证(validate)的hook,于是google : hook node validate drupal 7 马上就找到hook_node_validate的页面

看看解析,果然适合:下面就和drupal6几科没差别了,$node的结构改了,于是要用print_r($node);查看一下结构

2.构建SQL:查找uid是当前用户的uid的并且已经关联过该nid的----根据需要构建即可。

3.debug的时候出错:发现drupal 7的db_query已经异于drupal6,但换汤不换药,查一下db_query的api说明文档就知道如何做了

于是就得到了下面的函数(为保护用户数据,一些字段我改成XXX了,函数不要复制,参考就好)

function XXX_node_validate($node, $form, &$form_state) {

if($node->type==”YYYY”){

/*

print “<pre>”;

print_r($node);

print “</pre>”;

*/

$uid=$node->uid;

$reffernid=$node->field_QQQQ['und'][0]['nid'];

//下面找出同时存在:field_QQQ_nid是$reffernid然后又是由uid是$uid的项

$sql=”

SELECT n.nid FROM {node} n

LEFT JOIN {field_revision_field_QQQ} f on f.entity_type=’node’ AND n.nid=f.entity_id

WHERE n.uid=”. $uid . ” AND field_QQQQ_nid=”.$reffernid;

$db=db_query($sql);

if($db->fetchObject()){

/*

print “<pre>”;

print_r($db);

print “</pre>”;

*/

form_set_error(‘field_QQQQ’, t(‘you could not post’));//error message

}

 

 

}

 

}

 

Share

drupal:hack core for performance,关于页面缓存

April 24th, 2011

在所有的web缓存当中,页面缓存是最有效的。将页面存放于内存、存放于文件、存放于数据库。

对于廉价的服务器,存放于内存可能性不大,存放于文件,当数量大于10万的时候也会变得不可能,于是存放于数据库是不错的选择。

drupal的page cache就是这么做的。

admin/settings/performance这个页面上,有个“Page cache”的模式,有个cache time选项,千万别以为它们是相关的。无论在什么时候,page cache都是将生成的内容作为“暂时”存放的。normal 与 agg的差别只是agg更少的调用boot的过程。

 

为了性能,我做了下面两个hack,也许以后会做得更多

  1. drupal6默认最多只能cache 1天的数据,这明显不足的,所以我改了

/modules/system/system.admin.inc  里的system_performance_settings函数,没大改,只增加了几个数字drupal_map_assoc(array(0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400,172800,604800,1209600,2419200)

即将缓存的数据从最多一天增加到最多四周

 

2.drupal 6的页面缓存,即cache_page是默认只是临时存放的,所谓临时,即每当clear_cache_all执行即被清空,这对廉价的服务器而言是非常致命的性能伤害。因为node_save就会调用clear_cache_all,也就是说每有人发表comment,发表node,执行cron的时候,那么cache_page就会被清空,这对页面内容更新不是很快很多的站点而言是很脑残的(不过这样的做法会使得drupal架构很好,不会出错)。

于是我hack了/includes/common.inc,

原先的:

cache_set($base_root . request_uri(), $data, ‘cache_page’, CACHE_TEMPORARY, drupal_get_headers());

改为了

if(arg(0)==”node” && is_numeric(arg(1))){

//当是node的时候,则储存,有个不足的地方则是当comment时,目前我comment不多,暂不考虑

$newtime=time()+variable_get(‘cache_lifetime’, 0);

 

}else{

//如果是index,分类页等,则使用drupal的原机制(我的分类不多)

$newtime=CACHE_TEMPORARY;

}

cache_set($base_root . request_uri(), $data, ‘cache_page’, $newtime, drupal_get_headers());

3.注意了,当使用了cacherouter的时候,如果模式不是db,上面了几个hack都没意义,在廉价的服务器,不要使用cacherouter的其它模式。否则性能消耗会很严重。Filecache麻,像bluehost就有文件数量限制,大于15W个文件的时候就会被警告,而且文件数量越多,据bluehost说是会有性能下降的。而如果使用xcache或者其它的opocode,bluehost是每5分钟清空一次的,也就是说如果将内容存放于xcache,每5分钟就必须重建一次。

by:http://www.trackself.com/

 

Share

bluehost性能:fastcgi及opcode(xcache),drupal下测试

April 20th, 2011

bluehost性能,我用的是drupal,20000个node,当搜索引擎爬行时,下面是我观察了好几天的数据(由于我用了中文URL,所以不能整站静态化),只谈PHP性能。

如果1.没打开fastcgi,那么马上就会超时得很厉害

2.打开了fastcgi,由于node太多,还是有超时,但已经好些了,再安装xcache (opcode都差不多,xcache安装容易些),性能再次上升,但超时依然

3.安装cacherouter模块:非常奇怪,性能反而下降了,不解,于是查看xcache-admin的管理界面,发现cache每4~5分钟就会被清空一次。

发帖问bluehost的管理员,加上自己的测试,终于得到以下信息:

1.opcode(xcache) 只有在fastcgi的模式下才有效,否则安装了也是浪费性能

2.但fastcgi每5分钟就会重启一次进层,所以导致这个过程中opcode的cache的就会被灭掉,下次又要重建cache,这绝对是性能浪费的.但如果不用的话,又会慢得要死

3.我想到了一个关于drupal的折中的办法,drupal所有页面都是调用index.php的,所以我在cron里设置了每5分钟请求一下index.php,这就能一定比率地保证了drupal的模块是被缓存了,注意是index.php,而不是普通的主页,这要与启用了boost相区别,如我就设置为:http://u14s.com/index.php而不是设置为http://u14s.com

This is the case with APC as well. You only get the benefit of 5 minutes of in memory caching. There unfortunately is nothing we can do to remedy this.

 

 

Share

blueshost潜在的限制:mysql不能大于3G

April 17th, 2011
“MySQL usage is over 1,000 tables and/or 3 GB on a single account or 1,000 tables and/or 2 GB on a single database”
来自bluehost的email,要我删除一些数据库
<pre>我看了我几个数据库,大约1篇文章占用mysql空间的10KB的,也就是说,如果drupal放在bluehost上,一个站上的的文章数是不能超过20万的,所有站上的文章数不能超过30万的
对几个采集站来说,数据上30万,只是时间上的问题,看来,到时候就要考虑怎么将数据放在别的地方了,或者放在bluehost的pqsql上,不过既然MYSQL都有限制,估计PQ也是会有的……廉价的东西毕竟不爽。

sqllite?将旧数据的body清空了,然后将body写入sqllite中节约mysql的空间,这应该是可行的。

不管了,到时再说

 

Share

drupal:共享一个基于GOOGLE的站内搜索的模块

April 15th, 2011

共享一个drupal的模块

下载:http://www.trackself.com/code/trackselftools_search.zip

版本:drupal 6,理论上能用于drupal7,不过没测试

站点:http://u14s.com/ (右上角)

用这个模块的的原因是:

1.google站内搜索现在是要收费的,所以我得开发一个模块代替,模块逻辑很简单:将关键词改为:”关键词 site:站点域名”(一个GOOGLE搜索语法)

2.drupal的站内搜索做得很浪费性能,我的站是放在bluehost这样的廉价空间上的,而且做的是中文,drupal是支持中文搜索,但是却是将中文切开为一个个字去入库及搜索……要想搜索做得好,你得将中文关键词切为1……如果文章数有10万……

3.这是一个自动采集的网站,内容也许会在某一天上升到百万,不可能自己做站内搜索浪费性能了

4.GOOGLE收录drupal的网站收录得很好,装几个SEO模块再自己做点中文的修改调后后几乎马上就收录了。

5.代码很简单,是在我发现我的空间性能消耗太厉害后用不到半小时写出来的(所以也不知drupal.com是否已经有过类似的项目了,反正也就几行代码,懒得在上面搜索了)。没打算再更新,也没有安全问题(估计),就几行代码。

安装:与普通drupal模块安装一样,安装完后到block去调整一下想放在哪个region即可,默认安装完后是放在left的。测试过程中保证能访问到google(在中国,访问不到很正常),如果会google语法的话,可以自己再调整一下,做得更精确

打个广告:我采集站的程序自认做得不错,但美工做得实在垃圾,有没有哪个自由开发者(美工)想合作一起做采集的,计划是做几个千真万级的站,文字站一个,图片站一个(现在图片采集已经能跟picasa挂在一起了),然后将程序发布。

by:http://www.trackself.com

Share
« 1 2 3 4 5 6 7 8 9 10 11 12 ... 23 »