读写网记者与PHP的创造者Rasmus Lerdorf联系,询问他对Facebook刚刚开源的PHP优化项目HipHop有何看法。Lerdorf在邮件中说,这是一个很酷的项目,肯定会成为某些网站很好的选择。
但是,他接下来说,对于许多Web应用来说,执行速度并不是主要因素。即使将总请求成本中10%的代码的执行速度提高一倍,整体上也只提高了5%。如果每次请求都要访问memcache/PostgreSQL/MySQL 10次,在系统调用上耗费大量时间,难免不要指望HipHop会带来奇迹。
Lerdorf称HipHop代码转换程序为漂亮把戏(nifty trick),并担心会有开发人员将它错误地看成网站性能的某种魔弹。对于新的运行库,Lerdorf说,更愿意大家进行基本的性能分析(profiling),找到有用中成本最高的部分。与其加速系统中较快的部分,不如加速或者去除系统中较慢的部分。
他还说,PHP的执行速度往往不是问题最大的地方,应该好好分析系统的各个方面,找到元凶。工具方面,他推荐用Yahoo的YSlow和 Google的Page Speed分析前端的问题,再用Valgrind的Callgrind分析低层的后端性能,用XDebug分析用户空间PHP的性能。此外,他还顺带手指出了读写网前端的性能问题。
当然,文章中也说到,Facebook的网站其他方面可能已经优化得很好,因此HipHop能够带来足够的效率。
总之还是那句话,没有防之四海而皆准的通用银弹,工程上,具体问题具体分析,选择最合适当前环境的工具最为重要。
但是,他接下来说,对于许多Web应用来说,执行速度并不是主要因素。即使将总请求成本中10%的代码的执行速度提高一倍,整体上也只提高了5%。如果每次请求都要访问memcache/PostgreSQL/MySQL 10次,在系统调用上耗费大量时间,难免不要指望HipHop会带来奇迹。
Lerdorf称HipHop代码转换程序为漂亮把戏(nifty trick),并担心会有开发人员将它错误地看成网站性能的某种魔弹。对于新的运行库,Lerdorf说,更愿意大家进行基本的性能分析(profiling),找到有用中成本最高的部分。与其加速系统中较快的部分,不如加速或者去除系统中较慢的部分。
他还说,PHP的执行速度往往不是问题最大的地方,应该好好分析系统的各个方面,找到元凶。工具方面,他推荐用Yahoo的YSlow和 Google的Page Speed分析前端的问题,再用Valgrind的Callgrind分析低层的后端性能,用XDebug分析用户空间PHP的性能。此外,他还顺带手指出了读写网前端的性能问题。
当然,文章中也说到,Facebook的网站其他方面可能已经优化得很好,因此HipHop能够带来足够的效率。
总之还是那句话,没有防之四海而皆准的通用银弹,工程上,具体问题具体分析,选择最合适当前环境的工具最为重要。
腾讯bond兄弟的建议:
<div class="txt">
翻页代码 1,2,3...下一页
</div>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cntv的页面构建师,在每一个行(一行里如有6个图,图下有文字)加上一个清浮动的Div【<div class="clear"></div>】,这个clear对应清浮动的样式如下:
.clear{clear:both;overflow:hidden;display:block;height:0;font-size:0;}
---------------------------------------------------------------------------------------------------------------------------------------------
float 是 css 的定位属性。在传统的印刷布局中,文本可以按照需要围绕图片。一般把这种方式称为“文本环绕”。在网页设计中,应用了CSS的float属性的页面元素就像在印刷布局里面的被文字包围的图片一样。浮动的元素仍然是网页流的一部分。这与使用绝对 定位的页面元素相比是一个明显的不同。绝对定位的页面元素被从网页流里面移除了,就像印刷布局里面的文本框被设置为无视页面环绕一样。绝对定位的元素不会 影响其它元素,其它元素也不会影响它,无论它是否和其它元素挨着。
印刷布局中的“文本框被设置为无视页面环绕”指的是文本框的内容不会受到页面其他元素的影响,也不会在页面中自动换行。这种设置通常用在一些特殊的排版需求中,比如表格、图表或者注释。
印刷布局里面的文本框被设置为无视页面环绕,这话怎么理解,请解释下它后面的背景知识:
背景知识
页面环绕:在印刷排版中,文本内容会根据页面的边界、图像、表格等元素进行自动换行和调整,以使内容能够适应页面的布局。这种机制被称为“页面环绕”或“文本环绕”。
无视页面环绕:当文本框被设置为无视页面环绕时,它的内容将会保持在一个单独的框内,不会因为页面边界或者其他元素的存在而进行换行或调整。这通常用于需要精确控制内容布局的场景,比如:
表格:表格的每一行和每一列都需要精确对齐,不能因为页面的边界而改变其结构。
图表:图表中的数据和图形需要保持固定的相对位置,避免因为页面布局变化而影响其显示效果。
注释:注释内容有时需要放在特定的位置,以便读者能够轻松找到和理解。
像这样在一个元素上用CSS设置浮动:
#sidebar { float: right; }
fload属性有四个可用的值:Left 和Right 分别浮动元素到各自的方向,None (默认的) 使元素不浮动,Inherit 将会从父级元素获取float值。
清除Float
清除(clear)是浮动(float)的相关属性.一个设置了清除Float的元素不会如浮动所设置的一样,向上移动到Float元素的边界,而是会忽视浮动向下移动。如下,一图顶千言。
上例中,侧栏向右浮动,并且短于主内容区域。页脚(footer)于是按浮动所要求的向上跳到了可能的空间。要解决这个问题,可以在页脚(footer)上清除浮动,以使页脚(footer)待在浮动元素的下面。
#footer { clear: both; }
清除(clear)也有4个可能值。最常用的是 both,清楚左右两边的浮动。left 和 right 只能清楚一个方向的浮动。none 是默认值,只在需要移除已指定的清除值时用到。inherit 应该时第五个值,不过很奇怪的是 IE 不支持(这个不奇怪吧,IE 从来都这么特立独行吧 -糖伴西红柿注)。只清除左边或右边的浮动,实际中很少见,不过绝对有他们的用处。
http://www.cnblogs.com/zhujl/archive/2012/05/08/2489440.html
http://paranimage.com/css-float-attribute/
使用浮动(float)的一个比较疑惑的事情是他们怎么影响包含他们的父元素的。如果父元素只包含浮动元素,那么它的高度就会塌缩为零。如果父元素不包含任何的可见背景,这个问题会很难被注意到,但是这是一个很重要的问题
估计Bond的来源摘录(http://paranimage.com/css-float-attribute/):
简单清除方法使用了一个聪明的 css 伪选择符(:after)来清除浮动。比起在父元素上设置 overflow,只需要给它增加一个额外的类似于”clearfix”的类。这个类使用如下 css:
.clearfix:after {
content: ".";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
这会在清除浮动的父元素之后应用一点看不见的内容。这不是全部内容,还需要一些额外的代码来适应那些老旧的浏览器。
-------------------------------------------------------------------------------------------------------------
INTRO: 在写页面的过程中经常要遇到清除浮动的情况,这里总结了一下几种常用的清楚浮动的方法。
CATEGORY: 网站前端
TAGS: clear, css
在使用float进行页面布局时,经常遇到有需要清除浮动的地方。通常情况下,只需要在下一个元素上添加clear样式,就可以达到清除浮动的效果了。
clear:left – 清除所有向左的浮动;
clear:right – 清除所有向右的浮动;
clear:both – 清除所有浮动;
clear:none – (默认)不清除浮动。
但是这种方式使得元素样式有一点乱,在以后进行页面修改时,会找不到在哪个元素清了浮动;或者在添加了一些元素以后,原有的冗余样式没有清理。
所以比较简单的办法是设一个clear样式:
.clear{clear:both;}
在需要清除浮动的元素上统一加上clear类,这样以后在修改代码时比较容易看到是哪些元素上使用了清除浮动。
对于一般的情况,这样也就足够了,但是总有一些特殊的时候。
这样一个例子:
<div id="content">
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>
</div>
<div id="sidebar"></div>
这种情况下,如果在下一个元素上清浮动,就得在id为sidebar的div上加clear了,这样有些脱离了原本清除浮动的语义。是类名为box的div需要清除浮动,而不是id名为content的div需要清浮动。为了还原clear的本意。这里需要在类名为right的div后面加一个无意义元素。
如<p class=”clear”></p>
这么做的缺点也很明显,就是使得页面的html结构中多了一个无意义的元素p。
为了避免这种情况,这里还有两种新的清除浮动的方法。
方法一:利用overflow属性达到清除浮动的效果。
在需要清除浮动的元素,这里的例子中需要清浮动的元素是类名为box的div元素,给这个元素加上以下CSS语句。
.box{
overflow:auto;
zoom:1;
}
方法二:利用:after伪类来清除浮动。
新建一个类,取名为clearboth,在需要清除浮动的元素上使用。修改例子中的html代码:
1
<div class="box clearboth">
.clearboth:after {content: "";display: block;height: 0;clear: both;}
.clearboth { *zoom : 1; } // for IE 6.
我写的测试代码:
++++++++++++++++++以下说得很详细很有操作性+++++++++++++++++++++++++++++
自己对下面这一段做实践Ok的再次体会,为此也贴上:http://blog.csdn.net/cjxtfxs/article/details/6328185
在CSS中我们会经常要用到“清除浮动”Clear,比较典型的就是clear:both;
CSS手册上是这样说明的:该属性的值指出了不允许有浮动对象的边。这个属性是用来控制float属性在文档流的物理位置的。
当属性设置float(浮动)时,其所在的物理位置已经脱离文档流了,但是大多时候我们希望文档流能识别float(浮动),或者是希望float(浮动)后面的元素不被float(浮动)所影响,这个时候我们就需要用clear:both;来清除。
比如:
<p style="float:left;width:200px;">这个是第1列,</p>
<p style="float:right;width:400px;">这个是第2列,</p>
<p>这个是第3列。</p>
如果不用清除浮动,那么第3列文字就会和第1、2列文字在一起 ,所以我们在第3个这列加一个清除浮动 clear:both;
<p style="float:left;width:200px;">这个是第1列,</p>
<p style="float:left;width:400px;">这个是第2列,</p>
<p style="clear:left;">这个是第3列。</p>
通常,我们往往会将“清除浮动”单独定义一个CSS样式,如:
.clear {
clear: both;
}
然后使用<div class="clear"></div>来专门进行“清除浮动”。
不过也有不赞同意见是,<div class="clear"></div>可以不写,直接在下层清除就可以了。
比如本来好好的
<p style="float:left;width:200px;">这个是第1列,</p>
<p style="float:left;width:400px;">这个是第2列,</p>
<p style="clear:both;">这个是第3列。</p>
非要整成
<p style="float:left;width:200px;">这个是第1列,</p>
<p style="float:left;width:400px;">这个是第2列,</p>
<div class="clear"></div>
<p>这个是第3列。</p>
这点看来,<div class="clear"></div>确实不需要写。
不过很显然,我们在网页设计时还有一种很普遍的情况:
<style type="text/css">
#main {background-color: #3399CC;width: 600px;padding: 20px;}
#sidebar {background-color: #FF6600; float: left;width: 130px;}
#container {float: right;width: 420px;background-color: #FFFF33;}
</style>
<div id="main">
<div id="sidebar">第一段内容 第一段内容 第一段内容</div>
<div id="container">第二段内容 第二段内容 第二段内容</div>
</div>
<p style="clear:both;">第三段内容</p>
该页面测试在IE下效果正合所要:蓝色块内部有红色和黄色两个色块内容,同时在蓝色块以下是第三段文本。
不过FF的效果可不是这样的。我们不能单单想在下一层清除就能完成我们的工作,我们必须在浮动元素所在标签闭合之前及时进行“清除”。
<style type="text/css">
#main {background-color: #3399CC;width: 600px;padding: 20px;}
#sidebar {background-color: #FF6600; float: left;width: 130px;}
#container {float: right;width: 420px;background-color: #FFFF33;}
.clear {clear: both;}
</style>
<div id="main">
<div id="sidebar">第一段内容 第一段内容 第一段内容</div>
<div id="container">第二段内容 第二段内容 第二段内容</div>
<div class="clear"></div>
</div>
<p>第三段内容</p>
对于因多加的<div class="clear"></div>标签会引起IE和FF高度变化,通过如下方法解决:
.clear {
clear: both;
height:1px;
margin-top:-1px;
overflow:hidden;
}
.clear-class:after{content:".";display:block;height:0;clear:both;visibility:hidden;}
.clear-class{zoom:1;display:block;}
.clear-class{zoom:1;display:block;}
<ul class="clear-class txt">
<li class="liclass">
</li>
</ul>
<li class="liclass">
</li>
</ul>
<div class="txt">
翻页代码 1,2,3...下一页
</div>
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
cntv的页面构建师,在每一个行(一行里如有6个图,图下有文字)加上一个清浮动的Div【<div class="clear"></div>】,这个clear对应清浮动的样式如下:
.clear{clear:both;overflow:hidden;display:block;height:0;font-size:0;}
---------------------------------------------------------------------------------------------------------------------------------------------
float 是 css 的定位属性。在传统的印刷布局中,文本可以按照需要围绕图片。一般把这种方式称为“文本环绕”。在网页设计中,应用了CSS的float属性的页面元素就像在印刷布局里面的被文字包围的图片一样。浮动的元素仍然是网页流的一部分。这与使用绝对 定位的页面元素相比是一个明显的不同。绝对定位的页面元素被从网页流里面移除了,就像印刷布局里面的文本框被设置为无视页面环绕一样。绝对定位的元素不会 影响其它元素,其它元素也不会影响它,无论它是否和其它元素挨着。
印刷布局中的“文本框被设置为无视页面环绕”指的是文本框的内容不会受到页面其他元素的影响,也不会在页面中自动换行。这种设置通常用在一些特殊的排版需求中,比如表格、图表或者注释。
印刷布局里面的文本框被设置为无视页面环绕,这话怎么理解,请解释下它后面的背景知识:
背景知识
页面环绕:在印刷排版中,文本内容会根据页面的边界、图像、表格等元素进行自动换行和调整,以使内容能够适应页面的布局。这种机制被称为“页面环绕”或“文本环绕”。
无视页面环绕:当文本框被设置为无视页面环绕时,它的内容将会保持在一个单独的框内,不会因为页面边界或者其他元素的存在而进行换行或调整。这通常用于需要精确控制内容布局的场景,比如:
表格:表格的每一行和每一列都需要精确对齐,不能因为页面的边界而改变其结构。
图表:图表中的数据和图形需要保持固定的相对位置,避免因为页面布局变化而影响其显示效果。
注释:注释内容有时需要放在特定的位置,以便读者能够轻松找到和理解。
像这样在一个元素上用CSS设置浮动:
#sidebar { float: right; }
fload属性有四个可用的值:Left 和Right 分别浮动元素到各自的方向,None (默认的) 使元素不浮动,Inherit 将会从父级元素获取float值。
清除Float
清除(clear)是浮动(float)的相关属性.一个设置了清除Float的元素不会如浮动所设置的一样,向上移动到Float元素的边界,而是会忽视浮动向下移动。如下,一图顶千言。
上例中,侧栏向右浮动,并且短于主内容区域。页脚(footer)于是按浮动所要求的向上跳到了可能的空间。要解决这个问题,可以在页脚(footer)上清除浮动,以使页脚(footer)待在浮动元素的下面。
#footer { clear: both; }
清除(clear)也有4个可能值。最常用的是 both,清楚左右两边的浮动。left 和 right 只能清楚一个方向的浮动。none 是默认值,只在需要移除已指定的清除值时用到。inherit 应该时第五个值,不过很奇怪的是 IE 不支持(这个不奇怪吧,IE 从来都这么特立独行吧 -糖伴西红柿注)。只清除左边或右边的浮动,实际中很少见,不过绝对有他们的用处。
http://www.cnblogs.com/zhujl/archive/2012/05/08/2489440.html
http://paranimage.com/css-float-attribute/
使用浮动(float)的一个比较疑惑的事情是他们怎么影响包含他们的父元素的。如果父元素只包含浮动元素,那么它的高度就会塌缩为零。如果父元素不包含任何的可见背景,这个问题会很难被注意到,但是这是一个很重要的问题
估计Bond的来源摘录(http://paranimage.com/css-float-attribute/):
简单清除方法使用了一个聪明的 css 伪选择符(:after)来清除浮动。比起在父元素上设置 overflow,只需要给它增加一个额外的类似于”clearfix”的类。这个类使用如下 css:
.clearfix:after {
content: ".";
visibility: hidden;
display: block;
height: 0;
clear: both;
}
这会在清除浮动的父元素之后应用一点看不见的内容。这不是全部内容,还需要一些额外的代码来适应那些老旧的浏览器。
-------------------------------------------------------------------------------------------------------------
INTRO: 在写页面的过程中经常要遇到清除浮动的情况,这里总结了一下几种常用的清楚浮动的方法。
CATEGORY: 网站前端
TAGS: clear, css
在使用float进行页面布局时,经常遇到有需要清除浮动的地方。通常情况下,只需要在下一个元素上添加clear样式,就可以达到清除浮动的效果了。
clear:left – 清除所有向左的浮动;
clear:right – 清除所有向右的浮动;
clear:both – 清除所有浮动;
clear:none – (默认)不清除浮动。
但是这种方式使得元素样式有一点乱,在以后进行页面修改时,会找不到在哪个元素清了浮动;或者在添加了一些元素以后,原有的冗余样式没有清理。
所以比较简单的办法是设一个clear样式:
.clear{clear:both;}
在需要清除浮动的元素上统一加上clear类,这样以后在修改代码时比较容易看到是哪些元素上使用了清除浮动。
对于一般的情况,这样也就足够了,但是总有一些特殊的时候。
这样一个例子:
<div id="content">
<div class="box">
<div class="left"></div>
<div class="right"></div>
</div>
</div>
<div id="sidebar"></div>
这种情况下,如果在下一个元素上清浮动,就得在id为sidebar的div上加clear了,这样有些脱离了原本清除浮动的语义。是类名为box的div需要清除浮动,而不是id名为content的div需要清浮动。为了还原clear的本意。这里需要在类名为right的div后面加一个无意义元素。
如<p class=”clear”></p>
这么做的缺点也很明显,就是使得页面的html结构中多了一个无意义的元素p。
为了避免这种情况,这里还有两种新的清除浮动的方法。
方法一:利用overflow属性达到清除浮动的效果。
在需要清除浮动的元素,这里的例子中需要清浮动的元素是类名为box的div元素,给这个元素加上以下CSS语句。
.box{
overflow:auto;
zoom:1;
}
方法二:利用:after伪类来清除浮动。
新建一个类,取名为clearboth,在需要清除浮动的元素上使用。修改例子中的html代码:
1
<div class="box clearboth">
.clearboth:after {content: "";display: block;height: 0;clear: both;}
.clearboth { *zoom : 1; } // for IE 6.
我写的测试代码:
++++++++++++++++++以下说得很详细很有操作性+++++++++++++++++++++++++++++
自己对下面这一段做实践Ok的再次体会,为此也贴上:http://blog.csdn.net/cjxtfxs/article/details/6328185
在CSS中我们会经常要用到“清除浮动”Clear,比较典型的就是clear:both;
CSS手册上是这样说明的:该属性的值指出了不允许有浮动对象的边。这个属性是用来控制float属性在文档流的物理位置的。
当属性设置float(浮动)时,其所在的物理位置已经脱离文档流了,但是大多时候我们希望文档流能识别float(浮动),或者是希望float(浮动)后面的元素不被float(浮动)所影响,这个时候我们就需要用clear:both;来清除。
比如:
<p style="float:left;width:200px;">这个是第1列,</p>
<p style="float:right;width:400px;">这个是第2列,</p>
<p>这个是第3列。</p>
如果不用清除浮动,那么第3列文字就会和第1、2列文字在一起 ,所以我们在第3个这列加一个清除浮动 clear:both;
<p style="float:left;width:200px;">这个是第1列,</p>
<p style="float:left;width:400px;">这个是第2列,</p>
<p style="clear:left;">这个是第3列。</p>
通常,我们往往会将“清除浮动”单独定义一个CSS样式,如:
.clear {
clear: both;
}
然后使用<div class="clear"></div>来专门进行“清除浮动”。
不过也有不赞同意见是,<div class="clear"></div>可以不写,直接在下层清除就可以了。
比如本来好好的
<p style="float:left;width:200px;">这个是第1列,</p>
<p style="float:left;width:400px;">这个是第2列,</p>
<p style="clear:both;">这个是第3列。</p>
非要整成
<p style="float:left;width:200px;">这个是第1列,</p>
<p style="float:left;width:400px;">这个是第2列,</p>
<div class="clear"></div>
<p>这个是第3列。</p>
这点看来,<div class="clear"></div>确实不需要写。
不过很显然,我们在网页设计时还有一种很普遍的情况:
<style type="text/css">
#main {background-color: #3399CC;width: 600px;padding: 20px;}
#sidebar {background-color: #FF6600; float: left;width: 130px;}
#container {float: right;width: 420px;background-color: #FFFF33;}
</style>
<div id="main">
<div id="sidebar">第一段内容 第一段内容 第一段内容</div>
<div id="container">第二段内容 第二段内容 第二段内容</div>
</div>
<p style="clear:both;">第三段内容</p>
该页面测试在IE下效果正合所要:蓝色块内部有红色和黄色两个色块内容,同时在蓝色块以下是第三段文本。
不过FF的效果可不是这样的。我们不能单单想在下一层清除就能完成我们的工作,我们必须在浮动元素所在标签闭合之前及时进行“清除”。
<style type="text/css">
#main {background-color: #3399CC;width: 600px;padding: 20px;}
#sidebar {background-color: #FF6600; float: left;width: 130px;}
#container {float: right;width: 420px;background-color: #FFFF33;}
.clear {clear: both;}
</style>
<div id="main">
<div id="sidebar">第一段内容 第一段内容 第一段内容</div>
<div id="container">第二段内容 第二段内容 第二段内容</div>
<div class="clear"></div>
</div>
<p>第三段内容</p>
对于因多加的<div class="clear"></div>标签会引起IE和FF高度变化,通过如下方法解决:
.clear {
clear: both;
height:1px;
margin-top:-1px;
overflow:hidden;
}
subversion(简称svn)是近年来崛起的版本管理软件,是cvs的接班人。目前,绝大多数开源软件都使用svn作为代码版本管理软件。
与CVS对比
在SVN之前,CVS是使用最广泛的版本管理软件。SVN与CVS对比的优点如下:
* 统一的版本号。CVS是对每个文件顺序编排版本号,在某一时间各文件的版本号各不相同。而Subversion下,任何一次提交都会对所有文件增加到同一个新版本号,即使是提交并不涉及的文件。所以,各文件在某任意时间的版本号是相同的。版本号相同的文件构成软件的一个版本。
* 原子提交。一次提交不管是单个还是多个文件,都是作为一个整体提交的。在这当中发生的意外例如传输中断,不会引起数据库的不完整和数据损坏。
* 重命名、复制、删除文件等动作都保存在版本历史记录当中。
* 对于二进制文件,使用了节省空间的保存方法。(简单的理解,就是只保存和上一版本不同之处)
* 目录也有版本历史。整个目录树可以被移动或者复制,操作很简单,而且能够保留全部版本记录。
* 分支的开销非常小。
* 优化过的数据库访问,使得一些操作不必访问数据库就可以做到。这样减少了很多不必要的和数据库主机之间的网络流量。
使用情况
虽然在 2006年 时 Subversion 的使用族群仍然远少于传统的 CVS,但已经有许多开放原码团体决定将 CVS 转换为 Subversion。已经转换使用 Subversion 的包括了 FreeBSD、Apache Software Foundation、KDE、GNOME、GCC、Python、Samba、Mono 以及许多团体。
许多开发团队换用 Subversion 是因为 Trac、SourceForge、CollabNet、CodeBeamer等专案协同作业软件以及Eclipse、NetBeans等IDE提供 Subversion的支援整合。 除此之外,一些自由软件开发的协作网如SourceForge.net除了提供 CVS 外,现在也提供专案开发者使用 Subversion 作为原码管理系统, JavaForge、Google Code以及 BountySource 则以 Subversion 作为官方的原码管理系统。
2009年,绝大多数CVS服务已经改用SVN。CVS已经停止维护。
客户端
Subversion的客户端有两类,一类是websvn等基于web的,一种是以TortoiseSVN为代表的客户端软件。前者需要web服务器的支持,后者需要用户在本地安装客户端,两种都有免费开源软件供使用。
服务器
Subversion支持linux和windows,更多是安装在linux下。
svn服务器有2种运行方式:独立服务器和借助apache。2种方式各有利弊。
svn存储版本数据也有2种方式:BDB和FSFS。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
不足
只能设置目录的访问权限,无法设置单个文件的访问权限。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newhappy2008/archive/2010/03/21/5402658.aspx
与CVS对比
在SVN之前,CVS是使用最广泛的版本管理软件。SVN与CVS对比的优点如下:
* 统一的版本号。CVS是对每个文件顺序编排版本号,在某一时间各文件的版本号各不相同。而Subversion下,任何一次提交都会对所有文件增加到同一个新版本号,即使是提交并不涉及的文件。所以,各文件在某任意时间的版本号是相同的。版本号相同的文件构成软件的一个版本。
* 原子提交。一次提交不管是单个还是多个文件,都是作为一个整体提交的。在这当中发生的意外例如传输中断,不会引起数据库的不完整和数据损坏。
* 重命名、复制、删除文件等动作都保存在版本历史记录当中。
* 对于二进制文件,使用了节省空间的保存方法。(简单的理解,就是只保存和上一版本不同之处)
* 目录也有版本历史。整个目录树可以被移动或者复制,操作很简单,而且能够保留全部版本记录。
* 分支的开销非常小。
* 优化过的数据库访问,使得一些操作不必访问数据库就可以做到。这样减少了很多不必要的和数据库主机之间的网络流量。
使用情况
虽然在 2006年 时 Subversion 的使用族群仍然远少于传统的 CVS,但已经有许多开放原码团体决定将 CVS 转换为 Subversion。已经转换使用 Subversion 的包括了 FreeBSD、Apache Software Foundation、KDE、GNOME、GCC、Python、Samba、Mono 以及许多团体。
许多开发团队换用 Subversion 是因为 Trac、SourceForge、CollabNet、CodeBeamer等专案协同作业软件以及Eclipse、NetBeans等IDE提供 Subversion的支援整合。 除此之外,一些自由软件开发的协作网如SourceForge.net除了提供 CVS 外,现在也提供专案开发者使用 Subversion 作为原码管理系统, JavaForge、Google Code以及 BountySource 则以 Subversion 作为官方的原码管理系统。
2009年,绝大多数CVS服务已经改用SVN。CVS已经停止维护。
客户端
Subversion的客户端有两类,一类是websvn等基于web的,一种是以TortoiseSVN为代表的客户端软件。前者需要web服务器的支持,后者需要用户在本地安装客户端,两种都有免费开源软件供使用。
服务器
Subversion支持linux和windows,更多是安装在linux下。
svn服务器有2种运行方式:独立服务器和借助apache。2种方式各有利弊。
svn存储版本数据也有2种方式:BDB和FSFS。因为BDB方式在服务器中断时,有可能锁住数据,所以还是FSFS方式更安全一点。
不足
只能设置目录的访问权限,无法设置单个文件的访问权限。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newhappy2008/archive/2010/03/21/5402658.aspx
<?php
$days = cal_days_in_month(CAL_GREGORIAN, date("m"), date("Y")); // 31
echo $days;
?>
Fatal error: Call to undefined function cal_days_in_month() in /data/jackxiang/php/date.php on line 3
原来以为cal_days_in_month是drupal下的函数,没想到这个函数是php自带的函数。
下面是这个函数的作用,
cal_days_in_month() 函数针对指定的年份和日历,返回一个月中的天数。
使用这个函数的时候必须在编译 PHP 时加上 --enable-calendar。
但是虚拟主机提供商不会为你的应用把php重新编译。所以我想到用一个别的方法来替代这个函数的作用。
在archive.module里修改如下的代码:
把$num_days_prev = cal_days_in_month(CAL_GREGORIAN, $month-1, $year);
改为:
$num_days_prev = (strtotime("this month")-strtotime("last month"))/(3600*24);
这样,就可以不用cal_days_in_month函数也能直接实现显示日期的效果了!
debug_print_backtrace()
以前查看函数调用堆栈,我会使用 xdebug 等的扩展,其实 PHP5 版本以后已经内置了相关的函数。
顺便再分享个“蛋疼”的小技巧,如果你记不住这个函数的名字,可以用这段代码同样能达到目的(看起来还是记住那个函数靠谱):
<?php
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
debug_print_backtrace和debug_backtrace
这两个函数实现相同的目的——记录php函数的调用堆栈——但是表现不同。debug_print_backtrace直接在输出内容中打印出调用堆栈内容,debug_backtrace将调用堆栈以数组的形式返回供php程序使用。
在我的一个数据字典载入类中debug_print_backtrace的输出如下:
#0 DictLoader->b2d(list_number, Array ([freepp] => 24009394,[contact] => 24005945)) called at [/var/www/freepp/DBALayer/User.php:430]
#1 User->_getOneRecordOfArray(list_number, contact, 24005945) called at [/var/www/freepp/DBALayer/User.php:456]
#2 User->getAContact(list_number, 24005945) called at [/var/www/freepp/freepp_b16/processADD.php:60]
#3 processADD(24009394) called at [/var/www/freepp/freepp_b16/principal.php:48]
#0 DictLoader->b2d(list_number, Array ([freepp] => 24005945,[contact] => 24009394)) called at [/var/www/freepp/DBALayer/User.php:430]
#1 User->_getOneRecordOfArray(list_number, contact, 24009394) called at [/var/www/freepp/DBALayer/User.php:456]
#2 User->getAContact(list_number, 24009394) called at [/var/www/freepp/freepp_b16/processADD.php:93]
#3 processADD(24009394) called at [/var/www/freepp/freepp_b16/principal.php:48]
DictLoader是调用该函数的类
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newhappy2008/archive/2008/04/21/2313159.aspx
阅读全文
以前查看函数调用堆栈,我会使用 xdebug 等的扩展,其实 PHP5 版本以后已经内置了相关的函数。
顺便再分享个“蛋疼”的小技巧,如果你记不住这个函数的名字,可以用这段代码同样能达到目的(看起来还是记住那个函数靠谱):
<?php
$e = new Exception();
print_r(str_replace('/path/to/code/', '', $e->getTraceAsString()));
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
debug_print_backtrace和debug_backtrace
这两个函数实现相同的目的——记录php函数的调用堆栈——但是表现不同。debug_print_backtrace直接在输出内容中打印出调用堆栈内容,debug_backtrace将调用堆栈以数组的形式返回供php程序使用。
在我的一个数据字典载入类中debug_print_backtrace的输出如下:
#0 DictLoader->b2d(list_number, Array ([freepp] => 24009394,[contact] => 24005945)) called at [/var/www/freepp/DBALayer/User.php:430]
#1 User->_getOneRecordOfArray(list_number, contact, 24005945) called at [/var/www/freepp/DBALayer/User.php:456]
#2 User->getAContact(list_number, 24005945) called at [/var/www/freepp/freepp_b16/processADD.php:60]
#3 processADD(24009394) called at [/var/www/freepp/freepp_b16/principal.php:48]
#0 DictLoader->b2d(list_number, Array ([freepp] => 24005945,[contact] => 24009394)) called at [/var/www/freepp/DBALayer/User.php:430]
#1 User->_getOneRecordOfArray(list_number, contact, 24009394) called at [/var/www/freepp/DBALayer/User.php:456]
#2 User->getAContact(list_number, 24009394) called at [/var/www/freepp/freepp_b16/processADD.php:93]
#3 processADD(24009394) called at [/var/www/freepp/freepp_b16/principal.php:48]
DictLoader是调用该函数的类
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/newhappy2008/archive/2008/04/21/2313159.aspx
阅读全文
查阅了很多资料,对于apache中ServerRoot的解释基本都是这样的:ServerRoot用于指定守护进程httpd的运行目录,httpd在启动之后将自动将进程的当前目录改变为这个目录,因此如果设置文件中指定的文件或目录是相对路径,那么真实路径就位于这个ServerRoot定义的路径之下。
1、安装完apache后,我的apache安装目录如下d:\MyPHP\apache2.2\,查看httpd.conf文件,发现ServerRoot定义的目录为:ServerRoot "d:\MyPHP\apache2.2\",不明白的是,apache的进程文件httpd.exe是位于d:\MyPHP\apache2.2\bin\的啊?和官方的解释又不一致,ServerRoot是定义的目录具体是以什么为标准定义的?
2、同样以我安装的为例,假如我把ServerRoot的定义直接改为ServerRoot ".",那这时指定的具体目录又是哪个?
我也是初学者,配置的环境是LAMP,和你的不大一样.但我感觉官方说的和你说的没有矛盾.http的运行目录,它的安装目录这是两个概念.比如DOS下的dir指令,你可以在许多路径下运行它,但它的安装目录肯定只有一个的.进程在运行中是可以改变运行目录的,因此你在设置文件中指定的是相对路径,那就是在d:\MyPHP\apache2.2\下,而不是d:\MyPHP\apache2.2\bin\下.
对于问题3,我个人的感觉具体目录应该是d:\MyPHP\apache2.2\bin\,因为我对具体的源代码没有详细阅读,在这里猜测一下,在httpd运行后,它会根据ServerRoot,改变当前运行环境,但你指定是".",所以还是在当前目录.但这么设置可能会引发一些问题或者错误,引起服务器不能正常运行.
print_r($_SERVER);
print_r($_SERVER);
这个可以得到 Document Root
但是我想得到的是 Server Root
比如我的 httpd.conf
ServerRoot = C:/Apache
DocumentRoot= F:/Myweb
用 phpinfo() 可以看见
Configuration File (php.ini) Path C:\Apache\conf/php.ini
apache2handler
Server Root C:\Apache\
_SERVER["DOCUMENT_ROOT"] F:\Myweb
print_r($_ENV);这个可以吧
可以考虑将phpinfo的内容保存到缓冲区里然后再用正则匹配不出来。
1、安装完apache后,我的apache安装目录如下d:\MyPHP\apache2.2\,查看httpd.conf文件,发现ServerRoot定义的目录为:ServerRoot "d:\MyPHP\apache2.2\",不明白的是,apache的进程文件httpd.exe是位于d:\MyPHP\apache2.2\bin\的啊?和官方的解释又不一致,ServerRoot是定义的目录具体是以什么为标准定义的?
2、同样以我安装的为例,假如我把ServerRoot的定义直接改为ServerRoot ".",那这时指定的具体目录又是哪个?
我也是初学者,配置的环境是LAMP,和你的不大一样.但我感觉官方说的和你说的没有矛盾.http的运行目录,它的安装目录这是两个概念.比如DOS下的dir指令,你可以在许多路径下运行它,但它的安装目录肯定只有一个的.进程在运行中是可以改变运行目录的,因此你在设置文件中指定的是相对路径,那就是在d:\MyPHP\apache2.2\下,而不是d:\MyPHP\apache2.2\bin\下.
对于问题3,我个人的感觉具体目录应该是d:\MyPHP\apache2.2\bin\,因为我对具体的源代码没有详细阅读,在这里猜测一下,在httpd运行后,它会根据ServerRoot,改变当前运行环境,但你指定是".",所以还是在当前目录.但这么设置可能会引发一些问题或者错误,引起服务器不能正常运行.
print_r($_SERVER);
print_r($_SERVER);
这个可以得到 Document Root
但是我想得到的是 Server Root
比如我的 httpd.conf
ServerRoot = C:/Apache
DocumentRoot= F:/Myweb
用 phpinfo() 可以看见
Configuration File (php.ini) Path C:\Apache\conf/php.ini
apache2handler
Server Root C:\Apache\
_SERVER["DOCUMENT_ROOT"] F:\Myweb
print_r($_ENV);这个可以吧
可以考虑将phpinfo的内容保存到缓冲区里然后再用正则匹配不出来。
我的理解是d表示是一个守护进程,就象vsftpd named 这些都是一种命名习惯.
就象脚本都习惯用sh 做后缀一样
像httpd后面的d是什么意思?
被动语态,ed的简写,
意为
1,被服务的;
2,为...服务;
daemon=demon
1. 恶魔,恶鬼
2. 恶人;凶恶的人
3. 邪恶的事物;恶劣的影响
4. 精力充沛的人;高手;热心
daemon
DEFINITION - A daemon (pronounced DEE-muhn) is a program that runs continuously and exists for the purpose of handling periodic service requests that a computer system expects to receive. The daemon program forwards the requests to other programs (or processes) as appropriate. Each server of pages on the Web has an HTTPD or Hypertext Transfer Protocol daemon that continually waits for requests to come in from Web clients and their users.
In mythology, a daemon, according to Webster's, was "an attendant power or spirit."
Daemon can be confused with demon, which has a different but similar meaning. The New Hacker's Dictionary says that a daemon is a program that runs by itself directly under the operating system whereas a demon is part of a larger application program.
就象脚本都习惯用sh 做后缀一样
像httpd后面的d是什么意思?
被动语态,ed的简写,
意为
1,被服务的;
2,为...服务;
daemon=demon
1. 恶魔,恶鬼
2. 恶人;凶恶的人
3. 邪恶的事物;恶劣的影响
4. 精力充沛的人;高手;热心
daemon
DEFINITION - A daemon (pronounced DEE-muhn) is a program that runs continuously and exists for the purpose of handling periodic service requests that a computer system expects to receive. The daemon program forwards the requests to other programs (or processes) as appropriate. Each server of pages on the Web has an HTTPD or Hypertext Transfer Protocol daemon that continually waits for requests to come in from Web clients and their users.
In mythology, a daemon, according to Webster's, was "an attendant power or spirit."
Daemon can be confused with demon, which has a different but similar meaning. The New Hacker's Dictionary says that a daemon is a program that runs by itself directly under the operating system whereas a demon is part of a larger application program.
httpd: apr_sockaddr_info_get() failed for hoteel
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
我在service httpd restart的时候提示上述信息的。虽然启动成功了,但是也是很郁闷的。
这是因为我在配置DNS的时候hostname hoteel造成的。
重新hostname localhost就可以了。
我在网上找来一些有关这方面的信息,就顺便贴在这里了。
1
在启动 httpd 时出现
Starting httpd: httpd: apr_sockaddr_info_get() failed for MYHOST
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName.
这个问题应该是没有在 /etc/httpd/conf/httpd.conf 中设定 ServerName 所以它会用主机上的名称来取代,首先会去找 /etc/hosts 中有没有主机的定义。
所以要解决这个问题可以设定 ServerName 或者在 /etc/hosts 中填入自己的主机名称 MYHOST,像这样:
>vi /etc/hosts
127.0.0.1 localhost.localdomain localhost MYHOST
2
在Linux下安装完Apache 2.2.6,启动HTTP服务就报错,似乎不影响服务的使用,但是也挺别扭的。
[root@linux http]# ./apachectl start
httpd: apr_sockaddr_info_get() failed for linux(在BSD上是apr_sockaddr_info_get() failed for freebsdla)
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
经分析发现是apache的conf目录下的配置文件httpd.conf中关于hostname设置和/etc/sysconfig/network中的HOSTNAME设置不统一导致的,修改成统一的主机名即可解决该问题。
注:/etc/sysconfig/network 默认主机名是:HOSTNAME=localhost.localdomain
PS:网上有这种办法,似乎是没用的,因为我认为apache在编译安装过程中会编译ARP的,因此下述操作有点多余。
apr 和apr-util包含在Apache httpd的发行源代码中,并且在绝大多数情况下使用都不会出现问题。当然,如果apr或apr-util的1.0或1.1版本已经安装在你的系统中了,则必须将你的apr/apr-util升级到1.2版本,或者将httpd单独分开编译。要使用发行源代码中自带的apr/apr-util源代码进行安装,你必须手动完成:阅读全文
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
我在service httpd restart的时候提示上述信息的。虽然启动成功了,但是也是很郁闷的。
这是因为我在配置DNS的时候hostname hoteel造成的。
重新hostname localhost就可以了。
我在网上找来一些有关这方面的信息,就顺便贴在这里了。
1
在启动 httpd 时出现
Starting httpd: httpd: apr_sockaddr_info_get() failed for MYHOST
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName.
这个问题应该是没有在 /etc/httpd/conf/httpd.conf 中设定 ServerName 所以它会用主机上的名称来取代,首先会去找 /etc/hosts 中有没有主机的定义。
所以要解决这个问题可以设定 ServerName 或者在 /etc/hosts 中填入自己的主机名称 MYHOST,像这样:
>vi /etc/hosts
127.0.0.1 localhost.localdomain localhost MYHOST
2
在Linux下安装完Apache 2.2.6,启动HTTP服务就报错,似乎不影响服务的使用,但是也挺别扭的。
[root@linux http]# ./apachectl start
httpd: apr_sockaddr_info_get() failed for linux(在BSD上是apr_sockaddr_info_get() failed for freebsdla)
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
经分析发现是apache的conf目录下的配置文件httpd.conf中关于hostname设置和/etc/sysconfig/network中的HOSTNAME设置不统一导致的,修改成统一的主机名即可解决该问题。
注:/etc/sysconfig/network 默认主机名是:HOSTNAME=localhost.localdomain
PS:网上有这种办法,似乎是没用的,因为我认为apache在编译安装过程中会编译ARP的,因此下述操作有点多余。
apr 和apr-util包含在Apache httpd的发行源代码中,并且在绝大多数情况下使用都不会出现问题。当然,如果apr或apr-util的1.0或1.1版本已经安装在你的系统中了,则必须将你的apr/apr-util升级到1.2版本,或者将httpd单独分开编译。要使用发行源代码中自带的apr/apr-util源代码进行安装,你必须手动完成:阅读全文
一、DNS服务bind及chroot的安装
rpm -ivh bind-libs-9.3.4-10.P1.el5.i386.rpm(库文件,bind依赖于bind-libs)
rpm -ivh bind-utils-9.3.4-10.P1.el5.i386.rpm(DNS服务器的常用工具)
rpm -ivh bind-9.3.4-10.P1.el5.i386.rpm(bind主程序)
rpm -ivh bind-chroot-9.3.4-10.P1.el5.i386.rpm(提高DNS服务的安全性)
rpm -ivh caching-nameserver-9.3.4-10.P1.el5.i386.rpm(DNS缓存服务,以及提动了配置DNS服务器常用的配置文件:named.ca等)
如果有配置yum的话,直接运行:yum install bind bind-utils bind-libs bind-chroot caching-nameserver
(1)当安装了bind-chroot软件包后,那么DNS的配置文件在:/var/named/chroot/目录及子目录中
(2)如果没有安装bind-chroot软件包,那么DNS的配置文在:/var/named目录中
1、安装chroot软件包
Linux服务都是以root权限启动和运行的,随着技术的发展,各种服务变得越来越复杂,导致BUG和漏洞越来越多。黑客利用服务的漏洞入侵系统,能获得root级别的权限,从而控制整个系统。为了减缓这种攻击所带来的负面影响,现在服务器软件通常设计为以root权限启动,然后服务器进程自行放弃root,再以某个低权限的系统账号来运行进程。这种方式的好处在于该服务被攻击者利用漏洞入侵时,由于进程权限很低,攻击者得到的访问权限又是基于这个较低权限的,因此对系统造成的危害比以前减轻了许多
2、启动和停止DNS服务
1)DNS服务的启动、停止、重启
/etc/init.d/named start
/etc/init.d/named stop
/etc/init.d/named restart
2)自动启动DNS服务
如果需要让DNS服务随系统启动而自动加载,可以执行"ntsysv"命令启动服务配置程序,找到"named"服务,其前面加上星号"*,然后选择"确定"即可
同时参考:http://linux7.blog.51cto.com/711204/143535
as4下dns+apache虚拟机配置阅读全文
rpm -ivh bind-libs-9.3.4-10.P1.el5.i386.rpm(库文件,bind依赖于bind-libs)
rpm -ivh bind-utils-9.3.4-10.P1.el5.i386.rpm(DNS服务器的常用工具)
rpm -ivh bind-9.3.4-10.P1.el5.i386.rpm(bind主程序)
rpm -ivh bind-chroot-9.3.4-10.P1.el5.i386.rpm(提高DNS服务的安全性)
rpm -ivh caching-nameserver-9.3.4-10.P1.el5.i386.rpm(DNS缓存服务,以及提动了配置DNS服务器常用的配置文件:named.ca等)
如果有配置yum的话,直接运行:yum install bind bind-utils bind-libs bind-chroot caching-nameserver
(1)当安装了bind-chroot软件包后,那么DNS的配置文件在:/var/named/chroot/目录及子目录中
(2)如果没有安装bind-chroot软件包,那么DNS的配置文在:/var/named目录中
1、安装chroot软件包
Linux服务都是以root权限启动和运行的,随着技术的发展,各种服务变得越来越复杂,导致BUG和漏洞越来越多。黑客利用服务的漏洞入侵系统,能获得root级别的权限,从而控制整个系统。为了减缓这种攻击所带来的负面影响,现在服务器软件通常设计为以root权限启动,然后服务器进程自行放弃root,再以某个低权限的系统账号来运行进程。这种方式的好处在于该服务被攻击者利用漏洞入侵时,由于进程权限很低,攻击者得到的访问权限又是基于这个较低权限的,因此对系统造成的危害比以前减轻了许多
2、启动和停止DNS服务
1)DNS服务的启动、停止、重启
/etc/init.d/named start
/etc/init.d/named stop
/etc/init.d/named restart
2)自动启动DNS服务
如果需要让DNS服务随系统启动而自动加载,可以执行"ntsysv"命令启动服务配置程序,找到"named"服务,其前面加上星号"*,然后选择"确定"即可
同时参考:http://linux7.blog.51cto.com/711204/143535
as4下dns+apache虚拟机配置阅读全文
你可以使用PID或者名称,信号名称或者号码。那么为什么要这样做而不使用/etc/init.d/foo命令重新启动呢?使用它们自己的 init(初始化)文件来控制服务是优先选择的方式,因为这些文件通常包含健全和错误检查以及额外的功能。使用“kill”命令和信号的主要原因是尽可能明确地终止挂起和失控的进程,而不必重新启动或者登出。阅读全文
在MySQL中有一个Query Cache, 作为类CMS这样的内容导向应用很有用. 开启也很方便, 在 my.conf 中加入 query_cache_type 和 query_cache_size 参数.
query_cache_type 0 代表不使用缓冲; 1 代表使用缓冲; 2 代表根据需要使用.
开启QC后,对于频繁更新的表, 使用 SQL_NO_CACHE 屏蔽cache, 如: SELECT SQL_NO_CACHE * FROM test.test001 WHERE …. ;
如果QC类型为2, 在需要cache时, 使用 SQL_CACHE 打开缓存, 如: SELECT SQL_CACHE * FROM test.test001 WHERE … ;
网上摘录了一段说明:
1. 何时cache
a) mysql query cache内容为 select 的结果集, cache 使用完整的 sql 字符串做 key, 并区分大小写,空格等。即两个sql必须完全一致才会导致cache命中。
b) prepared statement永远不会cache到结果,即使参数完全一样。据说在 5.1 之后会得到改善。
c) where条件中如包含了某些函数永远不会被cache, 比如current_date, now等。
d) date 之类的函数如果返回是以小时或天级别的,最好先算出来再传进去。
select * from foo where date1=current_date — 不会被 cache
select * from foo where date1=’2008-12-30′ — 被cache, 正确的做法
e) 太大的result set不会被cache (< query_cache_limit)
2. 何时invalidate
a) 一旦表数据进行任何一行的修改,基于该表相关cache立即全部失效。
b) 为什么不做聪明一点判断修改的是否cache的内容?因为分析cache内容太复杂,服务器需要追求最大的性能。
3. 性能
a) cache 未必所有场合总是会改善性能
当有大量的查询和大量的修改时,cache机制可能会造成性能下降。因为每次修改会导致系统去做cache失效操作,造成不小开销。
另外系统cache的访问由一个单一的全局锁来控制,这时候大量>的查询将被阻塞,直至锁释放。所以不要简单认为设置cache必定会带来性能提升。
b) 大result set不会被cache的开销
太大的result set不会被cache, 但mysql预先不知道result set的长度,所以只能等到reset set在cache添加到临界值 query_cache_limit 之后才会简单的把这个cache 丢弃。这并不是一个高效的操作。如果mysql status中Qcache_not_cached太大的话, 则可对潜在的大结果集的sql显式添加 SQL_NO_CACHE 的控制。
query_cache_min_res_unit = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache
4. 内存池使用
mysql query cache 使用内存池技术,自己管理内存释放和分配,而不是通过操作系统。内存池使用的基本单位是变长的block, 一个result set的cache通过链表把这些block串起来。因为存放result set的时候并不知道这个resultset最终有多大。block最短长度为 query_cache_min_res_unit, resultset 的最后一个block会执行trim操作。
还有一个比较全的: http://www.surfchen.org/wiki/MySQL优化#Query_Cache
MySQL Query Cache 效率的计算
query_cache_type 0 代表不使用缓冲; 1 代表使用缓冲; 2 代表根据需要使用.
开启QC后,对于频繁更新的表, 使用 SQL_NO_CACHE 屏蔽cache, 如: SELECT SQL_NO_CACHE * FROM test.test001 WHERE …. ;
如果QC类型为2, 在需要cache时, 使用 SQL_CACHE 打开缓存, 如: SELECT SQL_CACHE * FROM test.test001 WHERE … ;
网上摘录了一段说明:
1. 何时cache
a) mysql query cache内容为 select 的结果集, cache 使用完整的 sql 字符串做 key, 并区分大小写,空格等。即两个sql必须完全一致才会导致cache命中。
b) prepared statement永远不会cache到结果,即使参数完全一样。据说在 5.1 之后会得到改善。
c) where条件中如包含了某些函数永远不会被cache, 比如current_date, now等。
d) date 之类的函数如果返回是以小时或天级别的,最好先算出来再传进去。
select * from foo where date1=current_date — 不会被 cache
select * from foo where date1=’2008-12-30′ — 被cache, 正确的做法
e) 太大的result set不会被cache (< query_cache_limit)
2. 何时invalidate
a) 一旦表数据进行任何一行的修改,基于该表相关cache立即全部失效。
b) 为什么不做聪明一点判断修改的是否cache的内容?因为分析cache内容太复杂,服务器需要追求最大的性能。
3. 性能
a) cache 未必所有场合总是会改善性能
当有大量的查询和大量的修改时,cache机制可能会造成性能下降。因为每次修改会导致系统去做cache失效操作,造成不小开销。
另外系统cache的访问由一个单一的全局锁来控制,这时候大量>的查询将被阻塞,直至锁释放。所以不要简单认为设置cache必定会带来性能提升。
b) 大result set不会被cache的开销
太大的result set不会被cache, 但mysql预先不知道result set的长度,所以只能等到reset set在cache添加到临界值 query_cache_limit 之后才会简单的把这个cache 丢弃。这并不是一个高效的操作。如果mysql status中Qcache_not_cached太大的话, 则可对潜在的大结果集的sql显式添加 SQL_NO_CACHE 的控制。
query_cache_min_res_unit = (query_cache_size – Qcache_free_memory) / Qcache_queries_in_cache
4. 内存池使用
mysql query cache 使用内存池技术,自己管理内存释放和分配,而不是通过操作系统。内存池使用的基本单位是变长的block, 一个result set的cache通过链表把这些block串起来。因为存放result set的时候并不知道这个resultset最终有多大。block最短长度为 query_cache_min_res_unit, resultset 的最后一个block会执行trim操作。
还有一个比较全的: http://www.surfchen.org/wiki/MySQL优化#Query_Cache
MySQL Query Cache 效率的计算
PHP CGI 有3种形式:
I.最强悍的FPM, 功能最强大, 只要配置php-fpm.conf即可;
fpm主页: http://php-fpm.org/
II.使用 spawn-fcgi, 启动命令: env – PHP_FCGI_CHILDREN=3 PHP_FCGI_MAX_REQUESTS=1000 spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f php-cgi -P /var/run/spawn-fcgi.pid
使用时, 把www-data替换成自己的用户名和群组名;
参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置
-a <addr> 绑定到地址addr
-p <port> 绑定到端口port
-s <path> 绑定到unix socket的路径path
-C <childs> 指定产生的FastCGI的进程数,默认为5(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,Ubuntu下可以使用www-data,其他的根据情况配置,如nobody、apache等
然后我们可以将这行代码加入到/etc/rc.local文件底部,这样系统启动的时候也可以同时启动PHP的FastCGI进程。
III.直接启动php-cgi, 使用命令: php-cgi -b 127.0.0.1:9000
不过这时php-cgi是使用当前用户身份, 执行session等相关操作会出错, 如果web用户(如ubuntu下的www-data)是可以登录的, 则使用命令: su www-data -l -c “php-cgi -b 127.0.0.1:9000″
如果www-data不能登录(bash位/bin/false), 那么直接修改用户权限,
sudo chown www-data:www-data which php-cgi
sudo chmod u+s which php-cgi
BTW: 近段时间看ZF手册,开头有这么一句: 对于只包含有 PHP 代码的文件,结束标志(”?>”)是不允许存在的,PHP自身不需要(”?>”), 这样做, 可以防止它的末尾的被意外地注入相应。 晕倒~~ 我这会儿才知道有这茬
来源:http://mifunny.info/run-php-as-cgi-339.html
I.最强悍的FPM, 功能最强大, 只要配置php-fpm.conf即可;
fpm主页: http://php-fpm.org/
II.使用 spawn-fcgi, 启动命令: env – PHP_FCGI_CHILDREN=3 PHP_FCGI_MAX_REQUESTS=1000 spawn-fcgi -a 127.0.0.1 -p 9000 -u www-data -g www-data -f php-cgi -P /var/run/spawn-fcgi.pid
使用时, 把www-data替换成自己的用户名和群组名;
参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置
-a <addr> 绑定到地址addr
-p <port> 绑定到端口port
-s <path> 绑定到unix socket的路径path
-C <childs> 指定产生的FastCGI的进程数,默认为5(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,Ubuntu下可以使用www-data,其他的根据情况配置,如nobody、apache等
然后我们可以将这行代码加入到/etc/rc.local文件底部,这样系统启动的时候也可以同时启动PHP的FastCGI进程。
III.直接启动php-cgi, 使用命令: php-cgi -b 127.0.0.1:9000
不过这时php-cgi是使用当前用户身份, 执行session等相关操作会出错, 如果web用户(如ubuntu下的www-data)是可以登录的, 则使用命令: su www-data -l -c “php-cgi -b 127.0.0.1:9000″
如果www-data不能登录(bash位/bin/false), 那么直接修改用户权限,
sudo chown www-data:www-data which php-cgi
sudo chmod u+s which php-cgi
BTW: 近段时间看ZF手册,开头有这么一句: 对于只包含有 PHP 代码的文件,结束标志(”?>”)是不允许存在的,PHP自身不需要(”?>”), 这样做, 可以防止它的末尾的被意外地注入相应。 晕倒~~ 我这会儿才知道有这茬
来源:http://mifunny.info/run-php-as-cgi-339.html
以前用actionscript写动态绘制三角函数曲线,其实php输出三角函数曲线也很简单。如下:阅读全文
在将各种类型的数据构造成字符串时,sprintf 的强大功能很少会让你失望。由于sprintf 跟printf 在用法上几乎一样,只是打印的目的地不同而已,前者打印到字符串中,后者则直接在命令行上输出。这也导致sprintf 比printf 有用得多。 阅读全文
sprintf missing function-prototype :
sprintf函数使用---该函数必须包含include<stdio.h>
阅读全文
sprintf函数使用---该函数必须包含include<stdio.h>
mkdir -p /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d "yesterday" +"%m")/
mv /var/log/nginx/access.log /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d
"yesterday" +"%m")/access.$(date -d "yesterday" +"%Y%m%d").log
mv /var/log/nginx/access.log /var/log/nginx/$(date -d "yesterday" +"%Y")/$(date -d
"yesterday" +"%m")/access.$(date -d "yesterday" +"%Y%m%d").log
wget //viewvc.tigris.org/files/documents/3330/44050/viewvc-1.0.7.tar.gz
下载后解压SetUP:
bogon:~/svn_view/viewvc-1.0.7 # ./viewvc-install
This is the ViewVC 1.0.7 installer.
Installation path [/usr/local/viewvc-1.0.7]:确定
。
。
。
安装结束后的提示:
1) Edit the /usr/local/viewvc-1.0.7/viewvc.conf file.
2) Either configure an existing web server to run
/usr/local/viewvc-1.0.7/bin/cgi/viewvc.cgi.
Or, copy /usr/local/viewvc-1.0.7/bin/cgi/viewvc.cgi to an
already-configured cgi-bin directory.
Or, use the standalone server provided by this distribution at
/usr/local/viewvc-1.0.7/bin/standalone.py.
---------------------------------------------------------------------------------------------------------------------
开始配置:
打开viewvc.conf,修改下面几行:
---------------------------------------------------------------------------------------------------------------------
StartRun:
/svn_view/viewvc-1.0.7/bin
./standalone.py
---------------------------------------------------------------------------------------------------------------------
中文乱码解决:
./templates/classic/include/header.ezt:
./templates/classic/error.ezt:
./templates/classic/query.ezt:
./templates/default/include/header.ezt:
./templates/default/error.ezt:
./templates/default/query.ezt:
在head下面加上:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
文献参考:
ViewVC独立运行的基本配置:
1. ViewVC最简单配置
打开viewvc.conf,修改下面几行:
将cvs_roots = cvs: /home/cvsroot注释掉;
#svn_roots = svn: /home/svnrepos 改成类似于 svn_roots = mytest: C:\svn_repos\mytest,其中mytest是你指定的仓库名,冒号后面跟的是仓库所在的路径;
default_root = cvs注释掉,这样你至少可以看到仓库列表。//去掉很重要的
2. 双击ViewVC\bin下的standalone.py,就可以启动ViewVC自带的Web服务,然后在IE中输入http://localhost:7467/viewvc就应该可以看到仓库列表了,到这一步为止,我没有碰到什么障碍,所以,没什么可以提示的了;
3. 点击任何一个仓库,就应该可以看到仓库中的目录或文件了,但是,如果你在IE中看到如下的提示:
ImportError: No module named svn 那说明你没有安装Subversion的Python包,或者将其放到了Subversion的目录下了;
'module' object has no attribute 'SubversionRepository' 那说明你将Subversion的Python包复制到了viewvc的vclib下,并且覆盖掉了viewvc自己的文件;那么,要怎样安装这个包呢,ok,将其复制到ViewVC或者Python的lib目录下吧,唉,当初整这个也费了我不少周折,惭愧,谁叫我是个Python盲呢:
http://pysvn.tigris.org/project_source_code.html
http://pysvn.barrys-emacs.org/source_kits/pysvn-1.7.6.tar.gz
安装方法参考模仿:http://www.jackxiang.com/post/3981/
最后问题及其解决:
('Error:', 'cannot find SVN include svn_client.h - use --svn-inc-dir')
make: *** 没有规则可以创建目标“clean”。 停止。
make: *** 无目标。 停止。
make: *** 没有规则可以创建目标“egg”。 停止。
error: Not a URL, existing file, or requirement spec: 'dist/pysvn-1.7.6-py2.6-linux-i686.egg'
解决办法:
yum install subversion-devel
cd Source
python setup.py configure
make clean
make
=================编译pysvn===============================
cd ../Tests
Test pysvn by running
make
Install pysvn by copying the following from Extension/Source to python site-specific directory.
mkdir python-libdir/site-packages/pysvn
cp pysvn/__init__.py python-libdir/site-packages/pysvn
cp pysvn/_pysvn*.so python-libdir/site-packages/pysvn
rpm -ql python-2.6.6-29.el6_2.2.i686
找到python路径:/usr/lib/python2.6/
cp -Rf /root/software/pysvn-1.7.6/Source/pysvn/_pysvn_2_6.so ./.
cp -Rf /root/software/pysvn-1.7.6/Source/pysvn/__init__.py ./.
========swig支持并绑定到subversion=====================================
绑定到subversion:
要安装viewCvs还需要python的支持,因此我们这里安装的python的2.4版本
./configure PYTHON=/usr/bin/python
make swig-py&&make install-swig_py
然后会生成 libsvn_swig_py.so 文件,使python和subversion绑定起来
=============================================
最近需要用到pysvn扩展包,但在cenos上用easy_install安装不了,说找不到该包,使用yum也不行,无奈只好到官网去下载,我下的是1.7.5的源码包,scp到centos后,执行一下操作:
tar zxvf pysvn-1.7.5.tar.gz
cd pysvn-1.7.5/Source
python setup.py configure
make
cp pysvn /usr/local/python2.7/
安装完成,在终端下使用ipython,输入import pysvn正常,到此该模块安装完成。
ps:源码安装需要你安装subversion-devel包,否则会提示找不到svn_client.h文件
------------------------------------------------------------------------------------------------------------------------------------------------------------
将viewvc和Apache集成standalone.py启动的viewvc服务不够稳定,在生产环境通产需要和web服务器集成。viewvc以CGI方式集成到Apache中相当简单。只需要用ScriptAlias指令将viewvc安装目录下的bin\cgi子目录映射到一个URL上去。示例:
ScriptAlias /codeview/ "E:/viewvc/bin/cgi/"
重启Apache,即可通过URL:http://localhost/codeview/viewcvs.cgi访问所配置的代码仓库
下载viewvc
$ wget http://www.viewvc.org/nightly/viewvc-1.1-dev-20070307.tar.gz
安装viewvc
$ ./viewvc-install
编辑viewvc配置文件 viewvc.conf
root_parents = /home/userhome/zztest/svn_dir : svn,
# /home/cvs-repositories : cvs
同时你还可以在 viewvc.conf 中找到一些可选配置,比如PHP语法高亮等。
在 Apache 的配置文件中加入viewvc配置,并加如HTTP验证功能
Alias /webview /usr/local/viewvc-dev/bin/cgi/
DirectoryIndex viewvc.cgi
AddHandler cgi-script .cgi
Options ExecCGI FollowSymLinks
AllowOverride None
AuthType Basic
AuthName “Subversion repository”
AuthUserFile /usr/local/viewvc-dev/viewpasswd.conf
Require valid-user
Order allow,deny
Allow from all
这时当你在WEB上查看viewvc时,可能会提示
viewvcImportError: No module named svn
这是因为 python 还需要一个和你工作的svn系统进行联系的库,在svn的原代码中可以进行编译并安装,前提是需要安装 swig 这个软件包,还好在大多数LINUX发行版中,这个软件包是默认安装的。你可以用
$ which swig
这样的命令来验证,如果没有安装上,可以安装一个。接下来你可能需要通过这样的方式,重新编译并安装svn软件包
$ ./configure --prefix=/usr/local --with-apxs=/usr/local/bin/apxs --with-berkeley-db=/usr/local PYTHON=/usr/local/bin/python2.5
$ make
$ sudo make install
$ make swig-py
$ make install-swig-py
现在你的viewvc就可以正常工作了。
五、安装viewCvs
下载http://viewvc.org源码包并解压
切换到解压目录
$./viewvc-install,第一个提示后指定ViewVC的安装目录,第二个提示直接回车就行
打开viewvc.conf,修改下面几行:
将cvs_roots = cvs: /home/cvsroot注释掉;
#svn_roots = svn: /home/svnrepos 改成仓库所在的路径;如果多个仓库加逗号隔开;
六、配置apache,在httpd.conf中添加下面两行
ScriptAlias /viewvc /usr/local/viewvc-1.0/www/cgi/viewvc.cgi
ScriptAlias /query /usr/local/viewvc-1.0/www/cgi/query.cgi
在最后添加如:
<Location /svn>
DAV svn
SVNParentPath /home/subversion 仓库目录
AuthzSVNAccessFile /home/subversion/svnuser 存取权限文件
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /home/subversion/svnpasswd 用户验证文件
Require valid-user
</Location>
创建用户难文件:
#htpasswd -cm /home/subversion/svnpass username //来创建的 ,后面会让你输入用户密码
添加用户则 htpasswd -m /home/subversion/svnpass user
对于存取权限设置文件大致内容如下:
[/]
* = r
[groups]
diggmore = nio, binzy, easy, vicki, freeman, rainx
[diggmore:/]
@diggmore = rw
综上设置,启动apache就可以了,如果在提交文件到仓库时出现拒绝错误,请确定httpd.conf里设置的linux用户是否对仓库目录有权限
下载后解压SetUP:
bogon:~/svn_view/viewvc-1.0.7 # ./viewvc-install
This is the ViewVC 1.0.7 installer.
Installation path [/usr/local/viewvc-1.0.7]:确定
。
。
。
安装结束后的提示:
1) Edit the /usr/local/viewvc-1.0.7/viewvc.conf file.
2) Either configure an existing web server to run
/usr/local/viewvc-1.0.7/bin/cgi/viewvc.cgi.
Or, copy /usr/local/viewvc-1.0.7/bin/cgi/viewvc.cgi to an
already-configured cgi-bin directory.
Or, use the standalone server provided by this distribution at
/usr/local/viewvc-1.0.7/bin/standalone.py.
---------------------------------------------------------------------------------------------------------------------
开始配置:
打开viewvc.conf,修改下面几行:
#cvs_roots = cvs: /home/cvsroot
svn_roots = SOA_TAE_ALL: /opt/svn/repositories/SOA_TAE_ALL
svn_roots = SOA_TAE_ALL: /opt/svn/repositories/SOA_TAE_ALL
---------------------------------------------------------------------------------------------------------------------
StartRun:
/svn_view/viewvc-1.0.7/bin
./standalone.py
---------------------------------------------------------------------------------------------------------------------
中文乱码解决:
./templates/classic/include/header.ezt:
./templates/classic/error.ezt:
./templates/classic/query.ezt:
./templates/default/include/header.ezt:
./templates/default/error.ezt:
./templates/default/query.ezt:
在head下面加上:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
文献参考:
ViewVC独立运行的基本配置:
1. ViewVC最简单配置
打开viewvc.conf,修改下面几行:
将cvs_roots = cvs: /home/cvsroot注释掉;
#svn_roots = svn: /home/svnrepos 改成类似于 svn_roots = mytest: C:\svn_repos\mytest,其中mytest是你指定的仓库名,冒号后面跟的是仓库所在的路径;
default_root = cvs注释掉,这样你至少可以看到仓库列表。//去掉很重要的
2. 双击ViewVC\bin下的standalone.py,就可以启动ViewVC自带的Web服务,然后在IE中输入http://localhost:7467/viewvc就应该可以看到仓库列表了,到这一步为止,我没有碰到什么障碍,所以,没什么可以提示的了;
3. 点击任何一个仓库,就应该可以看到仓库中的目录或文件了,但是,如果你在IE中看到如下的提示:
ImportError: No module named svn 那说明你没有安装Subversion的Python包,或者将其放到了Subversion的目录下了;
'module' object has no attribute 'SubversionRepository' 那说明你将Subversion的Python包复制到了viewvc的vclib下,并且覆盖掉了viewvc自己的文件;那么,要怎样安装这个包呢,ok,将其复制到ViewVC或者Python的lib目录下吧,唉,当初整这个也费了我不少周折,惭愧,谁叫我是个Python盲呢:
http://pysvn.tigris.org/project_source_code.html
http://pysvn.barrys-emacs.org/source_kits/pysvn-1.7.6.tar.gz
安装方法参考模仿:http://www.jackxiang.com/post/3981/
最后问题及其解决:
('Error:', 'cannot find SVN include svn_client.h - use --svn-inc-dir')
make: *** 没有规则可以创建目标“clean”。 停止。
make: *** 无目标。 停止。
make: *** 没有规则可以创建目标“egg”。 停止。
error: Not a URL, existing file, or requirement spec: 'dist/pysvn-1.7.6-py2.6-linux-i686.egg'
解决办法:
yum install subversion-devel
cd Source
python setup.py configure
make clean
make
=================编译pysvn===============================
cd ../Tests
Test pysvn by running
make
Install pysvn by copying the following from Extension/Source to python site-specific directory.
mkdir python-libdir/site-packages/pysvn
cp pysvn/__init__.py python-libdir/site-packages/pysvn
cp pysvn/_pysvn*.so python-libdir/site-packages/pysvn
rpm -ql python-2.6.6-29.el6_2.2.i686
找到python路径:/usr/lib/python2.6/
cp -Rf /root/software/pysvn-1.7.6/Source/pysvn/_pysvn_2_6.so ./.
cp -Rf /root/software/pysvn-1.7.6/Source/pysvn/__init__.py ./.
========swig支持并绑定到subversion=====================================
绑定到subversion:
要安装viewCvs还需要python的支持,因此我们这里安装的python的2.4版本
./configure PYTHON=/usr/bin/python
make swig-py&&make install-swig_py
然后会生成 libsvn_swig_py.so 文件,使python和subversion绑定起来
=============================================
最近需要用到pysvn扩展包,但在cenos上用easy_install安装不了,说找不到该包,使用yum也不行,无奈只好到官网去下载,我下的是1.7.5的源码包,scp到centos后,执行一下操作:
tar zxvf pysvn-1.7.5.tar.gz
cd pysvn-1.7.5/Source
python setup.py configure
make
cp pysvn /usr/local/python2.7/
安装完成,在终端下使用ipython,输入import pysvn正常,到此该模块安装完成。
ps:源码安装需要你安装subversion-devel包,否则会提示找不到svn_client.h文件
------------------------------------------------------------------------------------------------------------------------------------------------------------
将viewvc和Apache集成standalone.py启动的viewvc服务不够稳定,在生产环境通产需要和web服务器集成。viewvc以CGI方式集成到Apache中相当简单。只需要用ScriptAlias指令将viewvc安装目录下的bin\cgi子目录映射到一个URL上去。示例:
ScriptAlias /codeview/ "E:/viewvc/bin/cgi/"
重启Apache,即可通过URL:http://localhost/codeview/viewcvs.cgi访问所配置的代码仓库
下载viewvc
$ wget http://www.viewvc.org/nightly/viewvc-1.1-dev-20070307.tar.gz
安装viewvc
$ ./viewvc-install
编辑viewvc配置文件 viewvc.conf
root_parents = /home/userhome/zztest/svn_dir : svn,
# /home/cvs-repositories : cvs
同时你还可以在 viewvc.conf 中找到一些可选配置,比如PHP语法高亮等。
在 Apache 的配置文件中加入viewvc配置,并加如HTTP验证功能
Alias /webview /usr/local/viewvc-dev/bin/cgi/
DirectoryIndex viewvc.cgi
AddHandler cgi-script .cgi
Options ExecCGI FollowSymLinks
AllowOverride None
AuthType Basic
AuthName “Subversion repository”
AuthUserFile /usr/local/viewvc-dev/viewpasswd.conf
Require valid-user
Order allow,deny
Allow from all
这时当你在WEB上查看viewvc时,可能会提示
viewvcImportError: No module named svn
这是因为 python 还需要一个和你工作的svn系统进行联系的库,在svn的原代码中可以进行编译并安装,前提是需要安装 swig 这个软件包,还好在大多数LINUX发行版中,这个软件包是默认安装的。你可以用
$ which swig
这样的命令来验证,如果没有安装上,可以安装一个。接下来你可能需要通过这样的方式,重新编译并安装svn软件包
$ ./configure --prefix=/usr/local --with-apxs=/usr/local/bin/apxs --with-berkeley-db=/usr/local PYTHON=/usr/local/bin/python2.5
$ make
$ sudo make install
$ make swig-py
$ make install-swig-py
现在你的viewvc就可以正常工作了。
五、安装viewCvs
下载http://viewvc.org源码包并解压
切换到解压目录
$./viewvc-install,第一个提示后指定ViewVC的安装目录,第二个提示直接回车就行
打开viewvc.conf,修改下面几行:
将cvs_roots = cvs: /home/cvsroot注释掉;
#svn_roots = svn: /home/svnrepos 改成仓库所在的路径;如果多个仓库加逗号隔开;
六、配置apache,在httpd.conf中添加下面两行
ScriptAlias /viewvc /usr/local/viewvc-1.0/www/cgi/viewvc.cgi
ScriptAlias /query /usr/local/viewvc-1.0/www/cgi/query.cgi
在最后添加如:
<Location /svn>
DAV svn
SVNParentPath /home/subversion 仓库目录
AuthzSVNAccessFile /home/subversion/svnuser 存取权限文件
AuthType Basic
AuthName "Subversion repository"
AuthUserFile /home/subversion/svnpasswd 用户验证文件
Require valid-user
</Location>
创建用户难文件:
#htpasswd -cm /home/subversion/svnpass username //来创建的 ,后面会让你输入用户密码
添加用户则 htpasswd -m /home/subversion/svnpass user
对于存取权限设置文件大致内容如下:
[/]
* = r
[groups]
diggmore = nio, binzy, easy, vicki, freeman, rainx
[diggmore:/]
@diggmore = rw
综上设置,启动apache就可以了,如果在提交文件到仓库时出现拒绝错误,请确定httpd.conf里设置的linux用户是否对仓库目录有权限