SVN简介和工作原理

SVN简介和工作原理

svn服务器有两种运行方式:独立服务器和借助于apache。 svn://或http://
svn客户端tortoisesvn
svn的基本工作原理: 在一台服务器上建立一个源代码库,库里可以存放许多不同项目的源程序。有源代码库管理员统一管理这些源程序。每个用户在使用源代码库之前,首先要把源代码库里德项目文件下载到本地,然后开发人员可以在本地修改,左后用svn命令进行提交,游源代码库统一管理修改。
版本控制解决了:
*代码管理混乱
*解决代码冲突困难
*在代码整合期间引发bug
*无法对代码的拥有者进行权限控制
*项目不同版本的发布困难

svn工程目录说明:
*dav目录:是提供apache与mod_dav_svn使用的目录,让他们存储内部数据
*db目录:就是所有版本控制的数据存放文件
*hooks目录:放置hook脚本文件的目录
*locks目录:用来放置subversion见艰苦锁定数据的目录,用来追踪存取文件库的客户端
*format文件:是一个文本文件,里面只放了一个整数。表示当前文件库配置的版本号
*conf目录:是这个仓库的配置文件(仓库的用户访问账号、权限等)


mysql 性能分析及explain用法

1. 使用explain语句去查看分析结果
explain select * from test1 where id=1;
会出现:
id  selecttype  table  type possible_keys  key key_len  ref rows  extra各列
其中,
type=const表示通过索引一次就找到了,
key=primary的话,表示使用了主键 
type=all,表示为全表扫描,
key=null表示没用到索引;
type=ref,因为这时认为是多个匹配行,在联合查询中,一般为REF
2. MYSQL中的组合索引
假设表有id,key1,key2,key3,把三者形成一个组合索引,则
如:
  where key1=….
  where key1=1 and key2=2
  where key1=3 and key3=3 and key2=2
根据最左原则,这些都是可以使用索引的哦

  from test where key1=1 order by key3
用explain分析的话,只用到了normal_key索引,但只对where子句起作用,而后面的order by需要排序

3 .使用慢查询分析:
在my.ini中:
long_query_time=1
log-slow-queries=d:\mysql5\logs\mysqlslow.log
把超过1秒的记录在慢查询日志中
可以用mysqlsla来分析之。也可以在mysqlreport中,有如
DMS 分别分析了select ,update,insert,delete,replace等所占的百份比

4 .MYISAM和INNODB的锁定
myisam中,注意是表锁来的,比如在多个UPDATE操作后,再SELECT时,会发现SELECT操作被锁定了,必须等所有UPDATE操作完毕后,再能SELECT 

innodb的话则不同了,用的是行锁,不存在上面问题。
 
5 .MYSQL的事务配置项
innodb_flush_log_at_trx_commit=1
表示事务提交时立即把事务日志写入磁盘,同时数据和索引也更新
innodb_flush_log_at_trx_commit=0
事务提交时,不立即把事务日志写入磁盘,每隔1秒写一次
innodb_flush_log_at_trx_commit=2
事务提交时,立即写入磁盘文件(这里只是写入到内核缓冲区,但不立即刷新到磁盘,而是每隔1秒刷新到盘,同时更新数据和索引 
  • explain用法
EXPLAIN tbl_name
或:
EXPLAIN [EXTENDED] SELECT select_options

前者可以得出一个表的字段结构等等,后者主要是给出相关的一些索引信息,而今天要讲述的重点是后者。

举例
mysql> explain select * from event;
+—-+————-+——-+——+—————+——+———+——+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——+——-+
| 1 | SIMPLE | event | ALL | NULL | NULL | NULL | NULL | 13 | |
+—-+————-+——-+——+—————+——+———+——+——+——-+
1 row in set (0.00 sec)

各个属性的含义
id
select查询的序列号

select_type
select查询的类型,主要是区别普通查询和联合查询、子查询之类的复杂查询。

table
输出的行所引用的表。

type
联合查询所使用的类型。
type显示的是访问类型,是较为重要的一个指标,结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref。

possible_keys
指出MySQL能使用哪个索引在该表中找到行。如果是空的,没有相关的索引。这时要提高性能,可通过检验WHERE子句,看是否引用某些字段,或者检查字段不是适合索引。

key
显示MySQL实际决定使用的键。如果没有索引被选择,键是NULL。

key_len
显示MySQL决定使用的键长度。如果键是NULL,长度就是NULL。文档提示特别注意这个值可以得出一个多重主键里mysql实际使用了哪一部分。

ref
显示哪个字段或常数与key一起被使用。

rows
这个数表示mysql要遍历多少数据才能找到,在innodb上是不准确的。

Extra
如果是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
如果是where used,就是使用上了where限制。
如果是impossible where 表示用不着where,一般就是没查出来啥。
如果此信息显示Using filesort或者Using temporary的话会很吃力,WHERE和ORDER BY的索引经常无法兼顾,如果按照WHERE来确定索引,那么在ORDER BY时,就必然会引起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。

常见的一些名词解释
Using filesort
MySQL需要额外的一次传递,以找出如何按排序顺序检索行。

Using index
从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。

Using temporary
为了解决查询,MySQL需要创建一个临时表来容纳结果。

ref
对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取

ALL
完全没有索引的情况,性能非常地差劲。

index
与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。

SIMPLE
简单SELECT(不使用UNION或子查询) 


PHP设计模式——注册者模式

注册者模式并不是很常见,它也不是一个典型的创建模式,只是为了利用静态方法更方便的存取数据。

<?php
/**
* Registry class
*/
class Package {

  protected static $data = array();

  public static function set($key, $value) {
    self::$data[$key] = $value;
  }

  public static function get($key) {
    return isset(self::$data[$key]) ? self::$data[$key] : null;
  }

  final public static function removeObject($key) {
    if (array_key_exists($key, self::$data)) {
      unset(self::$data[$key]);
    }
  }
}


Package::set('name', 'Package name');

var_dump(Package::get('name'));
// Package name

 

 

 


PHP设计模式——简单工厂模式

  • ①抽象基类:类中定义抽象一些方法,用以在子类中实现
  • ②继承自抽象基类的子类:实现基类中的抽象方法
  • ③工厂类:用以实例化所有相对应的子类

为什么要用抽象类:

相当于制定一个规范,比如一个商场,规定必须有一个支付的方法,那我们在父类中定义一个抽象支付方法,那么继承之后就必须实现

<?php
/**
 *
 * 定义个抽象的类,让子类去继承实现它
 *
 */
abstract class Operation{
    //抽象方法不能包含函数体
    abstract public function getValue($num1,$num2);//强烈要求子类必须实现该功能函数
}

 

<?php
/**
 * 加法类
 */
class OperationAdd extends Operation {
    public function getValue($num1,$num2){
        return $num1+$num2;
    }
}

/**
 * 减法类
 */
class OperationSub extends Operation {
    public function getValue($num1,$num2){
        return $num1-$num2;
    }
}

/**
 * 乘法类
 */
class OperationMul extends Operation {
    public function getValue($num1,$num2){
        return $num1*$num2;
    }
}

/**
 * 除法类
 */
class OperationDiv extends Operation {
    public function getValue($num1,$num2){

    }
}

/**
 * 求余类(remainder)
 *
 */
class OperationRem extends Operation {
    public function getValue($num1,$num2){
 
    }
}

现在还有一个问题未解决,就是如何让程序根据用户输入的操作符实例化相应的对象呢?
解决办法:使用一个单独的类来实现实例化的过程,这个类就是工厂

<?php
/**
 * 工程类,主要用来创建对象
 * 功能:根据输入的运算符号,工厂就能实例化出合适的对象
 *
 */
class Factory{
    public static function createObj($operate){
        switch ($operate){
            case '+':
                return new OperationAdd();
                break;
            case '-':
                return new OperationSub();
                break;
            case '*':
                return new OperationMul();
                break;
            case '/':
                return new OperationDiv();
                break;
        }
    }
}
$test=Factory::createObj('+');
$result=$test->getValue(23,0);
echo $result;

其他关于关于此模式的笔记:

工厂模式:
以交通工具为例子:要求请既可以定制交通工具,又可以定制交通工具生产的过程
1>定制交通工具
1.定义一个接口,里面包含交工工具的方法(启动 运行 停止)
2.让飞机,汽车等类去实现他们
2> 定制工厂(通上类似)
1.定义一个接口,里面包含交工工具的制造方法(启动 运行 停止)
2.分别写制造飞机,汽车的工厂类去继承实现这个接口

 

 

 

 

 

 

 

 

 

 


Linux redis配置

  • redis.conf

配置文件参数说明:

1. Redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes启用守护进程

 daemonize no

2. 当Redis以守护进程方式运行时,Redis默认会把pid写入/var/run/redis.pid文件,可以通过pidfile指定

 pidfile /var/run/redis.pid

3. 指定Redis监听端口,默认端口为6379,作者在自己的一篇博文中解释了为什么选用6379作为默认端口,因为6379在手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字

 port 6379

4. 绑定的主机地址

 bind 127.0.0.1

5.当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能

 timeout 300

6. 指定日志记录级别,Redis总共支持四个级别:debug、verbose、notice、warning,默认为verbose

 loglevel verbose

7. 日志记录方式,默认为标准输出,如果配置Redis为守护进程方式运行,而这里又配置为日志记录方式为标准输出,则日志将会发送给/dev/null

 logfile stdout

8. 设置数据库的数量,默认数据库为0,可以使用SELECT 命令在连接上指定数据库id

 databases 16

9. 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合

save

Redis默认配置文件中提供了三个条件:

 save 900 1
 save 300 10
 save 60 10000

分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改。

10. 指定存储至本地数据库时是否压缩数据,默认为yes,Redis采用LZF压缩,如果为了节省CPU时间,可以关闭该选项,但会导致数据库文件变的巨大

 rdbcompression yes

11. 指定本地数据库文件名,默认值为dump.rdb

 dbfilename dump.rdb

12. 指定本地数据库存放目录

 dir ./

13. 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步

 slaveof

14. 当master服务设置了密码保护时,slav服务连接master的密码

 masterauth

15. 设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH 命令提供密码,默认关闭

 requirepass foobared

16. 设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息

 maxclients 128

17. 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区

 maxmemory

18. 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no

 appendonly no

19. 指定更新日志文件名,默认为appendonly.aof

 appendfilename appendonly.aof

20. 指定更新日志条件,共有3个可选值:

no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)

 appendfsync everysec

21. 指定是否启用虚拟内存机制,默认值为no,简单的介绍一下,VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中(在后面的文章我会仔细分析Redis的VM机制)

 vm-enabled no

22. 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享

 vm-swap-file /tmp/redis.swap

23. 将所有大于vm-max-memory的数据存入虚拟内存,无论vm-max-memory设置多小,所有索引数据都是内存存储的(Redis的索引数据 就是keys),也就是说,当vm-max-memory设置为0的时候,其实是所有value都存在于磁盘。默认值为0

 vm-max-memory 0

24. Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,作者建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值

 vm-page-size 32

25. 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存。

 vm-pages 134217728

26. 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4

 vm-max-threads 4

27. 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启

 glueoutputbuf yes

28. 指定在超过一定的数量或者最大的元素超过某一临界值时,采用一种特殊的哈希算法

 hash-max-zipmap-entries 64
 hash-max-zipmap-value 512

29. 指定是否激活重置哈希,默认为开启(后面在介绍Redis的哈希算法时具体介绍)

 activerehashing yes

30. 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

 include /path/to/local.conf

Linux环境下安装部署Redis

  • 安装Redis

执行make 对Redis解压后文件进行编译

编译完成之后,可以看到解压文件redis-3.0.7 中会有对应的src、conf等文件夹,大部分安装包都会有对应的类文件、配置文件和一些命令文件。

编译成功后,进入src文件夹,执行make install进行Redis安装

  • Redis的部署

1.首先为了方便管理,将Redis文件中的conf配置文件和常用命令移动到统一文件中

a)创建bin和redis.conf文件

 mkdir  /usr/local/redis/bin
 mkdir  /usr/local/redis/ect

b)执行Linux文件移动命令

 mv /lamp/redis-3.0.7/redis.conf /usr/local/redis/etc
 cd /lamp/redis-3.0.7/src
 mv mkreleasdhdr.sh redis-benchmark redis-check-aof redis-          check-dump redis-cli redis-server /usr/local/redis/bin

2、执行Redis-server 命令,启动Redis 服务

注意:这里直接执行Redis-server 启动的Redis服务,是在前台直接运行的(效果如上图),也就是说,执行完该命令后,如果Lunix关闭当前会话,则Redis服务也随即关闭。正常情况下,启动Redis服务需要从后台启动,并且指定启动配置文件

3、后台启动redis服务

a)首先编辑conf文件,将daemonize属性改为yes(表明需要在后台运行)

 cd etc/
 vi redis.conf

b)再次启动redis服务,并指定启动服务配置文件

redis-server /usr/local/redis/etc/redis.conf

4、服务端启动成功后,执行redis-cli启动Redis 客户端。查看端口号。

 

 

 

 

 

 

 

 

 


Linux Apache配置

  • 启动、关闭、重启
[root@localhost lampstack]# apache2/bin/apachectl start
[root@localhost lampstack]# apache2/bin/apachectl stop
[root@localhost lampstack]# apache2/bin/apachectl restart
  • Apache设置为Linux系统服务,并开机启动

1.将链接apachectl 复制到系统启动目录下并命名为httpd

[root@localhost lampstack]# cp /opt/lampstack/apache2/bin/apachectl /etc/rc.d/init.d/httpd

到此,其实已经可以使用service httpd start等命令,但在Linux服务列表还没有注册

2.使用chkconfig来注册apache服务,并其可以在linux的服务列表中看到(chkconfig –list)

a.在init.d的httpd链接文件中第2行添加如下注释,并保存退出

[root@localhost lampstack]#  vim /etc/rc.d/init.d/httpd
#!/bin/sh
# chkconfig:35 61 61
# description:Apache

意义如下 35:在3级别和5级别(级别见文末TIPS)启动httpd 61:启动顺序为61号,S61 61:关闭顺序为61号,K61 当进行chkconfig –add httpd操作时,如果没有指定level那么就会来这个注释中取值

b.将httpd配置自启并加入linux服务监控

[root@localhost lampstack]# chkconfig --add httpd

此时,就可以在rc.d下的相应的3和5目录下看到S61httpd,并在0、1、2、4、6目录看到K61httpd了

3.这是2步的手动设置方式,不想看可以跳过。可以手动设置自启动:将链接apachectl放一份软链接到rc3.d目录下(和/或rc*.d目录下)

[root@localhost lampstack]# ln -s /etc/rc.d/init.d/httpd /etc/rc.d/rc3.d/S61httpd

 

  • TIPS:

1. chkconfig有0-6总共7个等级:

0:表示关机
1:单用户模式
2:无网络连接的多用户命令行模式
3:有网络连接的多用户命令行模式
4:不可用
5:带图形界面的多用户模式
6:重新启动

 

 

 

 

 

 




PHP函数range()创建数组

在改东西时发现之前的代码实现A-Z的排列是一个一个写的,就想是不是应该有一个自动排列的,查了一下php函数,前辈已经替我们想到了,就是range()函数。$range=range(‘A’,’Z’);$range为A-Z的数组。                                                                   另:$number = range(0,50,10);$number为包含 “0” 至 “50” 之间并以 10 递增的元素的数组