repair无法修复表,改如何处理?

有台服务器,前几天异常断电,就是杭州世导,这个垃圾机房,据说里面员工两个月没发薪水了。

恢复供电后,麻烦出来了,大量myisam表损坏,用check和repair还修复不了,直接报Record at pos: XXXXX  is not remove-marked

没办法只能用myisam表专用修复工具myisamchk修复,具体命令如下:

/mysqlpath/bin/myisamchk -f /mysqlpath/data/databasesname/tablename.MYI

命令行回显如下:

Checking MyISAM file: /mysqlpath/data/databasesname/tablename.MYI
Data records:  192465   Deleted blocks:       0
myisamchk: warning: Table is marked as crashed and last repair failed
myisamchk: warning: 2 clients are using or haven't closed the table properly
- check file-size
myisamchk: warning: Size of datafile is: 13150080        Should be: 13149600
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
myisamchk: error: Found 192472 keys of 192465
- recovering (with sort) MyISAM-table '/mysqlpath/data/databasesname/tablename.MYI'
Data records: 192465
- Fixing index 1
- Fixing index 2
Data records: 192472

就此修复。

有些表在phpmyadmin下直接就可以看出来表损坏,有些表表面上看不出来,插入的时候报主键冲突,但是冲突的主键在表里又查不到,check一下发现还是表损坏了,继续用myisamchk修复。

世导,快倒闭吧。

js分行读取textarea内容

js读取textarea并不是问题,问题在分行读取,这里有浏览器兼容性问题,ie下,textarea里的回车换行是两个字符\r\n,而其他浏览器,比如chrome里是一个字符\n,要解决这个兼容性问题。

<textarea id="mytext"></textarea>
<input type="button" onclick="show()">
<script language="javascript">
	function show(){
txt = document.getElementById("mytext").value;
arr = txt.split("\n");
alert(arr[0].length);
}
</script>

在不同浏览器下,试一下这段代码,看第一行长度如何?

最佳的办法是用\n分隔,然后再去掉末尾的\r,如果有的话。

nginx禁止ip访问

在server区直接写上

deny ip;

比如:

deny 192.168.0.3;

如果是deny all;就是禁止所有外部访问,一般是对某些目录的设置,比如放置配置文件、框架核心文件、保密文件等目录。

deny 192.168.0.1/255;#禁止整个网段访问。

测试了一下一个天天来抓我日志的博客ip,看看是否有效。。。

thinkphp的一些优化

1、生成运行时文件,这个runtime.php将合并所有用到的php文件到一个文件中,减少include的开销,直接在index.php里设置

define(‘NO_CACHE_RUNTIME’,false);

2、关闭调试模式,config.php

‘APP_DEBUG’=> false

3、开启模板缓存,config.php

‘TMPL_CACHE_ON’   => true

4、关闭日志功能,config.php

‘LOG_RECORD’=>false

5、开启动态页面浏览器端缓存,在index.php最前面加上

session_cache_limiter(‘public’);

注:数据变化快的动态页慎用,要强刷才会去服务器请求更新

6、去掉X-Powered-By:ThinkPHPxxx

header会输出这么一条信息,是thinkphp自己输出的,很是讨厌,就怕谁不知道用的是think?

ThinkPHP/Lib/Think/Core/View.class.php

找到header(“X-Powered-By:ThinkPHP”),注释掉

 

 

 

 

开锁君开锁实录

昨晚把钥匙锁房间里了,打电话叫来开锁君,此君一看就是道上之人,瘦、精,眼神也和常人不一样。

开锁君拿出一套工具,开始捣腾防盗门,先是拿出两个细钩子,在锁眼里捅啊捅,一个楼梯灯时间过去了,两个,三个。。。终于,开锁君放弃了从锁眼开门的方法,改用塑料卡片,从门缝里捅锁舌,捅啊捅啊,又是几个楼梯灯时间过去了,还是没弄开。

好强悍的防盗门,盼盼牌的,真是不一般牛逼。

最后开锁君拿出了一根细绳,缠住猫眼,开始拧猫眼,又拧又拽,又是几个楼梯灯时间过去了,终于把猫眼拧了下来,开锁君拿出一个类似胃镜的工具,可以弯曲,中间管道里还有一根细钢丝,伸进去的一头,用细钢丝打了个活套,从猫眼里伸进去,勾住门里面的门把手,使劲一拉,门终于开了。

总结了一下,开锁君不是吃技术饭的,而是吃体力饭,从门外拆猫眼真的需要力气。电影里那些用铁丝捅几下就能把门捅开的情节,对现代的防盗门无效。

还有就是晚上睡觉一定要把门保险关起来,就算从猫眼伸活套勾门把手,也打不开门,不关保险,从猫眼开锁也就是5分钟时间。

try_files和request_filename

之前nginx里判断是否要重写,都是这样写的:

if (!-e $request_filename ) {
 rewrite  ^(.*)$  /index.php/$1  last;
  break; 
}

现在有try_files,可以更简洁

try_files $uri $uri/ /index.php/$uri;

try_files后面的参数除最后一个,其他都是文件和目录列表,如果服务器不存在此系列文件,则最后一个url重写生效,最后一个参数也可以定义区块变量

try_files $uri $uri/ @fallback;

然后单独定义fallback区块

location @fallback {
.....
}

 

兼容性不错的纯css固定表头样式

偷来的啊,偷来的。。。

测试了一下,多浏览器兼容性都不错,现有table,修改起来代码量也小,加两个div,把table标题行单独做成table,就可以了。要加的样式也不多,直接上代码:

<!doctype html>
<html dir="ltr" lang="zh-CN">
<head>
<meta charset="utf-8"/>
<title>纯CSS实现表头固定</title>
<style type="text/css">
      #scrollTable {
        width:701px;
        border: 1px solid #EB8;/*table没有外围的border,只有内部的td或th有border*/
        background: #FF8C00;
      }
      #scrollTable table {
        border-collapse:collapse; /*统一设置两个table为细线表格*/
      }
      /*表头 div的第一个子元素**/
      #scrollTable table.thead{ 
        width:100%;
      }
      /*表头*/
      #scrollTable table.thead th{
        border: 1px solid #EB8;
        border-right:#C96;
        color:#fff;
        background: #FF8C00;/*亮桔黄色*/
      }
      /*能带滚动条的表身*/
      /*div的第二个子元素*/
      #scrollTable div{
        width:100%;
        height:200px;
        overflow:auto;/*必需*/
        scrollbar-face-color:#EB8;/*那三个小矩形的背景色*/
        scrollbar-base-color:#ece9d8;/*那三个小矩形的前景色*/
        scrollbar-arrow-color:#FF8C00;/*上下按钮里三角箭头的颜色*/
        scrollbar-track-color:#ece9d8;/*滚动条的那个活动块所在的矩形的背景色*/
        scrollbar-highlight-color:#800040;/*那三个小矩形左上padding的颜色*/
        scrollbar-shadow-color:#800040;/*那三个小矩形右下padding的颜色*/
        scrollbar-3dlight-color: #EB8;/*那三个小矩形左上border的颜色*/
        scrollbar-darkshadow-Color:#EB8;/*那三个小矩形右下border的颜色*/
      }
      /*能带滚动条的表身的正体*/
      #scrollTable table.tbody{
        width:100%;
        border: 1px solid #C96;
        border-right:#B74;
        color:#666666;
        background: #ECE9D8;
      }
      /*能带滚动条的表身的格子*/
      #scrollTable table.tbody td{
        border:1px solid #C96;
      }
    </style>
</head>
<body>
<div id="scrollTable">
<table class="thead">
<col width="170px"></col> <col width="170px"></col> <col width="170px"></col><col></col>
<tbody>
<tr>
<th>名称</th>
<th>语法</th>
<th>说明</th>
<th>例子</th>
</tr>
</tbody>
</table>
<div>
<table class="tbody">
<col width="170px"></col> <col width="170px"></col> <col width="170px"></col><col></col>
<tbody>
<tr>
<td>Simple attribute Selector</td>
<td>[attr] </td>
<td>选择具有此属性的元素</td>
<td>blockquote[title] { <br/>color: red }</td>
</tr>
<tr>
<td>attribute Value Selector</td>
<td>[attr="value"] </td>
<td>选出属性值精确等于给出值的元素</td>
<td>h2[align="left"] { <br/>cursor: hand } </td>
</tr>
<tr>
<td>"Begins-with" attribute Value Selector</td>
<td>[attr^="value"] </td>
<td>选出属性值以给出值开头的元素</td>
<td>h2[align^="right"] { <br/>cursor: hand } </td>
</tr>
<tr>
<td>"Ends-with" attribute Value Selector</td>
<td>[attr$="value"] </td>
<td>选出属性值以给出值结尾的元素</td>
<td>div[class$="vml"]{<br/>cursor: hand} </td>
</tr>
<tr>
<td>Substring-match attribute Value Selector</td>
<td>[attr*="value"] </td>
<td>选出属性值包含给出值的元素</td>
<td>div[class*="grid"]{<br/> float:left} </td>
</tr>
<tr>
<td>One-Of-Many Attribute Value Selector</td>
<td>[attr~="value"] </td>
<td>原元素的属性值为多个单词,给出值为其中一个。</td>
<td>li[class~="last"]{<br/> padding-left:2em} </td>
</tr>
<tr>
<td>Hyphen Attribute Value Selector</td>
<td>[attr|="value"] </td>
<td>原元素的属性值等于给出值,或者以给出值加“-”开头</td>
<td>span[lang|="en"]{ <br/>color:green}</td>
</tr>
<tr>
<td>反选属性值选择器</td>
<td>[attr!="value"] </td>
<td>非标准,jQuery中出现的</td>
<td>span[class!="red"]{<br/>color:green}</td>
</tr>
</tbody>
</table>
</div>
</div>
</body>
</html>

 

nginx反向代理设置

PURGE最新版下载:
http://labs.frickle.com/nginx_ngx_cache_purge/
Tcmalloc 优化Nginx性能
64位操作系统请先安装libunwind库,32位操作系统不要安装。libunwind库为基于64位CPU和操作系统的程序提供了基本的堆栈辗转开解功能,其中包括用于输出堆栈跟踪的API、用于以编程方式辗转开解堆栈的API以及支持C++异常处理机制的API。
tar zxvf libunwind-0.99.tar.gz
cd libunwind-0.99/
CFLAGS=-fPIC ./configure
make CFLAGS=-fPIC
make CFLAGS=-fPIC install
安装google-perftools:

tar zxvf google-perftools-1.7.tar.gz
cd google-perftools-1.7/
./configure
make && make install

echo “/usr/local/lib” > /etc/ld.so.conf.d/usr_local_lib.conf
/sbin/ldconfig

查看是否好用,启动nginx

lsof -n|grep tcmalloc
如果出现下面的就表示成功了
tar zxvf pcre-8.12.tar.gz
cd pcre-8.12/
./configure
make && make install
cd ../
wget http://labs.frickle.com/files/ngx_cache_purge-1.3.tar.gz
tar zxvf ngx_cache_purge-1.3.tar.gz
上传 nginx-static-etags
http://nginx.localdomain.pl/wiki/UpstreamFair
加入负载均衡模块
tar zxvf gnosek-nginx-upstream-fair-2131c73.tar.gz
wget http://nginx.org/download/nginx-1.0.6.tar.gz
tar zxvf nginx-1.0.6.tar.gz
cd nginx-1.0.6/
./configure –user=www –group=www –prefix=/usr/local/webserver/nginx –add-module=../ngx_cache_purge-1.3 –add-module=../gnosek-nginx-upstream-fair-2131c73 –add-module=/usr/local/src/nginx-static-etags –with-http_stub_status_module –with-http_ssl_module –with-google_perftools_module

make && make install
cd ../
/usr/sbin/groupadd www
/usr/sbin/useradd -g www www

mkdir -p /usr/local/webserver/nginx/logs
chmod +w /usr/local/webserver/nginx/logs
chown -R www:www /usr/local/webserver/nginx/logs

mkdir /data/
mkdir /data/proxy_temp
mkdir /data/proxy_cache
ulimit -SHn 65535
#设置Web缓存区名称为cache_one,内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。
proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
############################################################################################

user www www;

worker_processes 8;

error_log /usr/local/webserver/nginx/logs/nginx_error.log crit;

pid /usr/local/webserver/nginx/nginx.pid;

google_perftools_profiles /var/tmp/tcmalloc;

#Specifies the value for maximum file descriptors that can be opened by this process. 
worker_rlimit_nofile 65535;

events 
{
use epoll;
worker_connections 65535;
}

http 
{
include mime.types;
default_type application/octet-stream;

charset utf-8;

server_names_hash_bucket_size 128;
client_header_buffer_size 32k;
large_client_header_buffers 4 32k;
client_max_body_size 8m;

sendfile on;
tcp_nopush on;

keepalive_timeout 60;

tcp_nodelay on;

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
fastcgi_buffer_size 64k;
fastcgi_buffers 4 64k;
fastcgi_busy_buffers_size 128k;
fastcgi_temp_file_write_size 128k;
fastcgi_intercept_errors on; #404 page

proxy_connect_timeout 600;
proxy_read_timeout 600;
proxy_send_timeout 600;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_temp_file_write_size 1024m;
proxy_ignore_client_abort on;

gzip on;
gzip_proxied any;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 5;
gzip_types text/plain application/x-javascript text/css text/xml;
gzip_vary on;

#limit_zone crawler $binary_remote_addr 10m;

proxy_temp_path /data/proxy_temp;
proxy_cache_path /data/proxy_cache levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

upstream backend_server {
#重要,代理的服务器ip
server 122.122.122.122:80;
}

server
{
listen 80;
server_name img.doudou.com 192.168.2.200;
index index.htm index.html index.php;

location ~ /purge(/.*)
{
allow 127.0.0.1;
allow 192.168.0.0/16;
allow 124.90.0.0/16;
deny all;
proxy_cache_purge cache_one $host$1$is_args$args;
}

location /
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
expires 12h;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|ico|wav|mid)$
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Accept-Encoding "";
proxy_ignore_headers "Cache-Control" "Expires";
proxy_pass http://backend_server;
expires 30d;
FileETag on;
etag_format "%X%X";

}

location ~ .*\.(js|css)?$
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Accept-Encoding "";
proxy_ignore_headers "Cache-Control" "Expires";
proxy_pass http://backend_server;
expires 7d;
}

location ~ .*\.htm$
{
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_cache cache_one;
proxy_cache_valid 200 304 12h;
proxy_cache_valid 301 302 1m;
proxy_cache_valid any 1m;
proxy_cache_key $host$uri$is_args$args;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Accept-Encoding "";
proxy_ignore_headers "Cache-Control" "Expires";
proxy_pass http://backend_server;
expires 5d;
}

location ~ .*\.(php|php5)?$
{
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://backend_server;
}

location /doudoustatus
{
stub_status on;
access_log off;
#auth_basic "nginx_status";
#auth_basic_user_file conf/htpasswd;
}

access_log off;
}

}

 

############################################################################################

 

/usr/local/webserver/nginx/sbin/nginx
十二、优化sysctl.conf
################################
# Add
net.ipv4.tcp_max_syn_backlog = 65536
net.core.netdev_max_backlog = 32768
net.core.somaxconn = 32768

net.core.wmem_default = 8388608
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216

net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2

net.ipv4.tcp_tw_recycle = 1
#net.ipv4.tcp_tw_len = 1
net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800

#net.ipv4.tcp_fin_timeout = 30
#net.ipv4.tcp_keepalive_time = 120
net.ipv4.ip_local_port_range = 1024 65535

################################
sysctl -p