【html】edm 邮件制作规范,提高打开率

专业的 edm 邮件发送,是有严格的制作要求的,本指南从格式编码、文字、图片及链接四个方面给出指引,请逐条按照本指南制作您的 edm 邮件模板。

格式编码

1、页面宽度请设定在 600px 到 800px 以内,长度 1024px 以内。

2、html 编码请使用 utf-8。

3、html 代码在 15KB 以内。(各个邮箱的收件标准不一样,如果超出 15KB 您的邮件很有可能会进入垃圾箱)

4、请使用 table 表格来布局。同一个 td 里只放一张图片,如 <td><img src=”photo.jpg” /></td>。所有的图片都要定义宽高。同一段文字放在同一 td 里。

5、如果需要邮件居中显示,请在 table 里设定 align=”center”。

6、不可将 word 类文件直接转换为 html 格式,否则会造成编码不规范。

7、不要使用外链的 css 样式定义文字和图片(外链的 css 样式在邮件里将不能被读取,所以发送出去的邮件因为没有链接到样式,将会使你的邮件内容样式丢失),正确的写法:<td style=”font-family:arial;font-size:12px;color:black”>文字</td>。

8、不使用 flash、java、javascript、frames、iframe、activeX 以及 dhtml,如果页面中的图片一定要动态的,请将 flash 文件转换成 gif 动画使用,但在 outlook2007 里,gif 将不能正常显示,因为 outlook2007 限制 gif 动画。

9、不要使用 table 以外的 body、meta 和 html 之类的标签,部分邮箱系统会把这些过滤掉。

10、背景图片代码写法如下:<table background=”background.gif” cellspacing=”0″ cellpadding=”0″></table>,但请注意,outlook 对背景图片不识别。

11、不要出现”onmouseover”、”onmouseout”,即使在 td 里设置了,发送到邮箱后也将被过滤,无法显示设定鼠标经过所显示的内容。

12、font-family 属性不能为空,否则会被 qq 屏蔽为垃圾邮件。

13、若邮件模板内侧边或者上下有空白间距,不要用 padding,必须得用标准的 td 来设定空白间距,否则会导致各个邮箱解析不同。

14、在 yahoo 邮箱里定义 line-height 的注意事项:需在块级元素里定义 line-height。如果 td 里有 p 标签,则 line-height 也必须在 p 中定义。无论是 td 还是 p,如果有超链接,则都必须在 a 标签里定义 line-height。如果只是在 td 或者 p 里面定义 line-height 的话,那 yahoo 邮箱将无法识别 a 里面的行高。

文字

1、邮件主题控制在 18 个字以内,避免使用特殊符号,容易产生乱码。

2、邮件主题和内容都不要加入带有网站地址的信息,比如“xxx.com祝您新年好”。如果客户的品牌知名度比较高,主题可加入公司的名称,比如:“NIKE运动时尚”。

3、文字内容,版面尽量简洁,突出主题,以达到更高的点击率。

4、不使用类似如下敏感及带促销类的文字:免费、优惠、特惠、特价、低价、便宜、廉价、视频、赚钱、群发、发财、致富、代开、薪水、交友、支付、商机、法宝、宝典、秘密、情报、机密、保密、绝密、神秘、秘诀等。如果一定需要,请把敏感字做成图片。

5、如果发送超过 20 万封,主题内容要更换,发送超过 200 万封,要考虑重新设计。

6、文字应尽量定义字体的样式,每个邮箱的默认字体样式不同,为了达到您想要的效果,字体样式一定要定义完整。

图片

1、尽量使用图片,以避免文字在各个主流邮箱中的显示有所不同。例如 qq 邮箱,如果未在代码中设置,邮件中的文字不能自动换行,gmail 邮箱邮件内容的字体会自动放大,与原来设定的字符大小不一致。

2、整页图片控制在 8 张以内,每张图片最大不能超过 15KB。

3、图片地址请不要写成本地路径,例如:<img src=”images/aa.jpg” />,(这样发送出去的邮件,收件人将没办法看到您的图片)。

4、图片名称不能含有 ad 字符,否则图片上传后会显示成“被过滤广告”。

5、如果整个邮件模板只有一张图,一定要裁成 2-3 张小图,并适当保留一些文字。

6、gmail、qq 邮箱的要求又改变,图片的属性一定要定义完整,例如 <img src=”images/1.jpg” style=”vertical-align:top;” height=”30″ width=”100″ alt=”” /> 这里的 style=”vertical-align:top;” 一定要定义,否则图片之间会有缝隙、变形等显示异常的情况。

7、在 img 标签里加上 alt 属性,这样用户在收到邮件的时候,即使有些邮箱将图片隐藏掉,也可以看到 alt 里面的内容。如:<img src=”images/1.jpg” style=”vertical-align:top;” height=”30″ width=”100″ alt=”显示内容” />,让客户了解到邮件内容并吸引客户点击显示图片。

链接

1、链接数量不能超过 10 个,如果所有图片的链接地址一样,请将所有的小图合并成一张大图。

2、链接请写成绝对地址。(以确保收信人在点击链接时能够正常浏览您的内容)。

3、链接地址的长度不能超过 255 个字符,会导致无法追踪或链接错误。

4、不要使用地图功能(map)链接图片,此功能会使邮件被多数邮箱划分为垃圾邮件。

5、为避免用户收到的邮件图片无法浏览,请制作一份和邮件内容一样的 web 页面,然后在邮件顶部注明:“如果您无法查看邮件内容,请点击这里”,链接到访友同样内容的 web 页面。

6、文字中出现网站地址链接被屏蔽为垃圾邮件的风险是极高的,例如:http://xxx.com此类链接,建议写成“XXX公司”文字加链接,或是将网址做成图片加链接。

7、链接里面最好不要使用特殊符号,避免邮箱解析错误。

8、链接代码应尽量简短,代码太长会增加模板大小,进而会影响邮件发送效果。

outlook 规则

1、col 标签不能被识别,如果要定义几个 td 相同的宽度,可以把具体的宽度写在具体的 td 里。例如<td width=””></td>。

2、内联元素的 padding 无法被识别,例如 <a href=”#” style=”padding-left:40px;”></a>,a 标签里面的内容并不会距离左边 40px。可以在 td 里定义 padding。

3、内联元素的 vertical-align 不能被识别,例如 <img src=”1.jpg” style=”vertical-align:bottom” />,此图片并不会和相同行的元素底对齐,可以写成 <td valign=”bottom”><img src=”1.jpg” /></td> 即可。

4、如果 td 里包含一个 table,那么定义在子 table 里的标签的样式只会正确显示定义在子 table 里的样式,在父 table 的样式是不能正确显示的。注意:如果在 table 里有 a 标签的话,则 a 标签中的内容的颜色样式要定义在 a 标签内,定义在父 td 里或所在的 table 里都是无效的。

5、如果 td 和 td 之间有间隔,使用 <td style=”border-bottom:10px solid #fff”></td>,这样写的话 td 之间是不会有间隔的。使用 <td style=”margin-bottom: 10px”></td> 也是不会有空格的。如果 td 之间有间隙,必须用 <td></td><td height=”10px”>&nbsp;</td><td></td> 来隔开。但是如果是 table,则 <table style=”border-top:10px solid #ffffff; border-bottom:20px solid #ffffff”></table> 里面的内容会在上下有空行。

6、p 标签的 width 是不认识的,例如 <p style=” width:320px” ></p>,则 p 标签中的内容不会在 320px 处自动换行。只有 td 设置了宽度,内容才会在宽度限制处换行。

7、如果要使用 p 标签要考虑到 p 标签本身自带的上下行之间的行高。

8、在 td 里设置 margin 是无效的,不论是 margin-left、margin-right、margin-top 或者 margin-boottom 都没有效果。

9、当设置 <img align=”left” /> 或 <img align=”right” /> 时,图片会脱离文档流,在其父元素设置了 margin 或 padding 的话,都无法使其下移,左移或右移。

10、在 outlook 中,如果嵌套的图片太长,会导致显示不正常,可将图片裁切成几张较短的小图,再进行布局。

PS:红色部分为新增加的内容。

UCloud云分发UCDN价格和计费说明,最便宜5Gbps起的带宽峰值计算办法2.4万/G/月

云分发 UCDNUCDN(UCloud Content Delivery Network)服务,即内容分发网络,UCloud CDN将用户的加速内容分发至部署在全球的近500个服务节点,并进行智能调控和缓存,为用户计算最近的访问节点,提供给客户更好更快的网络体验。最便宜5G起的带宽峰值计算办法2.4万/G/月

按流量计费

带宽范围 国内流量 国际流量
1GB~1TB 0.45元/GB 0.45元/GB
1TB~10TB 0.40元/GB 0.40元/GB
10TB~50TB 0.36元/GB 0.36元/GB
50TB~100TB 0.32元/GB 0.32元/GB
>100TB 0.28元/GB 0.28元/GB

按带宽计费,5Gbps以上用户,0.8元/M/天=2.4万/G/月

带宽区间 国内带宽单价 (元/Mbps/天) 国际带宽单价 (元/Mbps/天)
0Mbps-500Mbps 1.10 1.10
500Mbps-5Gbps 0.90 0.90
>5Gbps 0.80 0.80

按宽峰值带宽计费是以您CDN服务产生的带宽最高值(单位Mbps)为结算标准;按峰值带宽计费示

腾讯云CDN价格和计费说明,最便宜50Gbps起带宽峰值计算办法2.22万/G/月

1. CDN计费模式说明

CDN计费分两种方式:带宽、流量。用户在控制台开通CDN的时候可以选择计费方式。

用户也可以灵活的在带宽、流量2种计费方式之间切换,计费方式修改的生效时间为下一个计费周期。

计费模式 概念解释 优势
按带宽峰值计费 每5分钟统计一个带宽峰值(单位Mbps),每日得到288个峰值,取日95去峰带宽值为每日带宽峰值,把当月每日带宽峰值的总和 / 当月CDN使用的有效天数,得到月日均带宽峰值作为结算标准。 业务曲线比较平稳,按月统计周期内带宽利用率大于30%的用户适合使用按带宽计费。

带宽利用率 = 实际使用流量/峰值带宽100%利用率产生的流量,1Mbps带宽每日100%利用率产生的流量约为10.54GB。

按流量计费 按照每月使用的实际流量作为结算标准。 业务曲线波动较大,按月统计周期内流量利用率小于30%的用户适合使用按流量计费。
预付费流量包 用户可以在CDN流量包购买页面预付费购买从下个月开始12个月内的CDN流量包;

使用流量包时要指定生效月份,在该月份内如果实际使用流量超过了预付费购买的流量包,每个月5日月结时会扣除上月超出部分的流量费用。

相同流量的流量包价格比后付费流量结算略便宜。

2. CDN带宽计费

2.1 CDN带宽价格

计费模式 带宽阶梯 单价(元/Mbps/天)
月日均带宽峰值 0-512 Mbps 1.1
512 Mbps-5 Gbps 1
5 Gbps-50 Gbps 0.9
大于等于50 Gbps 0.74

2.2按带宽峰值计费规则

付费方式 后付费
计费周期 按月计费,每个月5日月结时,从腾讯云费用账户扣除上个月带宽费用,并按照上个月费用的120%进行费用冻结;

下个月结算时会对冻结的费用先解冻,再进行扣除。

计费方式 取日95去峰带宽值为当日带宽峰值,按使用天数及每日带宽峰值统计月日均峰值带宽为结算标准(月日均带宽峰值=当月每日带宽峰值的总和 / 当月CDN使用的有效天数),按带宽阶梯价格计费。

设当月CDN月均带宽峰值为X Mbps,当月CDN使用有效天数为Y,当月CDN带宽结算费用为Z:
当 X < 512,Z = X *1.1 *Y 
当 512 ≦ X < 5120, Z = [512*1.1 + (X-512)*1.0 ] *Y 
当 5120 ≦ X < 51200, Z = [512*1.1 + (5120-512)*1.0 + (X-5120)*0.9] * Y
当 X ≧ 51200,Z= [512*1.1 + (5120-512)*1.0 + (51200-5120)*0.9 + (X-51200)*0.74 ]* Y

3. CDN流量计费

3.1 CDN流量价格

计费模式 流量阶梯 单价(元/GB)
月流量 0GB-2TB 0.34
2TB-10TB 0.32
10TB-50TB 0.3
50TB-100TB 0.28
大于等于100TB 低于0.25,签线下合同

3.2 按流量计费规则

付费方式 后付费
计费周期 按月计费,每个月5日月结时,从腾讯云费用账户扣除上个月流量费用,并按照上个月费用的120%进行费用冻结;

下个月结算时会对冻结的费用先解冻,再进行扣除。

计费方式 以当月实际流量为结算标准,按流量阶梯价格计费。

设当月CDN流量X TB,当月CDN流量结算费用为Y:
当 X < 2,Y = X*1024*0.34
当 2 ≦ X < 10, Y = 2*1024*0.34 + (X-2) *1024*0.32
当 10 ≦ X < 50, Y = 2*1024*0.34 +8 *1024*0.32 + (X-10) *1024*0.3
当 X ≧ 50, Y = 2*1024*0.34 + 8 *1024*0.32 +40 *1024*0.3 + (X-50) *1024*0.28

4. CDN流量包计费

4.1 流量包价格

用户可以在CDN流量包购买页面查看预付费流量包价格。 

4.2 流量包使用规则

用户可以在CDN流量包购买页面预付费购买CDN流量包;购买成功的流量包当日即生效。
付费购买的流量包使用有效期为自购买之日起6个月内;活动特惠流量包的有效期由具体活动指定,一般为1个月。
流量包内的流量仅能在生效月份内使用,生效月份内流量没有使用完,过期后均视为失效,平台不进行费用退还。

4.3 流量包计费

付费方式 预付费 + 超出部分后付费
计费周期 按月计费,每个月5日月结,超出预付费流量包部分流量按后付费结算,从腾讯云费用账户扣除上个月流量费用,并按照上个月费用的120%进行费用冻结;

下个月结算时会对冻结的费用先解冻,再进行扣除。

计费方式 预付费流量包需先购买,并指定生效月份。当月实际流量超出流量包部分,按流量阶梯价格计费。

5. 计费计算器

您可以使用计费计算器进行费用预估。输入栏输入您的月均带宽峰值(尽量95去峰后,会更准确)和总流量数值,输出栏输出为CDN月费用数据。

6. 大客户计费洽谈

若已经在腾讯云或未来预期可在腾讯云的月消耗金额>10W的客户,可以通过商务洽谈获得更优惠的价格,以及更灵活的计费方式(第4峰值,按日95去峰,按月95去峰等)。

阿里CDN价格总览及计费停服规则,最便宜5Gbps起峰值带宽计费2.28万/G/月

阿里CDN价格总览及计费停服规则:1、按[流量]计费说明,根据流量阶梯大于100TB,0.26元/GB;2、按[峰值带宽]计费说明,根据峰值带宽阶梯最便宜算0.76元/Mbps/日=2.28万/G/月。

  • 计费项:下行流量
流量阶梯 新价格(元/GB)
0GB-10TB(含) 0.36
10TB-50TB(含) 0.32
50TB-100TB(含) 0.30
大于100TB 0.26

注: 为防止异常的恶意流量给用户造成损失,按流量付费方式,默认带宽上限为10Gbps

  • 计费规则

    1. 计费项:流量
    2. 付费方式:后付费
    3. 计费规则:按流量阶梯价格计费,当月超额累进(以自然月为一个累计周期)
    4. 计费周期:按小时计费,实时扣费(每小时出账单并扣费)
  • 流量账单收费示例

    5月1日0:00至5月15日8:00累计消耗的流量为10200GB,5月15日8:00至5月15日9:00消耗的流量为90GB(注:10TB = 10240GB),则5月15日8:00到9:00产生账单金额为40GBx0.36元/GB+50GBx0.32元/GB=30.40元 (即从10200GB起算,40G在0GB – 10TB阶梯内,单价为0.36元/GB;50G在10TB – 50TB阶梯内,单价为0.32元/GB)

说明:

账单出账时间为当前计费周期结束。账单出账时间通常在当前计费周期结束后一小时内, 例10:00-11:00的账单会在11:00以后生成, 具体以系统出账时间为准,账单生成后会自动从您的账户余额中扣除费用以结算账单。

  • 计费项:峰值带宽
峰值带宽阶梯 价格(元/Mbps/日)
0-512Mbps 1.00
512Mbps-5Gbps 0.90
大于5Gbps 0.76

注: 按宽峰值计费是以您CDN服务产生的带宽最高值(单位Mbps)为结算标准.

注: 按峰值带宽方式,默认带宽上限支持100Gbps,需要更大的用量,请联系我们.

  • 计费规则

    计费项:峰值带宽

    1. 付费方式:后付费
    2. 计费规则:按峰值带宽阶梯价格计费,当日超额累进(以自然日为一个累计周期)
    3. 计费周期:按日计费,实时扣费(每日零点后出前一日账单并扣费,具体出账时间以系统为准)。
  • 按峰值带宽账单收费示例

    用户当日的峰值带宽为912Mbps,则用户的账单费用应为512×1.0元+400×0.9元=872元(小于512Mbps单价为1.0元,大于512Mbps小于5Gpbs单价为0.9元)

说明:

  • 账单出账时间为当前计费周期结束(自然日)。账单出账时间通常在当前计费周期结束后一小时内, 6月17日的账单会在6月18日零点以后生成, 具体以系统出账时间为准,账单生成后会自动从您的账户余额中扣除费用以结算账单。
  • 按宽峰值带宽计费是以您CDN服务产生的带宽最高值(单位Mbps)为结算标准

系统以5分钟为时间粒度,采集CDN全网节点的域名汇总数据,一天采集288个点,做为计费依据。

  1. 当您未付清CDN服务产生的账单,则服务处于欠费状态。
  2. 服务欠费后延时24小时停服,在欠费后24小时内会以短信/邮件的方式提醒用户尽快支付账单,在欠费后24小时内进行充值,您的服务将不会受到停服影响;
  3. 如您未在欠费后24小时内未能及时充值。CDN服务将停止服务;停止服务后,CDN也将停止计费。您所占用的Cache资源将被释放,配置信息保留12个月。
  1. 按流量计费:系统根据CDN服务最近7小时的账单应付金额平均值来判断用户账户余额是否足以支付其CDN服务下3个账期的费用,如果不足以支付将给予短信/邮件提醒;
  2. 按峰值带宽计费:系统根据CDN服务最近前一个计费周期(天)的账单应付金额值来判断用户账户余额是否足以支付其CDN服务下一个计费周期(天)的费用,如果不足以支付将给予短信/邮件提醒;
  3. 如果您开启了余额预警(控制台中>账户管理>余额预警开关),当账户余额小于用户设定的预警值时将给予您短信/邮件提醒。

在控制台上看到的流量,是我们应用层日志统计出的流量,但是实际产生的网络流量却要比应用层统计到的流量要高出7%-15%;这个主要的原因有两个:

1、TCP/IP包头的消耗:众所周知,我们的HTTP请求是基于TCP/IP协议的,现有的互联网中,每个包的大小最大是1500个字节,而这1500个字节 中,就包含了TCP和IP协议插进来的40个字节的包头,包头部分,也会产生流量,但是,这个加包头的动作是由内核层 的协议栈完成的,无法被应用层统计到,日志里也就不会记这40个字节的流量了,这部分的流量,会占到我们通过日志 计算出流量的2.74%(40/1460)以上,正常情况下,会占到3%左右。

2、TCP重传:根据互联网物理网络的负载情况,正常情况下,我们所发送的包会有3-10%左右会被互联网丢弃掉,被丢弃掉之后,服 务器会对丢弃的部分进行重传,重传动作是由内核层协议栈处理的,应用层也无法统计到,这部分流量占我们日志计算 出流量的比例,根据网络的好坏而不等,在凌晨,互联网轻载的情况下,重传率会较低;在晚高峰,互联网重载的时候 ,重传会上升,一般情况下,在3%-7%之间。

因此在业界标准中,会在原有流量的基础上再加上7%-15%的网络消耗做为计费流量统计,我们取最小值7%做为网络消耗统计。

  • 由于LocalDNS服务器有缓存,停用CDN服务后,若缓存未过期,LocalDNS还会把针对已停用CDN域名的请求直接打到CDN节点,造成少量CDN流量计费。
  • 一些下载类软件也存在LocalDNS缓存,在这部分缓存过期前,已停用的CDN还会造成少量的CDN节点流量计费

星域CDN(即迅雷CDN)价格表,最便宜500Gbps峰值带宽9999元/G/月,小于5G 12999元/G/月

根据星域CDN(迅雷CDN)官网公布当你的带宽达到500Gbps才是9999元/G/月,但绝对部分用户达不到这个,我想应该都是5G以下,价格是12999元/G/月,星域CDN(迅雷CDN)价格原网参考如下:

适用方案:视频点播、游戏下载、移动应用、智能硬件

计费方式 使用量级 单价
带宽计费 0–5Gbps 12999元/G/月
5–50Gbps 11999元/G/月
50–500Gbps 10999元/G/月
500Gbps以上 9999元/G/月
流量计费 0–50TB 0.15元/GB
50TB–0.5PB 0.13元/GB
0.5PB–50PB 0.12元/GB
50PB以上 0.10元/GB

适用方案:视频直播

计费方式 使用量级 单价
带宽计费 不限 15000元/G/月

*充值用户享受官网阶梯价格累计。

*预付费购买流量,按日使用流量,在监控平台可以查询流量明细。

申请完成后,迅雷会发送一封激活邮件:

QQ截图20150910162707.jpg

点击邮件即可以激活500G

QQ截图20150910162849.jpg

星域CDN(迅雷CDN)价格原网参考:http://xycdn.com/site/price

最全解决方法phpcms V9 前台和后台登陆验证码无法显示问题

首先说过下 如果问题帮您解决了 你们就回复一下 顶一下帖子 我不喜欢设置回复 因为很多人根本就没有注册论坛账号所以进来看到了自己需要的答案  而被设置了要回复才能看到的时候 他们就会去注册 但是注册了要60分钟后才能回复 所以很急人的(我亲身体验 苦苦等了60分钟)   所以 你们喜欢的 解决问题的 记得顶帖子 我会爱死你们的 呵呵

好了不废话了 下面发解决方法



1:首先第一种(我就是用这个方法解决的,很多人用的是免费空间,但是往往免费空间是没有客服的 所以我们只能靠自己来解决了。)

可以偿试通过修改”/caches/configs/system.php”当中的:



‘session_storage’ => ‘mysql’,



将其修改为



‘session_storage’ => ‘files’,



然后保存下来 上传进去的时候选择覆盖(右键-打开方式-文本文件打开)

然后清除自己浏览器的COOKS  再次登录后台(这里再提供一下  如果你首次安装的时候是乱码的    您可以通过FTP连接后找到caches这个目录下configs这个文件夹下的system.php,下载到本地,修改其中的gzip => 1,其中的1改为0保存然后上传覆盖就可以了

)_





2:如果不是路径问题 也不是CD库问题

解决办法:重启APACHE服务器





3:

找到

./phpcms/libs/classes/session_mysql.class.php
./phpsso_server/phpcms/libs/classes/session_mysql.class.php
(其实这个文件我是在Web/phpsso_server/caches/configs/ 找到的   这一个解决方法我是在百度找到的 如果有疑问可以不要试  )



phpcms/libs/classes/session_mysql.class.php



将行21:session_start();放到行20:session_set_save_handler(array(&$thi….

之前

结论:官方的代码不规范

然后清除自己浏览器的COOKS  再次登录后台













以上方法为我亲自试验过的  目前是第一个方法我成功了  如果有不对的地方还请明示  如果好 还请版主帮我加精 谢谢啦

centos下,使用postfix实现php发送mail功能

1、centos下安装postfix,执行命令:

# yum -y install postfix popa3d

如果不需要pop3服务,把popa3d去掉

2、在php.ini配置文件上,设置mail函数:
1)打开php.ini配置,下面是我的php.ini路径:

# vi /usr/local/php/etc/php.ini


2)找到:sendmail_path ,将其设置为:


sendmail_path = /usr/sbin/sendmail -t

注意:这里需要先到/usr/sbin/ 目录中,确认是否存在sendmail文件。

3、启动postfix:

# /etc/init.d/postfix start

4、重启php-fpm:

# /etc/init.d/php-fpm  restart

5、以上完成。你可以写一个发送email的php文件做测试,如下:

<?php
$send = mail(‘yourEmail@test.com’, ‘My Subject’, ‘The test mail’);
if($send){
echo ‘true’;
}else{
echo ‘false’;
}
?>
以上,运行如果显示true,则,你将会在‘yourEmail@test.com’中收到一封主题为’My Subject’的email。

 

如果要限制外来主机访问smtp服务,修改/etc/postfix/main.cf里的

inet_interfaces=all

inet_interfaces=localhost

Mysql CPU占用高原因分析及解决方法

最近发现php网站发布信息比较慢,而且同网站目录下的php经常登录后立即就重新登录,立即考虑到服务器资源占用问题,所以进服务器看到原来mysql占用率较高 25-60%左右,偶尔能跑到100%,所有导致上述问题的发生

通过以前对mysql的操作经验,先将mysql的配置问题排除了,查看msyql是否运行正常,通过查看mysql data目录里面的*.err文件(将扩展名改为.txt)记事本查看即可。如果过大不建议用记事本了,容易死掉,可以用editplus等工具



简单的分为下面几个步骤来解决这个问题:



1、mysql运行正常,也有可能是同步设置问题导致



2、如果mysql运行正常,那就是php的一些sql语句导致问题发现,用root用户进入mysql管理

mysql -u root -p

输入密码

mysql:show processlist 语句,查找负荷最重的 SQL 语句,优化该SQL,比如适当建立某字段的索引。



通过这个命令我看到原来是有人恶意刷搜索,因为dedecms搜索后面调用搜索最高的词,导致很多人用工具刷这个,而且是定时有间隔的,所以将这个php程序改名跳转都方法解决了。



当然如果你的确实是sql语句用了大量的group by等语句,union联合查询等肯定会将mysql的占用率提高。所以就需要优化sql语句,网站尽量生成静态的,一般4W ip的静态网站,mysql占用率几乎为0的。所以这对于程序员的经验是个考虑。尽量提高mysql性能 (MySQL 性能优化的最佳20多条经验分享)



下面是脚本之家收集的文章,大家都可以参考下
MYSQL CPU 占用 100% 的现象描述 



早上帮朋友一台服务器解决了 Mysql cpu 占用 100% 的问题。稍整理了一下,将经验记录在这篇文章里 

朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL 服务进程 (mysqld-nt.exe) CPU 占用率总为 100% 高居不下。此主机有10个左右的 database, 分别给十个网站调用。据朋友测试,导致 mysqld-nt.exe cpu 占用奇高的是网站A,一旦在 IIS 中将此网站停止服务,CPU 占用就降下来了。一启用,则马上上升。 



MYSQL CPU 占用 100% 的解决过程 



今天早上仔细检查了一下。目前此网站的七日平均日 IP 为2000,PageView 为 3万左右。网站A 用的 database 目前有39个表,记录数 60.1万条,占空间 45MB。按这个数据,MySQL 不可能占用这么高的资源。 



于是在服务器上运行命令,将 mysql 当前的环境变量输出到文件 output.txt: 



d:\web\mysql> mysqld.exe –help >output.txt 

发现 tmp_table_size 的值是默认的 32M,于是修改 My.ini, 将 tmp_table_size 赋值到 200M: 



d:\web\mysql> notepad c:\windows\my.ini 

[mysqld] 

tmp_table_size=200M 



然后重启 MySQL 服务。CPU 占用有轻微下降,以前的CPU 占用波形图是 100% 一根直线,现在则在 97%~100%之间起伏。这表明调整 tmp_table_size 参数对 MYSQL 性能提升有改善作用。但问题还没有完全解决。 



于是进入 mysql 的 shell 命令行,调用 show processlist, 查看当前 mysql 使用频繁的 sql 语句: 



mysql> show processlist; 

反复调用此命令,发现网站 A 的两个 SQL 语句经常在 process list 中出现,其语法如下: 



SELECT t1.pid, t2.userid, t3.count, t1.date 

FROM _mydata AS t1 

LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid 

LEFT JOIN _mydata_body AS t2 ON t1.pid=t3.pid 

ORDER BY t1.pid 

LIMIT 0,15 

调用 show columns 检查这三个表的结构 : 



mysql> show columns from _myuser; 

mysql> show columns from _mydata; 

mysql> show columns from _mydata_body; 

终于发现了问题所在:_mydata 表,只根据 pid 建立了一个 primary key,但并没有为 userid 建立索引。而在这个 SQL 语句的第一个 LEFT JOIN ON 子句中: 



LEFT JOIN _myuser AS t3 ON t1.userid=t3.userid 

_mydata 的 userid 被参与了条件比较运算。于是我为给 _mydata 表根据字段 userid 建立了一个索引: 



mysql> ALTER TABLE `_mydata` ADD INDEX ( `userid` ) 

建立此索引之后,CPU 马上降到了 80% 左右。看到找到了问题所在,于是检查另一个反复出现在 show processlist 中的 sql 语句: 



SELECT COUNT(*) 

FROM _mydata AS t1, _mydata_key AS t2 

WHERE t1.pid=t2.pid and t2.keywords = ‘孔雀’ 

经检查 _mydata_key 表的结构,发现它只为 pid 建了了 primary key, 没有为 keywords 建立 index。_mydata_key 目前有 33 万条记录,在没有索引的情况下对33万条记录进行文本检索匹配,不耗费大量的 cpu 时间才怪。看来就是针对这个表的检索出问题了。于是同样为 _mydata_key 表根据字段 keywords 加上索引: 



mysql> ALTER TABLE `_mydata_key` ADD INDEX ( `keywords` ) 

建立此索引之后,CPU立刻降了下来,在 50%~70%之间震荡。 



再次调用 show prosslist,网站A 的sql 调用就很少出现在结果列表中了。但发现此主机运行了几个 Discuz 的论坛程序, Discuz 论坛的好几个表也存在着这个问题。于是顺手一并解决,cpu占用再次降下来了。(2007.07.09 附注:关于 discuz 论坛的具体优化过程,我后来另写了一篇文章,详见:千万级记录的 Discuz! 论坛导致 MySQL CPU 100% 的 优化笔记 http://www.xiaohui.com/dev/server/20070701-discuz-mysql-cpu-100-optimize.htm) 



解决 MYSQL CPU 占用 100% 的经验总结 



增加 tmp_table_size 值。mysql 的配置文件中,tmp_table_size 的默认大小是 32M。如果一张临时表超出该大小,MySQL产生一个 The table tbl_name is full 形式的错误,如果你做很多高级 GROUP BY 查询,增加 tmp_table_size 值。 这是 mysql 官方关于此选项的解释: 

tmp_table_size 



This variable determines the maximum size for a temporary table in memory. If the table becomes too large, a MYISAM table is created on disk. Try to avoid temporary tables by optimizing the queries where possible, but where this is not possible, try to ensure temporary tables are always stored in memory. Watching the processlist for queries with temporary tables that take too long to resolve can give you an early warning that tmp_table_size needs to be upped. Be aware that memory is also allocated per-thread. An example where upping this worked for more was a server where I upped this from 32MB (the default) to 64MB with immediate effect. The quicker resolution of queries resulted in less threads being active at any one time, with all-round benefits for the server, and available memory. 



对 WHERE, JOIN, MAX(), MIN(), ORDER BY 等子句中的条件判断中用到的字段,应该根据其建立索引 INDEX。索引被用来快速找出在一个列上用一特定值的行。没有索引,MySQL不得不首先以第一条记录开始并然后读完整个表直到它找出相关的行。表越大,花费时间越多。如果表对于查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要考虑所有数据。如果一个表有1000行,这比顺序读取至少快100倍。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。 



根据 mysql 的开发文档: 



索引 index 用于: 



快速找出匹配一个WHERE子句的行 

当执行联结(JOIN)时,从其他表检索行。 

对特定的索引列找出MAX()或MIN()值 

如果排序或分组在一个可用键的最左面前缀上进行(例如,ORDER BY key_part_1,key_part_2),排序或分组一个表。如果所有键值部分跟随DESC,键以倒序被读取。 



在一些情况中,一个查询能被优化来检索值,不用咨询数据文件。如果对某些表的所有使用的列是数字型的并且构成某些键的最左面前缀,为了更快,值可以从索引树被检索出来。 



假定你发出下列SELECT语句: 



mysql> SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2; 

如果一个多列索引存在于col1和col2上,适当的行可以直接被取出。如果分开的单行列索引存在于col1和col2上,优化器试图通过决定哪个索引将找到更少的行并来找出更具限制性的索引并且使用该索引取行。 

MySQL 有关“InnoDB: Error: log file ib_logfile0 is of different size 0 5242880 bytes”错误

1,查看Mysqld mysql.err 日志,发现以下错误:

150811 08:51:02 mysqld_safe Starting mysqld daemon with databases from /home/mysql/var
150811  8:51:02 [Warning] The syntax ‘–log-slow-queries’ is deprecated and will be removed in a future release. Please use ‘–slow
-query-log’/’–slow-query-log-file’ instead.
150811  8:51:02 InnoDB: The InnoDB memory heap is disabled
150811  8:51:02 InnoDB: Mutexes and rw_locks use GCC atomic builtins
150811  8:51:02 InnoDB: Compressed tables use zlib 1.2.3
150811  8:51:02 InnoDB: Initializing buffer pool, size = 256.0M
150811  8:51:02 InnoDB: Completed initialization of buffer pool
InnoDB: Error: log file /home/mysql/var/ib_logfile0 is of different size 0 5242880 bytes
InnoDB: than specified in the .cnf file 0 67108864 bytes!
150811  8:51:02 [ERROR] Plugin ‘InnoDB’ init function returned error.
150811  8:51:02 [ERROR] Plugin ‘InnoDB’ registration as a STORAGE ENGINE failed.
150811  8:51:02 [ERROR] Unknown/unsupported storage engine: InnoDB
150811  8:51:02 [ERROR] Aborting
150811  8:51:02 [Note] /usr/local/mysql/bin/mysqld: Shutdown complete
150811 08:51:02 mysqld_safe mysqld from pid file /home/mysql/var/centos.pid ended

2,解决办法

If you want to change the number or the size of your InnoDB log files, you
have to shut down MySQL and make sure that it shuts down without errors.
Then copy the old log files into a safe place just in case something went
wrong in the shutdown and you will need them to recover the database. Delete
then the old log files from the log file directory, edit my.cnf, and start
MySQL again. InnoDB will tell you at the startup that it is creating new log
files.

在你修改my.cnf的innodb_log_file_size参数前,请先停止mysql服务程序的运行(mysql的停止没有出现任何错误),并把/var/lib/mysql目录下的ib_logfile0、ib_logfile1、ib_logfile2等之类的文件移除到一个安全的地方(旧日志文件的保留是为了防止意外的出现),以便Mysql重启后可以将新的ib_logfile0之类日志文件生成到/var/lib/mysql目录下。如果没有什么意外,旧的日志文件可以删除。

让history显示详细执行时间,及linux历史命令使用技巧

history命令主要用于显示历史指令记录内容和曾经执行过的指令 。经常使用Linux命令会有助于提升你的工作效率。

当一台服务器有多人管理时,可能会出现一些误操作或者重复操作,出现问题的时侯要查询什么时间执行什么命令,由于Linux默认的history记录仅保存了命令的内容,没有具体的时间,因此,我们有必要对history历史命令的记录功能进行优化,具体分为设置保存历史命令history的文件大小,保存历史命令history的条数,保存每条历史命令history的执行时间,方法如下:

[fcbu.com@localhost ~]# vi /etc/bashrc

#未尾添加如下信息

# 设置保存历史命令的文件大小

export HISTFILESIZE=500000000

# 保存历史命令条数

export HISTSIZE=1000000

# 实时记录历史命令,默认只有在用户退出之后才会统一记录,很容易造成多个用户间的相互覆盖。

export PROMPT_COMMAND=”history -a”

# 记录每条历史命令的执行时间

export HISTTIMEFORMAT=”%Y/%m/%d %H:%M:%S ”

使更改立即生效

# source /etc/bashrc

linux历史命令使用技巧

列出所有的历史记录:

[fcbu.com@localhost ~]# history

只列出最近10条记录:

[fcbu.com@localhost ~]# history 10 (注,history和10中间有空格)

使用命令记录号码执行命令,执行历史清单中的第99条命令

[fcbu.com@localhost ~]#!99 (!和99中间没有空格)

重复执行上一个命令

[fcbu.com@localhost ~]#!!

执行最后一次以rpm开头的命令(!?  ?代表的是字符串,这个String可以随便输,Shell会从最后一条历史命令向前搜索,最先匹配的一条命令将会得到执行。)

[fcbu.com@localhost ~]#!rpm

逐屏列出所有的历史记录:

[fcbu.com@localhost ~]# history | more

立即清空history当前所有历史命令的记录

[fcbu.com@localhost ~]#history -c

通过指定关键字来执行以前的命令

在下面的例子,输入 !ps 并回车,将执行以 ps 打头的命令

history命令的用途确实很大!但需要小心安全的问题!尤其是 root 的历史纪录档案,这是黑客们的最爱!因为不小心的 root 会将很多的重要资料在执行的过程中会被纪录在 ~/.bash_history 当中,如果这个档案被解析的话,后果不堪设想!

使用 HISTFILE 更改历史文件名称

默认情况下,命令历史存储在 ~/.bash_history 文件中。添加下列内容到 .bash_profile 文件并重新登录 bash shell,将使用 .commandline_warrior 来存储命令历史:

[fcbu.com@localhost ~]# vi ~/.bash_profile

HISTFILE=/root/.commandline_log

使用 -c 选项清除所有的命令历史,如果你想清除所有的命令历史,可以执行:

[fcbu.com@localhost ~]# history -c