一、工具箱(多种工具共用一个快捷键的可同时按【Shift】加此快捷键选取)
矩形、椭圆选框工具 【M】
移动工具 【V】
套索、多边形套索、磁性套索 【L】
魔棒工具 【W】
裁剪工具 【C】
切片工具、切片选择工具 【K】
喷枪工具 【J】
画笔工具、铅笔工具 【B】
像皮图章、图案图章 【S】
历史画笔工具、艺术历史画笔 【Y】
像皮擦、背景擦除、魔术像皮擦 【E】
渐变工具、油漆桶工具 【G】
模糊、锐化、涂抹工具 【R】
减淡、加深、海棉工具 【O】
路径选择工具、直接选取工具 【A】
文字工具 【T】
钢笔、自由钢笔 【P】
矩形、圆边矩形、椭圆、多边形、直线 【U】
写字板、声音注释 【N】
吸管、颜色取样器、度量工具 【I】
抓手工具 【H】
缩放工具 【Z】
默认前景色和背景色 【D】
切换前景色和背景色 【X】
切换标准模式和快速蒙板模式 【Q】
标准屏幕模式、带有菜单栏的全屏模式、全屏模式 【F】
跳到ImageReady3.0中 【Ctrl】+【Shift】+【M】
临时使用移动工具 【Ctrl】
临时使用吸色工具 【Alt】
临时使用抓手工具 【空格】
快速输入工具选项(当前工具选项面板中至少有一个可调节数字) 【0】至【9】
循环选择画笔 【[】或【]】
建立新渐变(在”渐变编辑器”中) 【Ctrl】+【N】
二、文件操作
新建图形文件 【Ctrl】+【N】
打开已有的图像 【Ctrl】+【O】
打开为… 【Ctrl】+【Alt】+【O】
关闭当前图像 【Ctrl】+【W】
保存当前图像 【Ctrl】+【S】
另存为… 【Ctrl】+【Shift】+【S】
存储为网页用图形 【Ctrl】+【Alt】+【Shift】+【S】
页面设置 【Ctrl】+【Shift】+【P】
打印预览 【Ctrl】+【Alt】+【P】
打印 【Ctrl】+【P】
退出Photoshop 【Ctrl】+【Q】
三、编辑操作
还原/重做前一步操作 【Ctrl】+【Z】
一步一步向前还原 【Ctrl】+【Alt】+【Z】
一步一步向后重做 【Ctrl】+【Shift】+【Z】
淡入/淡出 【Ctrl】+【Shift】+【F】
剪切选取的图像或路径 【Ctrl】+【X】或【F2】
拷贝选取的图像或路径 【Ctrl】+【C】
合并拷贝 【Ctrl】+【Shift】+【C】
将剪贴板的内容粘到当前图形中 【Ctrl】+【V】或【F4】
将剪贴板的内容粘到选框中 【Ctrl】+【Shift】+【V】
自由变换 【Ctrl】+【T】
应用自由变换(在自由变换模式下) 【Enter】
从中心或对称点开始变换 (在自由变换模式下) 【Alt】
限制(在自由变换模式下) 【Shift】
扭曲(在自由变换模式下) 【Ctrl】
取消变形(在自由变换模式下) 【Esc】
自由变换复制的象素数据 【Ctrl】+【Shift】+【T】
再次变换复制的象素数据并建立一个副本 【Ctrl】+【Shift】+【Alt】+【T】
删除选框中的图案或选取的路径 【DEL】
用背景色填充所选区域或整个图层 【Ctrl】+【BackSpace】或【Ctrl】+【Del】
用前景色填充所选区域或整个图层 【Alt】+【BackSpace】或【Alt】+【Del】
弹出“填充”对话框 【Shift】+【BackSpace】
从历史记录中填充 【Alt】+【Ctrl】+【Backspace】
打开“颜色设置”对话框 【Ctrl】+【Shift】+【K】
打开“预先调整管理器”对话框 【Alt】+【E】放开后按【M】
预设画笔(在“预先调整管理器”对话框中) 【Ctrl】+【1】
预设颜色样式(在“预先调整管理器”对话框中) 【Ctrl】+【2】
预设渐变填充(在“预先调整管理器”对话框中) 【Ctrl】+【3】
预设图层效果(在“预先调整管理器”对话框中) 【Ctrl】+【4】
预设图案填充(在“预先调整管理器”对话框中) 【Ctrl】+【5】
预设轮廓线(在“预先调整管理器”对话框中) 【Ctrl】+【6】
预设定制矢量图形(在“预先调整管理器”对话框中) 【Ctrl】+【7】
打开“预置”对话框 【Ctrl】+【K】
显示最后一次显示的“预置”对话框 【Alt】+【Ctrl】+【K】
设置“常规”选项(在预置对话框中) 【Ctrl】+【1】
设置“存储文件”(在预置对话框中) 【Ctrl】+【2】
设置“显示和光标”(在预置对话框中) 【Ctrl】+【3】
设置“透明区域与色域”(在预置对话框中) 【Ctrl】+【4】
设置“单位与标尺”(在预置对话框中) 【Ctrl】+【5】
设置“参考线与网格”(在预置对话框中) 【Ctrl】+【6】
设置“增效工具与暂存盘”(在预置对话框中) 【Ctrl】+【7】
设置“内存与图像高速缓存”(在预置对话框中) 【Ctrl】+【8】
四、图像调整
调整色阶 【Ctrl】+【L】
自动调整色阶 【Ctrl】+【Shift】+【L】
自动调整对比度 【Ctrl】+【Alt】+【Shift】+【L】
打开曲线调整对话框 【Ctrl】+【M】
在所选通道的曲线上添加新的点(‘曲线’对话框中) 在图象中【Ctrl】加点按
在复合曲线以外的所有曲线上添加新的点(‘曲线’对话框中) 【Ctrl】+【Shift】加点按
移动所选点(‘曲线’对话框中) 【↑】/【↓】/【←】/【→】
以10点为增幅移动所选点以10点为增幅(‘曲线’对话框中) 【Shift】+【箭头】
选择多个控制点(‘曲线’对话框中) 【Shift】加点按
前移控制点(‘曲线’对话框中) 【Ctrl】+【Tab】
后移控制点(‘曲线’对话框中) 【Ctrl】+【Shift】+【Tab】
添加新的点(‘曲线’对话框中) 点按网格
删除点(‘曲线’对话框中) 【Ctrl】加点按点
取消选择所选通道上的所有点(‘曲线’对话框中) 【Ctrl】+【D】
使曲线网格更精细或更粗糙(‘曲线’对话框中) 【Alt】加点按网格
选择彩色通道(‘曲线’对话框中) 【Ctrl】+【~】
选择单色通道(‘曲线’对话框中) 【Ctrl】+【数字】
打开“色彩平衡”对话框 【Ctrl】+【B】
打开“色相/饱和度”对话框 【Ctrl】+【U】
全图调整(在色相/饱和度”对话框中) 【Ctrl】+【~】
只调整红色(在色相/饱和度”对话框中) 【Ctrl】+【1】
只调整黄色(在色相/饱和度”对话框中) 【Ctrl】+【2】
只调整绿色(在色相/饱和度”对话框中) 【Ctrl】+【3】
只调整青色(在色相/饱和度”对话框中) 【Ctrl】+【4】
只调整蓝色(在色相/饱和度”对话框中) 【Ctrl】+【5】
只调整洋红(在色相/饱和度”对话框中) 【Ctrl】+【6】
去色 【Ctrl】+【Shift】+【U】
反相 【Ctrl】+【I】
打开“抽取(Extract)”对话框 【Ctrl】+【Alt】+【X】
边缘增亮工具(在“抽取”对话框中) 【B】
填充工具(在“抽取”对话框中) 【G】
擦除工具(在“抽取”对话框中) 【E】
清除工具(在“抽取”对话框中) 【C】
边缘修饰工具(在“抽取”对话框中) 【T】
缩放工具(在“抽取”对话框中) 【Z】
抓手工具(在“抽取”对话框中) 【H】
改变显示模式(在“抽取”对话框中) 【F】
加大画笔大小(在“抽取”对话框中) 【]】
减小画笔大小(在“抽取”对话框中) 【[】
完全删除增亮线(在“抽取”对话框中) 【Alt】+【BackSpace】
增亮整个抽取对像(在“抽取”对话框中) 【Ctrl】+【BackSpace】
打开“液化(Liquify)”对话框 【Ctrl】+【Shift】+【X】
扭曲工具(在“液化”对话框中) 【W】
顺时针转动工具(在“液化”对话框中) 【R】
逆时针转动工具(在“液化”对话框中) 【L】
缩拢工具(在“液化”对话框中) 【P】
扩张工具(在“液化”对话框中) 【B】
反射工具(在“液化”对话框中) 【M】
重构工具(在“液化”对话框中) 【E】
冻结工具(在“液化”对话框中) 【F】
解冻工具(在“液化”对话框中) 【T】
应用“液化”效果并退回Photoshop主界面(在“液化”对话框中) 【Enter】
放弃“液化”效果并退回Photoshop主界面(在“液化”对话框中) 【ESC】
五、图层操作
从对话框新建一个图层 【Ctrl】+【Shift】+【N】
以默认选项建立一个新的图层 【Ctrl】+【Alt】+【Shift】+【N】
通过拷贝建立一个图层(无对话框) 【Ctrl】+【J】
从对话框建立一个通过拷贝的图层 【Ctrl】+【Alt】+【J】
通过剪切建立一个图层(无对话框) 【Ctrl】+【Shift】+【J】
从对话框建立一个通过剪切的图层 【Ctrl】+【Shift】+【Alt】+【J】
与前一图层编组 【Ctrl】+【G】
取消编组 【Ctrl】+【Shift】+【G】
将当前层下移一层 【Ctrl】+【[】
将当前层上移一层 【Ctrl】+【]】
将当前层移到最下面 【Ctrl】+【Shift】+【[】
将当前层移到最上面 【Ctrl】+【Shift】+【]】
激活下一个图层 【Alt】+【[】
激活上一个图层 【Alt】+【]】
激活底部图层 【Shift】+【Alt】+【[】
激活顶部图层 【Shift】+【Alt】+【]】
向下合并或合并联接图层 【Ctrl】+【E】
合并可见图层 【Ctrl】+【Shift】+【E】
盖印或盖印联接图层 【Ctrl】+【Alt】+【E】
盖印可见图层 【Ctrl】+【Alt】+【Shift】+【E】
调整当前图层的透明度(当前工具为无数字参数的,如移动工具) 【0】至【9】
保留当前图层的透明区域(开关) 【/】
使用预定义效果(在”效果”对话框中) 【Ctrl】+【1】
混合选项(在”效果”对话框中) 【Ctrl】+【2】
投影选项(在”效果”对话框中) 【Ctrl】+【3】
内部阴影(在”效果”对话框中) 【Ctrl】+【4】
外发光(在”效果”对话框中) 【Ctrl】+【5】
内发光(在”效果”对话框中) 【Ctrl】+【6】
斜面和浮雕(在”效果”对话框中) 【Ctrl】+【7】
轮廓(在”效果”对话框中) 【Ctrl】+【8】
材质(在”效果”对话框中) 【Ctrl】+【9】
六、图层混合模式
循环选择混合模式 【Shift】+【-】或【+】
正常Normal 【Shift】+【Alt】+【N】
溶解Dissolve 【Shift】+【Alt】+【I】
正片叠底Multiply 【Shift】+【Alt】+【M】
屏幕Screen 【Shift】+【Alt】+【S】
叠加Overlay 【Shift】+【Alt】+【O】
柔光Soft Light 【Shift】+【Alt】+【F】
强光Hard Light 【Shift】+【Alt】+【H】
颜色减淡Color Dodge 【Shift】+【Alt】+【D】
颜色加深Color Burn 【Shift】+【Alt】+【B】
变暗Darken 【Shift】+【Alt】+【K】
变亮Lighten 【Shift】+【Alt】+【G】
差值Difference 【Shift】+【Alt】+【E】
排除Exclusion 【Shift】+【Alt】+【X】
色相Hue 【Shift】+【Alt】+【U】
饱和度Saturation 【Shift】+【Alt】+【T】
颜色Color 【Shift】+【Alt】+【C】
光度Luminosity 【Shift】+【Alt】+【Y】
去色 海棉工具+【Shift】+【Alt】+【J】
加色 海棉工具+【Shift】+【Alt】+【A】
七、选择功能
全部选取 【Ctrl】+【A】
取消选择 【Ctrl】+【D】
重新选择 【Ctrl】+【Shift】+【D】
羽化选择 【Ctrl】+【Alt】+【D】
反向选择 【Ctrl】+【Shift】+【I】
载入选区 【Ctrl】+点按图层、路径、通道面板中的缩约图
滤镜
按上次的参数再做一次上次的滤镜 【Ctrl】+【F】
退去上次所做滤镜的效果 【Ctrl】+【Shift】+【F】
重复上次所做的滤镜(可调参数) 【Ctrl】+【Alt】+【F】
选择工具(在“3D变化”滤镜中) 【V】
直接选择工具(在“3D变化”滤镜中) 【A】
立方体工具(在“3D变化”滤镜中) 【M】
球体工具(在“3D变化”滤镜中) 【N】
柱体工具(在“3D变化”滤镜中) 【C】
添加锚点工具(在“3D变化”滤镜中) 【+】
减少锚点工具(在“3D变化”滤镜中) 【-】
轨迹球(在“3D变化”滤镜中) 【R】
全景相机工具(在“3D变化”滤镜中) 【E】
移动视图(在“3D变化”滤镜中) 【H】
缩放视图(在“3D变化”滤镜中) 【Z】
应用三维变形并退回到Photoshop主界面(在“3D变化”滤镜中) 【Enter】
放弃三维变形并退回到Photoshop主界面(在“3D变化”滤镜中) 【Esc】
八、视图操作
选择彩色通道 【Ctrl】+【~】
选择单色通道 【Ctrl】+【数字】
选择快速蒙板 【Ctrl】+【】
始终在视窗显示复合通道 【~】
以CMYK方式预览(开关) 【Ctrl】+【Y】
打开/关闭色域警告 【Ctrl】+【Shift】+【Y】
放大视图 【Ctrl】+【+】
缩小视图 【Ctrl】+【-】
满画布显示 【Ctrl】+【0】
实际象素显示 【Ctrl】+【Alt】+【0】
向上卷动一屏 【PageUp】
向下卷动一屏 【PageDown】
向左卷动一屏 【Ctrl】+【PageUp】
向右卷动一屏 【Ctrl】+【PageDown】
向上卷动10 个单位 【Shift】+【PageUp】
向下卷动10 个单位 【Shift】+【PageDown】
向左卷动10 个单位 【Shift】+【Ctrl】+【PageUp】
向右卷动10 个单位 【Shift】+【Ctrl】+【PageDown】
将视图移到左上角 【Home】
将视图移到右下角 【End】
显示/隐藏选择区域 【Ctrl】+【H】
显示/隐藏路径 【Ctrl】+【Shift】+【H】
显示/隐藏标尺 【Ctrl】+【R】
捕捉 【Ctrl】+【;】
锁定参考线 【Ctrl】+【Alt】+【;】
显示/隐藏“颜色”面板 【F6】
显示/隐藏“图层”面板 【F7】
显示/隐藏“信息”面板 【F8】
显示/隐藏“动作”面板 【F9】
显示/隐藏所有命令面板 【TAB】
显示或隐藏工具箱以外的所有调板 【Shift】+【TAB】
文字处理(在字体编辑模式中)
显示/隐藏“字符”面板 【Ctrl】+【T】
显示/隐藏“段落”面板 【Ctrl】+【M】
左对齐或顶对齐 【Ctrl】+【Shift】+【L】
中对齐 【Ctrl】+【Shift】+【C】
右对齐或底对齐 【Ctrl】+【Shift】+【R】
左/右选择 1 个字符 【Shift】+【←】/【→】
下/上选择 1 行 【Shift】+【↑】/【↓】
选择所有字符 【Ctrl】+【A】
显示/隐藏字体选取底纹 【Ctrl】+【H】
选择从插入点到鼠标点按点的字符 【Shift】加点按
左/右移动 1 个字符 【←】/【→】
下/上移动 1 行 【↑】/【↓】
左/右移动1个字 【Ctrl】+【←】/【→】
将所选文本的文字大小减小2 点象素 【Ctrl】+【Shift】+【<】
将所选文本的文字大小增大2 点象素 【Ctrl】+【Shift】+【>】
将所选文本的文字大小减小10 点象素 【Ctrl】+【Alt】+【Shift】+【<】
将所选文本的文字大小增大10 点象素 【Ctrl】+【Alt】+【Shift】+【>】
将行距减小2点象素 【Alt】+【↓】
将行距增大2点象素 【Alt】+【↑】
将基线位移减小2点象素 【Shift】+【Alt】+【↓】
将基线位移增加2点象素 【Shift】+【Alt】+【↑】
将字距微调或字距调整减小20/1000ems 【Alt】+【←】
将字距微调或字距调整增加20/1000ems 【Alt】+【→】
将字距微调或字距调整减小100/1000ems 【Ctrl】+【Alt】+【←】
将字距微调或字距调整增加100/1000ems 【Ctrl】+【Alt】+【→】
ECSHOP错误Redefining already defined constructor for class如何解决
asp多维数组redim报错:下标越界
搜索:百度知道结果:
Dim p() As Byte
ReDim Preserve p(3, 1)
ReDim Preserve p(4, 1)
使用 Preserve,只能调整数组最后一维的大小。
Dim p() As Byte
ReDim Preserve p(1, 3)
ReDim Preserve p(1, 4)
或
Dim p() As Byte
ReDim p(3, 3)
ReDim p(2, 4)
都是正确的。
只有上面2种定义是正确的,这是VB规定的。
解决方法可以定义成最后一维可变,其他维不变的形式:
ReDim Preserve p(1, 3)
ReDim Preserve p(1, 4)
如果实在定义不了的话,利用临时数组存储数据,然后不用Preserve,再把临时数组数据转回P数组:
Dim p() As Byte ,dim q() as byte
ReDim Preserve p(3, 1)
redim q(3,1)
…’p数组数据转至Q数组中
ReDim p(4, 1)
…’Q数组数据转至回P数组中。
html块级元素和内联元素区别详解
块级元素(block)特性:
总是独占一行,表现为另起一行开始,而且其后的元素也必须另起一行显示;
宽度(width)、高度(height)、内边距(padding)和外边距(margin)都可控制;
内联元素(inline)特性:
和相邻的内联元素在同一行;
宽度(width)、高度(height)、内边距的top/bottom(padding-top/padding-bottom)和外边距的top/bottom(margin-top/margin-bottom)都不可改变,就是里面文字或图片的大小;
块级元素主要有:
address , blockquote , center , dir , div , dl , fieldset , form , h1 , h2 , h3 , h4 , h5 , h6 , hr , isindex , menu , noframes , noscript , ol , p , pre , table , ul , li
内联元素主要有:
a , abbr , acronym , b , bdo , big , br , cite , code , dfn , em , font , i , img , input , kbd , label , q , s , samp , select , small , span , strike , strong , sub , sup ,
textarea , tt , u , var
可变元素(根据上下文关系确定该元素是块元素还是内联元素):
applet ,button ,del ,iframe , ins ,map ,object , script
CSS中块级、内联元素的应用:
利用CSS我们可以摆脱上面表格里HTML标签归类的限制,自由地在不同标签/元素上应用我们需要的属性。
主要用的CSS样式有以下三个:
display:block — 显示为块级元素
display:inline — 显示为内联元素
dipslay:inline-block — 显示为内联块元素,表现为同行显示并可修改宽高内外边距等属性
我们常将
- 元素加上display:inline-block样式,原本垂直的列表就可以水平显示了。
题外话:最近整理有关块级元素和内联元素区别的有关知识,网上找了不少相关的文章,发现大家的理解似乎都有误,我自己亲自测试了下,发现了不少的问题:
内联元素的margin-left / margin-right及padding-left / padding-rigtht是可以控制的,所以可以通过这4个属性来控制内联元素的宽度。
内联元素的内部也可以放块级元素标签,而且内部的块级元素标签会撑大外部的内联标签,所以可以通过放块元素来控制内联元素的高度(网上介绍的是内联元素只能放文本及其他内联元素)
HTML元素嵌套表:

中国顶级域名注册商名单[Internic官方数据]
这是2013年3月22日从Internic官网上获取的名单。
不要再相信百度出来的数据。我曾经以“顶级域名注册商”、“国内顶级域名注册商”、“中国顶级域名注册商是哪几个”、“中国顶级域名注册商是哪几个”、“一级域名注册商”等关键词去搜索,等到的结果全是SEO的文章,里面什么排名、十大,名单里面都包含了发帖人所在的公司,没有任何参考价值。
Google搜索结果也差不多。无奈自己进入Internic官网认证页面去搜索名单。下面就是搜索结果。 注:排名按公司英文名称顺序排列。
Response.Redirect、Server.Transfer的区别
在实现页面跳转的时候,有些人喜欢用Response.Redirect,而有些人则喜欢用Server.Transfer。大部分时间似乎这两种方法都可以实现相同的功能,那究竟有区别吗?
查了些文档,发现两者区别还是很明显的。根本上,Response是叫浏览器去重新转向到指定的网页,而Server自然是发生在服务器端为主了,因此会有以下区别:
1. Server.Transfer只能够转跳到本地虚拟目录指定的页面,而Response.Redirect则十分灵活;
2. Server.Transfer可以将页面参数方便传递到指定页面;
3. 使用时,Server.Transfer跳到别的页面后,浏览器显示的地址不会改变,有时反而会造成误会,当然也有些场合需要这样的效果;
4. Server.Transfer可以减少客户端对服务器的请求;
用Server.Transfer迁移到另一个页面保持着服务资源。 而不是简单的通知浏览器服务端换了个页面并迁移请求。这意味着你不需要携带更多的Http请求,因此可以减轻服务端的压力而使你的应用运行得更快。
但是,注意:因为”Transfer”过程只能在那些在同一服务端的站点上,你不能使用Server.Transfer使用户跳转到外部的站点。这点只有Response.Redirect能做到。
第二,Server.Transfer维持着浏览器原始的URL,这对于流线型的数据入口技术,虽然它有可能导致调试的时候的数据混乱
还有,Server.Transfer方法还有二个参数的重载方法——”preserveForm”如果你将其设置为True(默认情况是False),使用一个状态比如:Server.Transfer(“WebForm2.aspx”, True),现存的请求字符串和所有的Form里的变量将被保持并提交到你的目标页。
但是必须注意的是,这里有一个奇怪的Bug(微软为什么有这样的Bug)。当你使用两个参数的重载方法试图迁移form和请求字符串的时候会有可能产生错误。
非官方的解决办法是将要被跳转的画面的enableViewStateMac的属性设置为 True , 然后再设回 False.
CI如何去掉URL中的index.php
前提:服务器是 Apache,支持 mod_rewrite。
在 CI 根目录(与index.php同级) 下新建立一个txt文件,命名为: .htaccess (注意不带后缀名txt)。在文件中输入:
RewriteEngine on
RewriteRule ^(.*)$ /index.php/$1 [L]
第二行中 /index.php/ 要根据index.php相对于根目录的路径修改。我的访问的时候用http://www.yanfei.info/ci/ 那就改为 /ci/index.php/
打开applicationconfig中的 config.php
$config[‘index_page’] = “index.php”;修改成$config[‘index_page’] = “”;
OK
smarty比较操作符详细对照表
smarty 比较操作符对照表
| 操作符 | 中文解释 |
| eq | 相等 |
| ne、neq | 不相等 |
| gt | 大于 |
| lt | 小于 |
| gte、ge | 大于等于 |
| lte、le | 小于等于 |
| not | 非 |
| mod | 求模 |
| is [not] div by | 是否能被某数整除 |
| is [not] even | 是否为偶数 |
| is [not] odd | 是否为奇 |
使用示例:
$a is [not] even by $b即($a / $b) % 2 == 0
$a is not odd by $b即($a / $b) % 2 != 0
以上操作符可用在Smarty中的if语句,也可使用在else和elseif句中.以上修饰词: eq、ne、neq、gt、lt、lte、le、gte、ge、is even、is odd、is not even、is not odd、not、mod、div by、even by、odd by、==、!=、>、<、<=、>=. 在使用这些修饰词时,必须和变量或常量用空格格开.
Apache服务器的进程优化[转]
服务器的优化
(MPM: Multi-Processing Modules)
apache2主要的优势就是对多处理器的支持更好,在编译时同过使用–with-mpm选项来决定apache2的工作模式。如果知道当前的apache2使用什么工作机制,可以通过httpd -l命令列出apache的所有模块,就可以知道其工作方式:
prefork:
如果httpd -l列出prefork.c,则需要对下面的段进行配置:
StartServers 5 #启动apache时启动的httpd进程个数。
MinSpareServers 5 #服务器保持的最小空闲进程数。
MaxSpareServers 10 #服务器保持的最大空闲进程数。
MaxClients 150 #最大并发连接数。
MaxRequestsPerChild 1000 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
在该工作模式下,服务器启动后起动5个httpd进程(加父进程共6个,通过ps -ax|grep httpd命令可以看到)。当有用户连接时,apache会使用一个空闲进程为该连接服务,同时父进程会fork一个子进程。直到内存中的空闲进程达到 MaxSpareServers。该模式是为了兼容一些旧版本的程序。我缺省编译时的选项。
worker:
如果httpd -l列出worker.c,则需要对下面的段进行配置:
StartServers 2 #启动apache时启动的httpd进程个数。
MaxClients 150 #最大并发连接数。
MinSpareThreads 25 #服务器保持的最小空闲线程数。
MaxSpareThreads 75 #服务器保持的最大空闲线程数。
ThreadsPerChild 25 #每个子进程的产生的线程数。
MaxRequestsPerChild 0 #每个子进程被请求服务多少次后被kill掉。0表示不限制,推荐设置为1000。
该模式是由线程来监听客户的连接。当有新客户连接时,由其中的一个空闲线程接受连接。服务器在启动时启动两个进程,每个进程产生的线程数是固定的 (ThreadsPerChild决定),因此启动时有50个线程。当50个线程不够用时,服务器自动fork一个进程,再产生25个线程。
perchild:
如果httpd -l列出perchild.c,则需要对下面的段进行配置:
NumServers 5 #服务器启动时启动的子进程数
StartThreads 5 #每个子进程启动时启动的线程数
MinSpareThreads 5 #内存中的最小空闲线程数
MaxSpareThreads 10 #最大空闲线程数
MaxThreadsPerChild 2000 #每个线程最多被请求多少次后退出。0不受限制
MaxRequestsPerChild 10000 #每个子进程服务多少次后被重新fork。0表示不受限制。
该模式下,子进程的数量是固定的,线程数不受限制。当客户端连接到服务器时,又空闲的线程提供服务。 如果空闲线程数不够,子进程自动产生线程来为新的连接服务。该模式用于多站点服务器。
[转]MySQL服务器优化
根据status信息对MySQL服务器进行优化,网上有很多的文章教怎么配置MySQL服务器,但考虑到服务器硬件配置的不同,具体应用的差别,那些文章的做法只能作为初步设置参考,我们需要根据自己的情况进行配置优化,好的做法是MySQL服务器稳定运行了一段时间后运行,根据服务器的”状态”进行优化。
mysql> show global status;
可以列出MySQL服务器运行各种状态值,另外,查询MySQL服务器配置信息语句:
mysql> show variables;
一、慢查询
mysql> show variables like ‘%slow%’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| log_slow_queries | ON |
| slow_launch_time | 2 |
+——————+——-+
mysql> show global status like ‘%slow%’;
+———————+——-+
| Variable_name | Value |
+———————+——-+
| Slow_launch_threads | 0 |
| Slow_queries | 4148 |
+———————+——-+
配置中打开了记录慢查询,执行时间超过2秒的即为慢查询,系统显示有4148个慢查询,你可以分析慢查询日志,找出有问题的SQL语句,慢查询时间不宜设置过长,否则意义不大,最好在5秒以内,如果你需要微秒级别的慢查询,可以考虑给MySQL打补丁:http://www.percona.com/docs/wiki/release:start,记得找对应的版本。
打开慢查询日志可能会对系统性能有一点点影响,如果你的MySQL是主-从结构,可以考虑打开其中一台从服务器的慢查询日志,这样既可以监控慢查询,对系统性能影响又小。
二、连接数
经常会遇见”MySQL: ERROR 1040: Too many connections”的情况,一种是访问量确实很高,MySQL服务器抗不住,这个时候就要考虑增加从服务器分散读压力,另外一种情况是MySQL配置文件中max_connections值过小:
mysql> show variables like ‘max_connections’;
+—————–+——-+
| Variable_name | Value |
+—————–+——-+
| max_connections | 256 |
+—————–+——-+
这台MySQL服务器最大连接数是256,然后查询一下服务器响应的最大连接数:
mysql> show global status like ‘Max_used_connections’;
MySQL服务器过去的最大连接数是245,没有达到服务器连接数上限256,应该没有出现1040错误,比较理想的设置是:
Max_used_connections / max_connections * 100% ≈ 85%
最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接数上限设置的过高了。
三、Key_buffer_size
key_buffer_size是对MyISAM表性能影响最大的一个参数,下面一台以MyISAM为主要存储引擎服务器的配置:
mysql> show variables like ‘key_buffer_size’;
+—————–+————+
| Variable_name | Value |
+—————–+————+
| key_buffer_size | 536870912 |
+—————–+————+
分配了512MB内存给key_buffer_size,我们再看一下key_buffer_size的使用情况:
mysql> show global status like ‘key_read%’;
+————————+————-+
| Variable_name | Value |
+————————+————-+
| Key_read_requests | 27813678764 |
| Key_reads | 6798830 |
+————————+————-+
一共有27813678764个索引读取请求,有6798830个请求在内存中没有找到直接从硬盘读取索引,计算索引未命中缓存的概率:
key_cache_miss_rate = Key_reads / Key_read_requests * 100%
比如上面的数据,key_cache_miss_rate为0.0244%,4000个索引读取请求才有一个直接读硬盘,已经很BT了,key_cache_miss_rate在0.1%以下都很好(每1000个请求有一个直接读硬盘),如果key_cache_miss_rate在0.01%以下的话,key_buffer_size分配的过多,可以适当减少。
MySQL服务器还提供了key_blocks_*参数:
mysql> show global status like ‘key_blocks_u%’;
+————————+————-+
| Variable_name | Value |
+————————+————-+
| Key_blocks_unused | 0 |
| Key_blocks_used | 413543 |
+————————+————-+
Key_blocks_unused表示未使用的缓存簇(blocks)数,Key_blocks_used表示曾经用到的最大的blocks数,比如这台服务器,所有的缓存都用到了,要么增加key_buffer_size,要么就是过渡索引了,把缓存占满了。比较理想的设置:
Key_blocks_used / (Key_blocks_unused + Key_blocks_used) * 100% ≈ 80%
四、临时表
mysql> show global status like ‘created_tmp%’;
+————————-+———+
| Variable_name | Value |
+————————-+———+
| Created_tmp_disk_tables | 21197 |
| Created_tmp_files | 58 |
| Created_tmp_tables | 1771587 |
+————————-+———+
每次创建临时表,Created_tmp_tables增加,如果是在磁盘上创建临时表,Created_tmp_disk_tables也增加,Created_tmp_files表示MySQL服务创建的临时文件文件数,比较理想的配置是:
Created_tmp_disk_tables / Created_tmp_tables * 100% <= 25% 比如上面的服务器Created_tmp_disk_tables / Created_tmp_tables * 100% = 1.20%,应该相当好了。我们再看一下MySQL服务器对临时表的配置: mysql> show variables where Variable_name in (‘tmp_table_size’, ‘max_heap_table_size’);
+———————+———–+
| Variable_name | Value |
+———————+———–+
| max_heap_table_size | 268435456 |
| tmp_table_size | 536870912 |
+———————+———–+
只有256MB以下的临时表才能全部放内存,超过的就会用到硬盘临时表。
五、Open Table情况
mysql> show global status like ‘open%tables%’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_tables | 919 |
| Opened_tables | 1951 |
+—————+——-+
Open_tables表示打开表的数量,Opened_tables表示打开过的表数量,如果Opened_tables数量过大,说明配置中table_cache(5.1.3之后这个值叫做table_open_cache)值可能太小,我们查询一下服务器table_cache值:
mysql> show variables like ‘table_cache’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| table_cache | 2048 |
+—————+——-+
比较合适的值为:
Open_tables / Opened_tables * 100% >= 85%
Open_tables / table_cache * 100% <= 95% 六、进程使用情况 mysql> show global status like ‘Thread%’;
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| Threads_cached | 46 |
| Threads_connected | 2 |
| Threads_created | 570 |
| Threads_running | 1 |
+——————-+——-+
如果我们在MySQL服务器配置文件中设置了thread_cache_size,当客户端断开之后,服务器处理此客户的线程将会缓存起来以响应下一个客户而不是销毁(前提是缓存数未达上限)。Threads_created表示创建过的线程数,如果发现Threads_created值过大的话,表明MySQL服务器一直在创建线程,这也是比较耗资源,可以适当增加配置文件中thread_cache_size值,查询服务器thread_cache_size配置:
mysql> show variables like ‘thread_cache_size’;
+——————-+——-+
| Variable_name | Value |
+——————-+——-+
| thread_cache_size | 64 |
+——————-+——-+
示例中的服务器还是挺健康的。
七、查询缓存(query cache)
mysql> show global status like ‘qcache%’;
+————————-+———–+
| Variable_name | Value |
+————————-+———–+
| Qcache_free_blocks | 22756 |
| Qcache_free_memory | 76764704 |
| Qcache_hits | 213028692 |
| Qcache_inserts | 208894227 |
| Qcache_lowmem_prunes | 4010916 |
| Qcache_not_cached | 13385031 |
| Qcache_queries_in_cache | 43560 |
| Qcache_total_blocks | 111212 |
+————————-+———–+
MySQL查询缓存变量解释:
Qcache_free_blocks:缓存中相邻内存块的个数。数目大说明可能有碎片。FLUSH QUERY CACHE会对缓存中的碎片进行整理,从而得到一个空闲块。
Qcache_free_memory:缓存中的空闲内存。
Qcache_hits:每次查询在缓存中命中时就增大
Qcache_inserts:每次插入一个查询时就增大。命中次数除以插入次数就是不中比率。
Qcache_lowmem_prunes:缓存出现内存不足并且必须要进行清理以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。(上面的 free_blocks和free_memory可以告诉您属于哪种情况)
Qcache_not_cached:不适合进行缓存的查询的数量,通常是由于这些查询不是 SELECT 语句或者用了now()之类的函数。
Qcache_queries_in_cache:当前缓存的查询(和响应)的数量。
Qcache_total_blocks:缓存中块的数量。
我们再查询一下服务器关于query_cache的配置:
mysql> show variables like ‘query_cache%’;
+——————————+———–+
| Variable_name | Value |
+——————————+———–+
| query_cache_limit | 2097152 |
| query_cache_min_res_unit | 4096 |
| query_cache_size | 203423744 |
| query_cache_type | ON |
| query_cache_wlock_invalidate | OFF |
+——————————+———–+
各字段的解释:
query_cache_limit:超过此大小的查询将不缓存
query_cache_min_res_unit:缓存块的最小大小
query_cache_size:查询缓存大小
query_cache_type:缓存类型,决定缓存什么样的查询,示例中表示不缓存 select sql_no_cache 查询
query_cache_wlock_invalidate:当有其他客户端正在对MyISAM表进行写操作时,如果查询在query cache中,是否返回cache结果还是等写操作完成再读表获取结果。
query_cache_min_res_unit的配置是一柄”双刃剑”,默认是4KB,设置值大对大数据查询有好处,但如果你的查询都是小数据查询,就容易造成内存碎片和浪费。
查询缓存碎片率 = Qcache_free_blocks / Qcache_total_blocks * 100%
如果查询缓存碎片率超过20%,可以用FLUSH QUERY CACHE整理缓存碎片,或者试试减小query_cache_min_res_unit,如果你的查询都是小数据量的话。
查询缓存利用率 = (query_cache_size – Qcache_free_memory) / query_cache_size * 100%
查询缓存利用率在25%以下的话说明query_cache_size设置的过大,可适当减小;查询缓存利用率在80%以上而且Qcache_lowmem_prunes > 50的话说明query_cache_size可能有点小,要不就是碎片太多。
查询缓存命中率 = (Qcache_hits – Qcache_inserts) / Qcache_hits * 100%
示例服务器 查询缓存碎片率 = 20.46%,查询缓存利用率 = 62.26%,查询缓存命中率 = 1.94%,命中率很差,可能写操作比较频繁吧,而且可能有些碎片。
八、排序使用情况
mysql> show global status like ‘sort%’;
+——————-+————+
| Variable_name | Value |
+——————-+————+
| Sort_merge_passes | 29 |
| Sort_range | 37432840 |
| Sort_rows | 9178691532 |
| Sort_scan | 1860569 |
+——————-+————+
Sort_merge_passes 包括两步。MySQL 首先会尝试在内存中做排序,使用的内存大小由系统变量 Sort_buffer_size 决定,如果它的大小不够把所有的记录都读到内存中,MySQL 就会把每次在内存中排序的结果存到临时文件中,等 MySQL 找到所有记录之后,再把临时文件中的记录做一次排序。这再次排序就会增加 Sort_merge_passes。实际上,MySQL 会用另一个临时文件来存再次排序的结果,所以通常会看到 Sort_merge_passes 增加的数值是建临时文件数的两倍。因为用到了临时文件,所以速度可能会比较慢,增加 Sort_buffer_size 会减少 Sort_merge_passes 和 创建临时文件的次数。但盲目的增加 Sort_buffer_size 并不一定能提高速度,见 How fast can you sort data with MySQL?(引自http://qroom.blogspot.com/2007/09/mysql-select-sort.html,貌似被墙)
另外,增加read_rnd_buffer_size(3.2.3是record_rnd_buffer_size)的值对排序的操作也有一点的好处,参见:http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/
九、文件打开数(open_files)
mysql> show global status like ‘open_files’;
+—————+——-+
| Variable_name | Value |
+—————+——-+
| Open_files | 1410 |
+—————+——-+
mysql> show variables like ‘open_files_limit’;
+——————+——-+
| Variable_name | Value |
+——————+——-+
| open_files_limit | 4590 |
+——————+——-+
比较合适的设置:Open_files / open_files_limit * 100% <= 75% 十、表锁情况 mysql> show global status like ‘table_locks%’;
+———————–+———–+
| Variable_name | Value |
+———————–+———–+
| Table_locks_immediate | 490206328 |
| Table_locks_waited | 2084912 |
+———————–+———–+
Table_locks_immediate表示立即释放表锁数,Table_locks_waited表示需要等待的表锁数,如果Table_locks_immediate / Table_locks_waited > 5000,最好采用InnoDB引擎,因为InnoDB是行锁而MyISAM是表锁,对于高并发写入的应用InnoDB效果会好些。示例中的服务器Table_locks_immediate / Table_locks_waited = 235,MyISAM就足够了。
十一、表扫描情况
mysql> show global status like ‘handler_read%’;
+———————–+————-+
| Variable_name | Value |
+———————–+————-+
| Handler_read_first | 5803750 |
| Handler_read_key | 6049319850 |
| Handler_read_next | 94440908210 |
| Handler_read_prev | 34822001724 |
| Handler_read_rnd | 405482605 |
| Handler_read_rnd_next | 18912877839 |
+———————–+————-+
各字段解释参见http://hi.baidu.com/thinkinginlamp/blog/item/31690cd7c4bc5cdaa144df9c.html,调出服务器完成的查询请求次数:
mysql> show global status like ‘com_select’;
+—————+———–+
| Variable_name | Value |
+—————+———–+
| Com_select | 222693559 |
+—————+———–+
计算表扫描率:
表扫描率 = Handler_read_rnd_next / Com_select
如果表扫描率超过4000,说明进行了太多表扫描,很有可能索引没有建好,增加read_buffer_size值会有一些好处,但最好不要超过8MB。
