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;  
 
//属性方式  
    $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; //是否唯一查询

相关实例代码:

$criteria = new CDbCriteria();
$criteria->select = 'table_name,model_id,sum(amount) total';
$criteria->group = 'table_name,model_id';
$criteria->addCondition("$nIdcId=4");//也可以$criteria->condition = "$nIdcId=4";
$aResult = accessory_info::model()->findAll($criteria);
 
 
$c = new CDbCriteria();
$c->select = 't.id, t.created_at, t.outsource_id, t.user_id, t.operate, t.content';
$c->join = 'LEFT JOIN outsource ON outsource.id=t.outsource_id';
$c->condition = 'outsource.idc_id IN(' . implode(',', $idc_ids)  . ')';
 
if($last_log_id) {
	$c->condition .= " AND t.id > $last_log_id";
}
 
$c->limit = 20;
$c->order = 't.id DESC';
 
$logs = OutsourceProcessLog::model()->findAll($c);

舍不得 && 寂寞花火 -顾莉雅

这片海顾莉雅


作词:胡小喃 作曲:胡小喃
演唱:顾莉雅

牵着手走过 你说你舍不得那一盏灯
有一次暧昧 你却回味着谁
爱情从来就不会停留

回回头爱过!你说你舍不得那张笑脸!
有一次暧昧 却剩下空空的黑夜!
流着泪爱不曾来过!

舍不得他,舍不得他,握住的却是留下的伤
总有一天,学会爱情,谁是下一个走过

回回头爱过!你说你舍不得那张笑脸!
有一次暧昧 却剩下空空的黑夜!
流着泪爱不曾来过!

舍不得他,舍不得他,握住的却是留下的伤
总有一天,学会爱情,谁是下一个走过

舍不得他,舍不得他,握住的却是留下的伤
总有一天,学会爱情,谁是下一个走过

不想伤了又伤,明明放开,还是阵痛。
曾经,死死紧握,最后灼伤的却是握你的手。

舍不得他,舍不得他,握住的却是留下的伤
总有一天,学会爱情,谁是下一个走过

谁是下一个走过(谁是下一个走过)
回回头爱过!你说你舍不得那张笑脸!

============================================

寂寞花火
词曲:小喃
演唱:顾莉雅

城市喧闹的夜晚
看不清月色
绚烂霓虹 把黑夜挥霍
擦肩而过的人群
表情在闪烁
街灯 有些 迷惑
旋律 风一样飘过
心里 开始 软弱
听着情歌 唱的是寂寞
心是无人 到过的角落
流星划过 暗淡了花火
沉默是最完满的结果

距离是那么遥远
我们都漂泊
擦肩而过 是一种解脱
究竟是谁犯了错
我们都爱过
脚步 从没有停过
旋律 风一样飘过
心里 开始 软弱
听着情歌 唱的是寂寞
心是无人 到过的角落
流星划过 暗淡了花火
沉默是最完美的结果
听着情歌 唱的是寂寞
心是无人 到过的角落
流星划过 暗淡了花火
沉默是最完美的结果
听着情歌 唱的是寂寞
心是无人 到过的角落
流星划过 暗淡了花火
沉默是最完美的结果

LAMP一键安装包

适用环境:
系统支持:CentOS-5 (32bit/64bit)、CentOS-6 (32bit/64bit)
内存要求:≥256M

安装了什么:
1、Apache 2.2.22或Apache 2.4.2
2、MySQL 5.5.24
3、PHP 5.2.17或PHP 5.3.13
4、phpmyadmin 3.5.1
5、ZendOptimizer 3.3.9(可选,只适合PHP 5.2.17)
6、xcache 1.3.2(可选)
7、pure-ftpd-1.0.36(可选)

如何安装:

wget http://centos.googlecode.com/files/lamp0.4.tar.gz
tar xf lamp0.4.tar.gz && cd lamp0.4 && chmod +x lamp.sh && ./lamp.sh

安装其它
1、执行脚本pureftpd.sh安装pure-ftpd。
2、执行脚本zend.sh安装ZendOptimizer。
3、执行脚本xcache.sh安装xcache。

使用提示:

LAMP脚本使用

lamp add(del,list):创建(删除,列出)虚拟主机。
lamp ftp(add|del|list):创建(删除,列出)ftp用户。
lamp uninstall:一键卸载lamp(卸载之前注意备份好数据!)。

程序目录

mysql目录: /usr/local/mysql
mysql data目录:/usr/local/mysql/data
php目录: /usr/local/php
apache目录: /usr/local/apache

进程管理

apache启动(停止|重启|重载配置文件):service httpd start(stop|restart|reload)
mysql(停止|重启|重载配置文件):service mysqld start(stop|restart|reload)
pureftpd(停止|重启|重载配置文件):service pure-ftpd start(stop|restart|reload)

配置文件路径

apache:/etc/httpd/conf
mysql:/etc/my.cnf
php:/etc/php.ini /etc/php.d
pure-ftpd:/etc/pure-ftpd.conf

Linux防火墙的关闭和开启

1) 重启后生效
开启:

chkconfig iptables on

关闭:

 chkconfig iptables off

2) 即时生效,重启后失效
开启:

service iptables start

关闭:

service iptables stop

需要说明的是对于Linux下的其它服务都可以用以上命令执行开启和关闭操作。

在开启了防火墙时,做如下设置,开启相关端口,
修改/etc/sysconfig/iptables 文件,添加以下内容:

-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT 
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

YII 有用的代码

使用updateCounters()来更新计数器字段:

Book::model()->updateCounters(array('download_count'=>1),':id=id',array(':id'=>$id));

使用sendFile()来下载文件:

$type = LFilter::checkString($_GET['t']);
$dataProvider = Book::model()->findByPk($id);
$content = $this->renderPartial('book',array(
                                     'dataProvider' => $dataProvider,
                                     'type' => $type,
                                ),true,false);
Yii::app()->request->sendFile($dataProvider->name.'.'.$type,$content);

设计数据库时候如果create_time,update_time字段为int(10).在模型中使用行为插件:

public function behaviors()
{
return array(
    'CTimestampBehavior' => array(
    'class' => 'zii.behaviors.CTimestampBehavior',
    'createAttribute' => 'create_time',
    'updateAttribute' => 'update_time',
     )
); }

YII项目性能优化

1.最小化脚本文件
通过配置应用组件 clientScript 的 scriptMap 属性来声明脚本被最小化。 可以在应用配置中完成,也可以在代码中配置

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>'/js/all.js',
'jquery.ajaxqueue.js'=>'/js/all.js',
'jquery.metadata.js'=>'/js/all.js',
......
);

上面的代码所做是映射这些 JavaScript 文件到 URL /js/all.js。 若这些 JavaScript 文件任何之一需要被一些组件引入, Yii 将引入这个 URL (一次) 而不是各个独立的脚本文件。

其次,我们需要使用一些工具来联合 (和压缩) JavaScript 文件为一个单独的文件,并保存为 js/all.js。

相同的技巧也适用于 CSS 文件。

在 Google AJAX Libraries API 帮助下我们可以改善页面载入速度。例如,我们可以从 Google 的服务器引入 jquery.js而不是从我们自己的服务器。要这样做, 我们首先配置 scriptMap 如下,

$cs=Yii::app()->clientScript;
$cs->scriptMap=array(
'jquery.js'=>false,
'jquery.ajaxqueue.js'=>false,
'jquery.metadata.js'=>false,
......
);

通过映射(map)这些脚本文件为 false,我们阻止 Yii 产生引入这些文件的代码。作为替代,我们在页面中编写如下代码直接从 Google 引入文件,

<head>
<?php echo CGoogleApi::init(); ?>
<?php echo CHtml::script(
CGoogleApi::load('jquery','1.3.2') . "\n" .
CGoogleApi::load('jquery.ajaxqueue.js') . "\n" .
CGoogleApi::load('jquery.metadata.js')
); ?>
</head>

2.使用缓存技术
Yii 提供了几个可以有效提高性能的缓存方案。若一些数据的生成需要长时间,我们可以使用数据缓存 方法来减少数据产生的频率;若页面的一部分保持相对的固定,我们可以使用 碎片缓存 方法减少它的渲染频率;若一整个页面保持相对的固定,我们可以使用 页面缓存 方法来节省页面渲染所需的花销。

若应用在使用 Active Record,我们应当打开 数据结构缓存 以节省解析数据表结构的时间。可以通过设置 CDbConnection::schemaCachingDuration 属性为一个大于 0 的值来完成。

除了这些应用级别的缓存技术,我们也可使用服务级别的缓存方案来提高应用的性能。事实上,我们之前描述的 PHP APC 缓存 就属于此项。 也有其他的服务器技术,例如 Zend Optimizer, eAccelerator, Squid

3.开启 APC 扩展
启用 PHP APC扩展 可能是改善一个应用整体性能的最简单方式。此扩展缓存和优化 PHP 中间代码并避免时间花费再为每个新来的请求解析PHP脚本

4.禁用调试模式
禁用调试模式是另一个改善性能的容易方式。若常量 YII_DEBUG 被定以为 true,这个 Yii 应用将以调试模式运行。调试模式在开发阶段是有用的,但是它影响性能因为一些组件引起额外的系统开销。例如,信息记录器(the message logger)将为被条被记录的信息记录额外的调试信息。

5.使用 yiilite.php
当启用 PHP APC 扩展 时, 我们可以将 yii.php 替换为另一个名为 yiilite.php 的引导文件来进一步提高 Yii-powered 应用的性能。

文件 yiilite.php 包含在每个 Yii 发布中。它是一些常用到的 Yii 类文件的合并文件。在文件中,注释和跟踪语句都被去除。因此,使用 yiilite.php 将减少被引用的文件数量并避免执行跟踪语句。

注意,使用 yiilite.php 而不开启 APC 实际上将降低性能,因为 yiilite.php 包含了一些不是每个请求都必须的类,这将花费额外的解析时间。 同时也要注意,在一些服务器配置下使用 yiilite.php 将更慢,即使 APC 被打开。 最好使用演示中的 hello world 运行一个基准程序来决定是否使用 yiilite.php。

6.数据库优化
从数据库取出数据经常是一个网络应用的主要瓶颈。虽然使用缓存可以减少性能损失,它不能解决根本问题。当数据库包含大量数据而被缓存的数据是无效时,如果没有良好的数据库和查询优化设计,获取最新的数据将会非常耗费资源。

在一个数据库中聪明的设计索引。索引可以让 SELECT 查询更快, 但它会让 INSERT, UPDATE 或 DELETE 查询更慢。

对于复杂的查询,推荐为它创建一个数据库视图,而不是通过PHP代码生成查询语句让DBMS来重复解析他们。

不要滥用 Active Record。虽然 Active Record 擅长以一个 OOP样式模型化数据,它实际上为了它需要创建一个或几个对象来代表每条查询结果降低了性能。 对于数据密集的应用,在底层使用 DAO 或 数据库接口 将是一个更好的选择。

最后但并不是最不重要的一点,在你的 SELECT 查询中使用 LIMIT 。这将避免从数据库中取出过多的数据 并耗尽为 PHP 分配的内存。