Beanstalkd初体验

​安装beanstalkd

#首先使EPEL生效(参考:http://fedoraproject.org/wiki/EPEL/FAQ#howtouse):
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
#安装beanstalkd
yum install beanstalkd

推荐使用加载类文件方式调用
可到http://sourceforge.net/projects/beanstalk/ 下载php客户端代码(见附件)
PHP使用范例:

 array( '127.0.0.1:11300' ),
        'select'        => 'random peek'
    ));  
    $beanstalk->use_tube('foo');
    $beanstalk->put(0, 0, 120, 'say hello world');         
    $beanstalk->watch('foo');
    $job = $beanstalk->reserve_with_timeout();
    echo $job->get();                  // Output: 'say hello world'   
    Beanstalk::delete($job);                    // Delete the job.
?>

CentOS6 RabbitMQ体验

RabbitMQ安装与启动

#首先使EPEL生效(参考:http://fedoraproject.org/wiki/EPEL/FAQ#howtouse):
rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
#安装rabbitmq-server
yum install rabbitmq-server librabbitmq*
#启用rabbitmq-server
service rabbitmq-server start
#查看rabbitmq的插件列表
/usr/lib/rabbitmq/bin/rabbitmq-plugins list
#开启rabbitmq网页端管理功能
/usr/lib/rabbitmq/bin/rabbitmq-plugins enable rabbitmq_management
#关闭rabbitmq网页端管理功能
/usr/lib/rabbitmq/bin/rabbitmq-plugins disable rabbitmq_management
#使用默认账号密码(均guest)登陆http://server-name:15672/即可管理

PHP集成扩展ampq(版本参考:http://pecl.php.net/package/amqp)

wget http://pecl.php.net/get/amqp-1.2.0.tgz #php5.3安装amqp1.2.0可成功. 1.4会报错
tar xzf amqp-1.2.0.tgz
cd amqp-1.2.0
/usr/local/php/bin/phpize
./configure --with-php-config=/usr/local/php/bin/php-config --with-amqp
make && make install
#增加生成的amqp.so到php.ini中
[AMPQ]
extension=/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/amqp.so
#重启web/php服务
/etc/init.d/nginx -s reload
#查看是否已集成成功
php -m|grep amqp

PHP使用RabbitMQ的例子
入队列:

'localhost' , 'port'=> '5672', 'login'=>'guest' , 'password'=> 'guest','vhost' =>'/');
$conn = new AMQPConnection($conn_args);
$conn->connect();
//创建exchange名称和类型
$channel = new AMQPChannel($conn);
$ex = new AMQPExchange($channel);
$ex->setName('direct_exchange_name');
$ex->setType(AMQP_EX_TYPE_DIRECT);
$ex->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$ex->declare();
//创建queue名称,使用exchange,绑定routingkey
$q = new AMQPQueue($channel);
$q->setName('queue_name');
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$q->declare();
$q->bind('direct_exchange_name', 'routingkey_name');
//消息发布
$channel->startTransaction();
$message = json_encode(array('Hello World!','DIRECT'));
$ex->publish($message, 'routingkey_name');
$channel->commitTransaction();
$conn->disconnect();
?>

取队列:

'localhost' , 'port'=> '5672', 'login'=>'guest' , 'password'=> 'guest','vhost' =>'/');
$conn = new AMQPConnection($conn_args);
$conn->connect();
//设置queue名称,使用exchange,绑定routingkey
$channel = new AMQPChannel($conn);
$q = new AMQPQueue($channel);
$q->setName('queue_name');
$q->setFlags(AMQP_DURABLE | AMQP_AUTODELETE);
$q->declare();
$q->bind('direct_exchange_name', 'routingkey_name');  
//消息获取
$messages = $q->get(AMQP_AUTOACK) ;
if ($messages){
      var_dump(json_decode($messages->getBody(), true ));
}
$conn->disconnect();
?>
2

Yii防止重复提交并在提交成功后给出提示

如何防止重复提交,并在提交成功后给出提示?

//控制器(controller)中
Yii::app()->user->setFlash('submit','thanks');
$this->;refresh();

//视图(view)中
if(Yii::app()->user->hasFlash('submit')){
    echo Yii::app()->user->getFlash('submit');
}

一般我们是跳转到列表页,或用redirect跳到编辑页,就不需要了,如果还是要显示当前页
以上就有用了,比如在当前时显示,编辑或添加新的记录

Yii CDbCriteria的常用方法

这是Yii CDbCriteria的一些笔记和常用用法:

$criteria = new CDbCriteria;      
$criteria->addCondition("id=1"); //查询条件,即where id = 1  
$criteria->addInCondition('id', array(1,2,3,4,5)); //代表where id IN (1,23,,4,5,);  
$criteria->addNotInCondition('id', array(1,2,3,4,5));//与上面正好相法,是NOT IN  
$criteria->addCondition('id=1','OR');//这是OR条件,多个条件的时候,该条件是OR而非AND  
$criteria->addSearchCondition('name', '分类');//搜索条件,其实代表了。。where name like '%分类%'  
$criteria->addBetweenCondition('id', 1, 4);//between 1 and 4   
$criteria->compare('id', 1);    //这个方法比较特殊,他会根据你的参数自动处理成addCondition或者addInCondition,  
                                //即如果第二个参数是数组就会调用addInCondition  
/* 传递变量 */  
$criteria->addCondition("id = :id");  
$criteria->params[':id']=1;  
/* 一些public vars */  
$criteria->select = 'id,parentid,name'; //代表了要查询的字段,默认select='*';
$criteria->join = 'xxx'; //连接表  
$criteria->with = 'xxx'; //调用relations   
$criteria->limit = 10;    //取1条数据,如果小于0,则不作处理  
$criteria->offset = 1;   //两条合并起来,则表示 limit 10 offset 1,或者代表了。limit 1,10  
$criteria->order = 'xxx DESC,XXX ASC' ;//排序条件  
$criteria->group = 'group 条件';  
$criteria->having = 'having 条件 ';  
$criteria->distinct = FALSE; //是否唯一查询

转自 http://www.neatstudio.com/show-1692-1.shtml

页面制作笔记(CSS篇)

设置页面整体样式:

body{margin:0;padding:0;font:12px Microsoft YaHei}

背景:

background-color: #FFCC66;
background-image: url("butterfly.gif");
background-repeat: no-repeat;平铺背景图像 repeat-x(图像横向平铺) repeat-y(图像纵向平铺) repeat(图像横向和纵向都平铺)
background-attachment: fixed;固定背景图像 scroll(非固定的)fixed(图像是固定在屏幕上的)
background-position: right bottom;放置背景图像 x y
缩写顺序值:[background-color] | [background-image] | [background-repeat] | [background-attachment] | [background-position]
缩写:background: #FFCC66 url("butterfly.gif") no-repeat fixed right bottom;

字体:

font-style: italic;  字体样式 normal(正常)、italic(斜体)或oblique(倾斜)
font-variant: normal;字体变化 normal(正常)或small-caps(小体大写字母)
font-weight: bold;   字体浓淡 normal(正常)或bold(加粗)
font-size: 30px;字体大小
font-family: Microsoft YaHei, arial, sans-serif; 字体族
font属性的值应按以下次序书写:
缩写顺序值:font-style | font-variant | font-weight | font-size | font-family
缩写:font: italic bold 30px arial, sans-serif;

文本:

text-indent: 20px;文本缩进
text-align: center;文本对齐 left center right
text-decoration:none;文本装饰 underline(下划线) line-through(删除线) overline(上划线)
letter-spacing: 6px;字符间距
text-transform:none;文本转换 capitalize(首字母大写) uppercase(全大写) lowercase(全小写)

链接伪类:

a:link 从未访问过的链接
a:visited 已访问过的链接
a:active 激活的链接
a:hover  鼠标悬停的链接

盒状:

margin:1px 2px 3px 4px; 外边距
padding:1px 2px 3px 4px;内边距
width:1px;宽度
height:2px;高度
float:left; 浮动 属性值可以是left、right或者none
clear:both; 控制浮动元素的后继元素的行为,属性的值可以是left、right、both或none
position:absolute;top: 50px;left: 50px;  元素定位 absolute(绝对定位),relative(相对定位)  可以通过属性left、right、top和bottom来设定
z-index: 1;层次堆叠

边框:

border-width: 1px;边框宽度
border-style: solid;边框样式
border-color: blue;边框颜色
缩写:border: 1px solid blue;

注(CSS3中常用属性):

border-radius:1px 2px 3px 4px; 设置圆角
box-shadow:0 1px 0 #BABABA;  设置阴影

CodeGuard 免费为你的网站创建备份

CodeGuard是一个简单方便的网站备份工具,可以用来为网站创建备份,包括网站文件和数据库,并列出完整的备份时间表,方便我们对备份历史进行查看。
CodeGuard 为网站创建备份

免费帐户最多可设置一个备份任务,最大备份空间为2G
http://img.kaychen.cn/2012/codeguard1.jpg

WordPress网站可以通过插件方便的备份网站数据

完整的备份记录,方便我们进行查看
http://img.kaychen.cn/2012/codeguard3.jpg

看下来似乎Wordpress插件是自动来备份数据库的,而非WP则需要手动设置备份的FTP及MySQL数据库,具体内容可以查看官方帮助页面

传送门: CodeGuard官网

wordpress数据库结构揭密

WordPress数据库简介

优秀的WordPress博客系统是构建在10个数据库表的基础之上的,WordPress的官方文档对这10个数据表有一个大概的介绍,具体网址是:WordPress数据库官方文档

WordPress数据库的10个数据表分别是:

表名(点击表名查看详细介绍) 描述
wp_comments 文章评论信息表
wp_links 链接信息表
wp_options 基本配置信息表,通常通过get_option来操作,该表通常作为插件存储数据的一个地方。
wp_postmeat 文章额外数据表,例如文章浏览次数,文章的自定义字段等都存储在这里。
wp_posts 文章信息表,包括了日志、附件、页面等等信息。是WordPress最重要的一个数据表。
wp_terms 文章分类、链接分类、标签的信息表。
wp_term_relationships 分类与文章信息表(wp_posts)、链接表(wp_links)的关联表。
wp_term_taxonomy 分类信息表,区分wp_terms信息的分类类型,有category、link_category和tag三种分类类型。
wp_usermeta 用户额外信息表
wp_users 用户基本信息表。存放系统所有用户基本信息。

WordPress数据库表之间的关系是什么呢?

wordpress使用.htaccessr轻松设置防盗链5 `. ?6 ~; t& O( i# J

要搞明白这个问题以及对WordPress数据表之间的关系有更加深刻的理解,让我们先来想想WordPress博客系统的功能,默认安装的WordPress2.6.2版本博客系统涉及的数据信息主要包括了用户信息、分类信息、链接信息、文章信息、文章评论信息、基本配置信息这6类信息。: G3 S7 U, S& ^! @! ^) N

用户信息:系统中所有注册用户的帐号信息。” i2 _+ s; O* s  w7 s) y

分类信息:包括了文章分类、链接分类、标签这3中分类信息。

链接信息:就是博客系统中的友情链接信息。. b5 c” K( @. w( ]  C& j’ Q

文章信息:博客系统中的日志、日志产生的附件、页面等信息。  s- C+ D9 x& C2 T/ J: V* E0 P  x& Y

文章评论信息:对具体日志或者附件的评论信息。

基本配置信息:系统中的基本配置信息,例如博客名称,博客地址等等。

WordPress数据库的10个数据表就是为了存储以上6类数据信息而设计,这些表之间的总体关系结构如下图所示:

wordpress数据库结构设计图

1

wordpress使用.htaccessr轻松设置防盗链

前几天KayChen用来存放图片的空间流量急剧飙升,空间商索性暂停了我的空间,虽然有些气愤,但也很无奈,于是关于.htaccess设置图片防盗链,和wordpress安全性就显得刻不容缓。

今天就主要介绍下如何让自己的网站防盗链。注:此方法支持独立图床防盗链。

wordpress使用.htaccessr轻松设置防盗链

.htaccess设置图片防盗链
不同的主机由于本身设置上的差异.htaccess上图片防盗链代码写法也不尽相同,在测试了多种写法的时候下面的方法成功。

我的写法:

RewriteEngine on
RewriteCond %{HTTP_REFERER} !^$ [NC]
RewriteCond %{HTTP_REFERER} !kaychen.cn [NC]
RewriteCond %{HTTP_REFERER} !aujer.com [NC]
RewriteRule .(png|jpg|gif)$ http://old.kaychen.cn/logo.gif [R,NC,L]

解释一下:
1、RewriteCond %{HTTP_REFERER} !^$ [NC]
允许空“HTTP_REFERER”的访问,即允许用户在浏览器地址栏中直接输入图片地址时图片文件的显示。一般而言,这是可选的,不过,建议这么设置,如果强迫必须具有“HTTP_REFERER”才能访问,可能会带来某些问题,比如说在用户通过代理服务器访问时。

2、 RewriteCond %{HTTP_REFERER} !kaychen.cn [NC]
RewriteCond %{HTTP_REFERER} !aujer.com [NC]
设置允许访问的HTTP来源,包括我们的自身站点(kaychen.cn、aujer.com) Google、Baidu、Bloglines、Feedburner、feedsky等。当然你还可以设定其他网站允许使用你的图片。

3、 重点说一下最后一句:
一般情况下,定义被盗链时替代的图片,让所有盗链 jpg、png 、gif 等图片的网页,显示根目录下的 xxx.xgif 文件(代码是:RewriteRule .(jpg|png)$ /xxx.xgif [R,NC,L]),注意:这里必须有一个“/”,而且xxx.xgif件体积越小越好,越小就越节省流量,为什么图片文件是.xgif?以为前面我们已经禁用了.gif,不改名字盗链我们图片的网站就无法显示我们的警告图片。(这个方法我没成功,似乎这个方法会让浏览器陷入死循环,于是我用下面的方法)
我的写法跟这个不同,我用的是其它服务器上(未设置过防盗链)的图片来替换演示。这样的好处是完全不用自己网站的流量,而又可以达到警告和宣传的目的。完美!