努力思考 + 实践, 眼高手低是不行的. 注册 | 登陆
浏览模式: 标准 | 列表分类:原创丨PHP笔记

[置顶] 资料备忘,保持更新。

SVN trunk, branches and tags

翻译者:zwws
原 文:
SVN trunk, branches and tags
译 言:http://article.yeeyan.org/view/132319/81358
转载请注明原链接,谢谢。

因水平所限,如果翻译得和原文有差,敬请评论指正。

  在本篇文章中, 我将会详细说明我是如何应用SVN trunk(树干)、branches(分支)和tags(标记)。这种方法同样被称为“branch always”,两者非常接近。可能我所介绍的并不是最好的方法,但是它会给新手一些解释说明,告诉他们trunk、branches和tags是什么,并且该如何去应用它们。

  当然,如果本文有些要点需要澄清/确认,亦或者有一些错误的观点,还请你评论,自由发表自己的观点。

——简单的对比

  SVN的工作机制在某种程度上就像一颗正在生长的树:

  • 一棵有树干和许多分支的树
  • 分支从树干生长出来,并且细的分支从相对较粗的树干中长出
  • 一棵树可以只有树干没有分支(但是这种情况不会持续很久,随着树的成长,肯定会有分支啦,^^)
  • 一颗没有树干但是有很多分支的树看起来更像是地板上的一捆树枝
  • 如果树干患病了,最终分支也会受到影响,然后整棵树就会死亡
  • 如果分支患病了,你可以剪掉它,然后其他分支还会生长出来的哦!
  • 如果分支生长太快了,对于树干它可能会非常沉重,最后整棵树会垮塌掉
  • 当你感觉你的树、树干或者是分支看起来很漂亮的时候,你可以给它照张相,这样就就可以记得它在那时是多么的赞。

——Trunk

  Trunk是放置稳定代码的主要环境,就好像一个汽车工厂,负责将成品的汽车零件组装在一起。

  以下内容将告诉你如何使用SVN trunk:

  • 除非你必须处理一些容易且能迅速解决的BUG,或者你必须添加一些无关逻辑的文件(比如媒体文件:图像,视频,CSS等等),否则永远不要在trunk直接做开发
  • 不要因为特殊的需求而去对先前的版本做太大的改变,如何相关的情况都意味着需要建立一个branch(如下所述)
  • 不要提交一些可能破坏trunk的内容,例如从branch合并
  • 如果你在某些时候偶然间破坏了trunk,bring some cake the next day (”with great responsibilities come… huge cakes”)

——Branches

  一个branch就是从一个SVN仓库中的子树所作的一份普通拷贝。通常情况它的工作类似与UNIX系统上的符号链接,但是你一旦在一个SVN branch里修改了一些文件,并且这些被修改的文件从拷贝过来的源文件独立发展,就不能这么认为了。当一个branch完成了,并且认为它足够稳定的时候,它必须合并回它原来的拷贝的地方,也就是说:如果原来是从trunk中拷贝的,就应该回到trunk去,或者合并回它原来拷贝的父级branch。

  以下内容将告诉你如何使用SVN branches:

  • 如果你需要修改你的应用程序,或者为它开发一个新的特性,请从trunk中创建一个新的branch,然后基于这个新的分支进行开发
  • 除非是因为必须从一个branch中创建一个新的子branch,否则新的branch必须从trunk创建
  • 当你创建了一个新branch,你应当立即切换过去。如果你没有这么做,那你为什么要在最初的地方创建这个分支呢?

——Tags

  从表面上看,SVN branches和SVN tags没有什么差别,但是从概念上来说,它们有许多差别。其实一个SVN tags就是上文所述的“为这棵树照张相”:一个trunk或者一个branch修订版的命名快照。

  以下内容将告诉你如何使用SVN tags:

  • 作为一个开发者,永远不要切换至、取出,或者向一个SVN tag提交任何内容:一个tag好比某种“照片”,并不是实实在在的东西,tags只可读,不可写。
  • 在特殊或者需要特别注意的环境中,如:生产环境(production)、?(staging)、测试环境(testing)等等,只能从一个修复过的(fixed)tag中checkout和update,永远不要commit至一个tag。
  • 对于上述提及到的环境,可以创建如下的tags:“production”,“staging”,“testing”等等。你也可以根据软件版本、项目的成熟程度来命名tag:“1.0.3”,“stable”,“latest”等等。
  • 当trunk已经稳定,并且可以对外发布,也要相应地重新创建tags,然后再更新相关的环境(production, staging, etc)

——工作流样例

  假设你必须添加了一个特性至一个项目,且这个项目是受版本控制的,你差不多需要完成如下几个步骤:

  1. 使用SVN checkout或者SVN switch从这个项目的trunk获得一个新的工作拷贝(branch)
  2. 使用SVN切换至新的branch
  3. 完成新特性的开发(当然,要做足够的测试,包括在开始编码前)
  4. 一旦这个特性完成并且稳定(已提交),并经过你的同事们确认,切换至trunk
  5. 合并你的分支至你的工作拷贝(trunk),并且解决一系列的冲突
  6. 重新检查合并后的代码
  7. 如果可能的话,麻烦你的同事对你所编写、更改的代码进行一次复查(review)
  8. 提交合并后的工作拷贝至trunk
  9. 如果某些部署需要特殊的环境(生成环境等等),请更新相关的tag至你刚刚提交到trunk的修订版本
  10. 使用SVN update部署至相关环境

Tags: svn, 翻译

Nginx(PHP/FastCGI)的PATH_INFO问题补充

注: 本文是 http://www.laruence.com/2009/11/13/1138.html 的补充.  
仅为解决使用上文配置PATH_INFO后, 当请求的URI为"<script>/"的情况下PATH_INFO为"/index.php"的问题, 使nginx下的PAHT_INFO表现与Apache一致.
 
如: 访问 "http://localhost/p.php/" 输出的PATH_INFO为"/index.php"  
 
    location ~ \.php($|/) {  
        root           D:/WWW/Localhost;  
        fastcgi_pass   127.0.0.1:9000;  
        fastcgi_index  index.php;  
 
        set $script    $uri;  
        set $path_info "";  
        if ($uri ~ "^(.+\.php)(/.*)") {  
            set  $script     $1;  
            set  $path_info  $2;  
        }  
  
        fastcgi_param SCRIPT_FILENAME $document_root$script;  
        fastcgi_param SCRIPT_NAME $script;  
        fastcgi_param PATH_INFO $path_info;  
 
        include        fastcgi_params;  
    }  
 
参考文档: http://wiki.nginx.org/NginxSymfony, 有细微修改

Tags: nginx, fastcgi

守护进程删除smarty的缓存文件(注释版)

原文: 鸭嘴的Blog

偶参阅了网上资料加了注释.

详见全文

» 阅读全文

Tags: php, pcntl_fork

PHP 输出缓存一二

PHP中的output_buffering可以堆砌, 即可以多次调用ob_start()以开启缓冲区,具体参照手册中ob_start()的介绍,相关摘录如下:

Output buffers are stackable, that is, you may call ob_start() while another ob_start() is active. Just make sure that you call ob_end_flush() the appropriate number of times. If multiple output callback functions are active, output is being filtered sequentially through each of them in nesting order.

php.ini中的output_buffering不为Off时, 会自动开启一个缓冲区(等同于调用一次ob_start()), 如果为数值, 即为缓冲区的缺省大小.

ob_get_contents()在未开启缓冲区的情况下调用不报错, 返回false.而ob_end_clean()以及相类似操作会报告Notice级别错误, 告知未开启缓冲区. 

使用位运算来实现PHP权限控制

原理: 将每个二进制位为一个权限标识位

  • 增加权限使用 | (无论存在与否, 将对应的权限位置1)
  • 删除权限使用 ^& ~ (无论存在与否, 将对应的权限位置0)
  • 判断权限使用 & (使用与判断对应的权限位是否为1, 是, 返回非0; 不是, 返回0)
http://xiaobin.net/archives/8/
http://www.lizhijin.com/view.php/PHP/140.html
http://topic.csdn.net/u/20090421/23/25ff3c5c-8bd1-4899-a05e-ecac2bad36e6.html (算法与前两则不同)

设计模式原则笔记

单一职责原则 SRP (Single Reponsibility Principle)

就一个类而言,应该仅有一个引起它变化的原因。 软件设计真正要做的许多内容,就是发现原则并把那些原则相互分离。如果多余一个动机去改变一个类,那么这个类就具有多余的一个职责,这时候就应该考虑类的职责分离。

开放封闭原则 OCP (Open-Colosed Principle)

软件实体(类、模块、函数)应该是可以扩展的,但是不可修改。就是对扩展开放,对修改关闭。通过构建抽象来隔离变化(譬如策略模式)。

依赖倒转原则 DIP (Dependence Inversion Principle)

抽象不应该依赖于细节,细节应该依赖于抽象;高层不应该依赖于低层,低层应该依赖于高层。即针对接口编程,不要针对实现编程。抽象的东西是最稳定 的,我们依赖的就是它的稳定。 编写的过程中应该考虑如何针对抽象编程,而不是针对细节编程,即程序中所有的依赖关系都终止于抽象类或者接口,那就是面向对象设计,反正就是过程化设计 了。 (终止指的是具体实现类的形态已经依赖于抽象类)

里氏代换原则 LSP (Liskov Substitution Principle)

子类型必须能够替代其父类型。即,在软件里面,把父类都替换成他的子类,程序行为没有发生变化。 有了里氏代换原则,才能使继承复用成为可能,只有当子类可以替换掉父类时,软件的功能不受影响,父类才能真正被复用,而子类也能在父类的基础上增加新的行 为。 有了里氏代换原则,才能使开放-封闭成为可能,正是由于子类型的可替换性才使得父类型的模块在无需修改的情况下扩展。

接口隔离原则 ISP (Interface Segregation Principle)

不应该强迫客户依赖于他们不用的方法。接口属于客户,不属于它所在的类层次结构。 通俗的说法:不要强迫用户使用他们不使用的方法,否则这些客户就会面临由于不使用的这些方法的改变所带来的改变。

参考下图的设计,在这个设计里,取款、存款、转帐都使用一个通用界面接口,也就是说,每一个类都被强迫依赖了另两个类的接口方法,那么每个类有可能因为另外两个类的方法(跟自己无关)而被影响。拿取款来说,它根本不关心“存款操作”和“转帐操作”,可是它却要受到这两个方法的变化的影响。

大小: 24.6 K
尺寸: 365 x 500
浏览: 38 次
点击打开新窗口浏览全图

那么我们该如何解决这个问题呢?参考下图的设计,为每个类都单独设计专门的操作接口,使得它们只依赖于它们关系的方法,这样就不会互相影了!

大小: 37.24 K
尺寸: 314 x 500
浏览: 31 次
点击打开新窗口浏览全图

实现方法:1、使用委托分离接口;2、使用多重继承分离接口

迪米特原则 LoD(Law of Demeter)、LKP(Least Knowledge Principle)

如果两个类彼此间不直接通信,那么这两个类就不应当发生直接的相互作用。如果其中一个类要调用另一个类的某个方法的话,可以通过第三方转发这个调用。 强调:在类的结构设计上,每一个类都应该尽量降低成员的访问权限;类之间的耦合越弱,越利于复用,一个处于弱耦合的类被修改,不会对有关系的类造成波及。

合成/聚合复用原则 CARP (Composite/Aggregate Reuse Principle)

在一个新的对象里面使用一些已有的对象,使之成为新对象的一部分。新对象通过向这些对象的委派达到复用已有功能的目的。

参考资料:
http://www.blogjava.net/totobacoo/articles/138227.html
http://www.cnblogs.com/feipeng/archive/2007/03/02/661840.html

Tags: 设计模式, 笔记

使用NetBeans + Xdebug调试PHP程序[总结]

转载请注明出处: http://www.zvv.cn/blog/show-101-1.html

  前些天发现通过Notepad++的DBGP插件结合PHP的xdebug扩展可以实现PHP文件调试,同时,介绍说包含了单步调试、监视变量还有跨 文件调试。按照网络上的资料配置好调试环境后实际试用了发现功能较为简陋,单文件调试还可,如果是跨文件调试项目就不那么舒服了,试用过程中因为DBGP 插件也存在许多缺陷,烦恼不断,经常性地stack overflow,很是遗憾。后来想想Np++只是Editor,不要对它强求过多,插件的版本也比较低,存在许多BUG也是可以理解的,等它慢慢完善再 说吧,开源社区的力量可是很强大的,^^。
昨晚在坛里某位同志的博文里再次见到了NetBeans这个熟悉的字眼(之前选开发环境的时候因为NB 非常强大,功能设置很人性化,界面非常友好,又有非常强的自动完成功能,都差不多就要定它了,可是因为当时不懂有xdebug,所以没搞懂怎么调试,就继 续用着EP Ctrl+B“调试”程序了),就用加上“xdebug”google了一下发现NB调试功能就是通过其实现的,而且功能齐全,评价不错,哈哈,大大的惊 喜,因为太晚了怕影响舍友休息,就决定次日来搞掂它。
……

  今天和MM溜达回来后,折腾一番,现将配置过程整理如下:

详见全文

» 阅读全文

Tags: netbeans, xdebug

Records:19123