Centos svn搭建

 你看到的这个文章来自于http://www.cnblogs.com/ayanmw
 
 基本的安装包有: subversion httpd/ svn的httpd的mod_dav_svn mod_authz_svn 两个模块.(yum install mod_dav_svn subversion httpd )
 
 svn的服务形式应该是有两种: 1 通过svnserve建立的 通过svn://ip:port 端口默认是3690,这种形式; 2 通过apache httpd或者其他的web服务器的扩展模块,进行svn管理
 
 对于svnserve,通过svnserve var/www/svn 这种形式建立 daemon的后台进程,但是结束要 kill `pgrep svnserve` 这种形式 来kill掉,不知道有没有直接的比如 stop的方式.
 
 通过http服务器来管理svn也很不错,可以很方便的浏览.其配置过程如下(首先几个软件都安装,这就不用说了.):
 
 1.在 /etc/httpd/module下面 有两个 mod 关于 svn的.
 
 2.在/etc/httpd/config.d/下有一个subversion.conf(没有就建立一个),其内容是: 

LoadModule dav_module         modules/mod_dav.so
LoadModule dav_svn_module     modules/mod_dav_svn.so
<Location /svn>
         DAV svn
         SVNPath /var/www/svn/
         AuthType Basic
         AuthName "Subversion repos"
         AuthUserFile /var/www/svn/repos1/conf/passwd
         Require valid-user
 </Location>
# To create a new repository "http://localhost/repos/stuff" using
# this configuration, run as root:
#
#   # cd /var/www/svn
#   # svnadmin create stuff
#   # chown -R apache.apache stuff
#   # chcon -R -t httpd_sys_content_t stuff
 
#<Location /repos>
#   DAV svn
#   SVNParentPath /var/www/svn
#
#   # Limit write permission to list of valid users.
#   <LimitExcept GET PROPFIND OPTIONS REPORT>
#      # Require SSL connection for password protection.
#      # SSLRequireSSL
#
#      AuthType Basic
#      AuthName "Authorization Realm"
#      AuthUserFile /path/to/passwdfile
#      Require valid-user
#   </LimitExcept>
#</Location>

 

 其中/var/www/svn是准备放仓库的目录,这个目录可以放置多个代码仓库,AuthUserFile就是用户和密码的文件,也可以移动到其他地方单独管理.
 
 /var/www/svn 下面可以通过 svnadmin createa /var/www/svn/repos1 来建立一个空的仓库.还可以建立多个仓库;这个目录貌似最好 给apche用户所有权限:chown -R apache.apache /var/www/svn ;在repos1/conf目录下可以进行一些账号密码 配置,就不多说了.建立的其他仓库 可以拷贝这些conf文件
  

其中AuthUserFile 是如何制作的呢?

其中ar/www/svn是准备放仓库的目录,这个目录可以放置多个代码仓库,AuthUserFile就是用户和密码的文件,也可以移动到其他地方单独管理.

ar/www/svn 下面可以通过 svnadmin createa ar/www/svn/repos1 来建立一个空的仓库.还可以建立多个仓库;这个目录貌似最好 给apche用户所有权限:chown -R apache.apache ar/www/svn ;在repos1/conf目录下可以进行一些账号密码 配置,就不多说了.建立的其他仓库 可以拷贝这些conf文件

其中AuthUserFile 是如何制作的呢?

下面就是一个示例,创建两个用户 a b,密码 aaa,bbb,再删除。查看密码文件内容:

[root@src-server websvn]# htpasswd accesspwd a
htpasswd: cannot modify file accesspwd; use '-c' to create it
[root@src-server websvn]# htpasswd -c accesspwd a
New password:
Re-type new password:
Adding password for user a
[root@src-server websvn]# ll accesspwd
-rw-r--r-- 1 root root 16 Jun 23 02:03 accesspwd
[root@src-server websvn]# htpasswd accesspwd b
New password:
Re-type new password:
Adding password for user b
[root@src-server websvn]# cat accesspwd
a:wpEqdKjINQsvM
b:JEpHUbhZZP3fc
[root@src-server websvn]# htpasswd -D accesspwd b
Deleting password for user b
[root@src-server websvn]# cat accesspwd
a:wpEqdKjINQsvM
[root@src-server websvn]#

3. sudo service httpd restart 重启httpd apache 服务. 貌似很简单呢..回来再整理下svn的命令 补充.

 

然后通过 http://IP/svn/repos1可以访问这个仓库,可以建立多个仓库同时访问.不过直接访问 IP/svn 无法列出仓库的列表,apache显示 "forbidden \n You don't have permission to access /svn on this server"

 

 

 

对于一些svn的web管理程序也有,比如ViewVC 还有一些其他的管理svn的web程序,最好可以在web端创建仓库、权限管理就好了。目前寻找这样的svn web管理程序中。

 

CentOS 安装websvn直接yum即可,不需要配置mysql,只需要php的支持即可。

 

查看websvn的包文件


 下面就是vim /etc/websvn/config.php,其实这个文件就是/usr/websvn/include/config.php,只是做了一个链接到etc目录,这种方法对于这种需要配置的web程序来说,还真是方便。

[root@src-server ~]# ll /etc/websvn/config.php
-rw-r--r-- 1 root root 21210 Jun 24 18:48 /etc/websvn/config.php
[root@src-server ~]# ll /usr/share/websvn/include/config.php
lrwxrwxrwx 1 root root 33 Jun 23 01:01 /usr/share/websvn/include/config.php -> ../../../../etc/websvn/config.php
[root@src-server ~]#

 

 这里需要修改的配置选项有:
 
  $config->parentPath('/srv/svn/');
 
  $config->useMultiViews();
 
  ############ $config->useAuthenticationFile('/srv/svn/passwd');#这里是因为我 不知道如何在websvn上登录我的账号
 
   $config->setBlockRobots();#防止搜索程序收录
 
  $config->expandTabsBy(4);#默认的8 似乎并不适合我的习惯
 
  $config->useEnscript();##语法高亮 建议安装GNU Enscript高亮显示程序包,官方下载:http://www.iki.fi/~mtr/genscript/
 
  #  关于编码 我不知道如何设置,SetInputEncoding 对于我的websvn-2.3.3不起作用,反而websvn出现500错误。
 
  修改/etc/httpd/conf.d/websvn.conf 添加基本权限认证

这里需要修改的配置选项有:

$config->parentPath('/srv/svn/');

$config->useMultiViews();

############ $config->useAuthenticationFile('/srv/svn/passwd');#这里是因为我 不知道如何在websvn上登录我的账号

 $config->setBlockRobots();#防止搜索程序收录

$config->expandTabsBy(4);#默认的8 似乎并不适合我的习惯

$config->useEnscript();##语法高亮 建议安装GNU Enscript高亮显示程序包,官方下载:http://www.iki.fi/~mtr/genscript/

#  关于编码 我不知道如何设置,SetInputEncoding 对于我的websvn-2.3.3不起作用,反而websvn出现500错误。

修改/etctpd/conf.d/websvn.conf 添加基本权限认证

 

贴着主体 随屏幕滚动

<div class="feedback">
    <div class="fb-item fb-qq">
     <span class="fb-text" style="top: 0px; overflow: hidden; left: 0px; width: 36px;">联系客服</span>
     <span class="fb-ico"></span>
    </div>
    <div class="fb-item fb-phone">
     <span class="fb-text" style="overflow: hidden; left: 0px; width: 36px;">联系电话</span>
     <span class="fb-ico"></span>
    </div>
    <div class="fb-item fb-suggestion">
        <span class="fb-text" style="overflow: hidden; left: 0px; width: 36px;">意见建议</span>
        <span class="fb-ico"></span>
    </div>
</div>

<style>
.feedback {
 position: fixed;
 _position: absolute;
 z-index: 9999;
 top: 50%;
 left: 50%;
 right: -106px;
 width: 36px;
 height: 111px;
 margin: -48px 0 0 480px
}

.feedback .fb-item {
 position: absolute;
 width: 36px;
 height: 36px;
 font-size: 14px;
 line-height: 36px;
 color: #fff
}

.feedback .fb-item .fb-text {
 display: block;
 position: absolute;
 left: 0;
 top: 1px;
 overflow: hidden;
 width: 36px;
 height: 36px;
 background: #74b3fb;
 text-align: center;
 cursor: pointer
}

.feedback .fb-item .fb-ico {
 display: block;
 position: absolute;
 top: 0;
 right: 0;
 width: 36px;
 height: 36px;
 background: #74b3fb url(/img/feedback-sprite.png?_t_=1415611922375) no-repeat;
 _background-image: url(/img/feedback-sprite.gif?_t_=1415611922375);
 cursor: pointer
}

.feedback .fb-item a {
 text-decoration: none;
 color: #fff
}

.feedback .fb-qq {
 top: 0
}

.feedback .fb-qq .fb-ico {
 border-bottom: 1px solid #55a4ff;
 background-position: center 7px
}

.feedback .fb-phone {
 top: 37px
}

.feedback .fb-phone .fb-text {
 cursor: default
}

.feedback .fb-phone .fb-ico {
 border-top: 1px solid #74b3fb;
 border-bottom: 1px solid #55a4ff;
 background-position: center -28px;
 cursor: default
}

.feedback .fb-suggestion {
 top: 75px
}

.feedback .fb-suggestion .fb-ico {
 border-top: 1px solid #74b3fb;
 background-position: center -62px
}

html {
 *overflow-x: hidden
}
</style>

PHP设计模式-单例模式

    经过良好设计的系统一般通过方法调用来传递关系实例,每个类都会与背景环境保持独立,并通过清晰的通信方式来与系统中其他部分进行写作。

     假如我们需要一个类来保存系统信息,我们要保证系统中的所有对象都使用同一个 1.系统信息对象应该被系统中的任何对象使用

2.系统对象不应该会被存储在会被复写的全局变量中

3.系统中不应该超过一个系统信息对象,也就是说Y对象可以设置系统对象的一个属性,而Z对象不需要通过其他对象就能直接获得该属性的值

 

下面创建一个无法从外部实例化的类:

class Preferences{
    private $props = array();
    private function __construct(){}

    public function setProperty($key, $val){
        $this->props[$key] = $val;
    }

    public function getProperty($key){
        return $this->props[$key];
    }
}

    当然,目前的Preferences是完全不能用的,我们设置了一个不合常理的限制,构造函数被生命为private, 客户端无法实例化对象。

    不过我们可以使用静态方法和静态属性来实例化对象。

class Preferences{
    private $props = array();
    private static $instance;

    private function __construct(){}

    public static function getInstance(){
        if(empty(self::$instance)){
            self::instance = new Perference();
        }
        return self::$instance;
    }

    public function setProperty($key, $val){
        $this->props[$key] = $val;
    }

    public function getProperty($key){
        return $this->props[$key];
    }
}

instance 内部被设置为private以及static,因此不能被从类外部进行访问。而getinstance是public static的可以在脚本的任何地方进行调用。

$pref = Preferences::getInstance();
$pref -> SetProperty('name','matt');

unset($pref);//移除引用

$pref2 = Preferences::getInstance();
print $pref2->getProperty("name")."\n"; //该属性值没有丢失

输出matt

 

    静态方法不能访问普通的对象属性,应为根据静态定义,它只能被类而不是对象调用。但是静态方法可以访问一个静态属性所以当getInstance被调用时,我们会检查Preferences::$instance属性,如果为空,那么创建一个Preferences对象实例并把它保存在$instance属性中,然后我们把实例返回给调用代码。因为getInstance()是Perferences类的一部分,所以尽管构造函数是私有的,但是实例化Perferences对象完全没有问题。

 

    单例模式适用于代替全局变量使用,单例在itong任何地方都可以被访问,所以它可能会导致很难调试的依赖关系。如果改变一个单例,那么所有使用该单例的类都会受到影响。

 

    1。单例模式防止其它对象对自己的实例化,确保所有的对象都访问一个实例。

    2。
因为由类自己来控制实例化进程,类就在改变实例化进程上有相应的伸缩性。

—————————————————————————————————————————————

在JAVA里的单例



因为你每做一次数据库的操作,都必须创建一个session, 这时候用单例模式是最好的,每次都只是同一个实例,就不会象上面那样出错啦 

这个是为了节省资源吧。。

 

  最常见的要数DB类了。几乎所有的PHP框架都是这个套路