Chrome浏览器对于POST页面执行history.back返回或表单数据丢失的解决办法

PHP页面POST数据页面时,都会都POST的数据进行校验,如果不符合的数据或是空项我们都会给出提示,并返回前一个页面。但是经常发现有用户提出,会出现返回后当前页面所填写的内容都丢失了,或是出现页面无法显示的问题。

确认重新提交表单 此网页需要使用您之前输入的数据才能正常显示。您可以重新发送这些数据,不过,这么做会重复执行此网页之前执行过的所有操作。
按“重新加载”按钮,重新提交加载该网页所需的数据。
ERR_CACHE_MISS

如下图:
post-page.png

原因:
是因为使用session_start()的问题,我们可以这样处理,在你的 Session_start 函数后加入 header("Cache-control:private");
"private" 则表示该响应是专用于某单个用户的,中间人不能缓存此响应,该响应只能应用于浏览器私有缓存中。
注意在本行之前你的PHP程序不能有任何输出。
解决方法如下:

session_start();//开启session功能,此前不能有任何输出
header("Cache-control:private"); //开启网页表单缓存,一定要放在Session_start 函数后

在此测试,问题解决。
via: https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Caching_FAQ

MySQL报错“Illegal mix of collations for operation 'like'”错误代码: 1271

在使用LIKE对日期或者时间字段进行模糊查询的时候,MySQL5.7X会报错误:

错误代码: 1271
Illegal mix of collations for operation 'like'

解决方法:在 MySQL5.5以上版本, 必需改成like binary '%中文%' ;
若字段 Type 是 time,date,datetime 在 select 時若使用 like '%中文%' 会出现 Illegal mix of collations for operation 'like'在写程序时要对每个字段进行搜索,在执行时可能就会出现时间字段 like '%中文%' 这种语法,
低版本MySQL是不会出现错误的。

SQL Server2008R2日志文件过大 大日志文件清理方法 不分离数据库

SQL Server日志文件过大    大日志文件清理方法 ,网上提供了很多分离数据库——〉删除日志文件-〉附加数据库 的方法,此方法风险太大,过程也比较久,有时候也会出现分离不成功的现象。下面的方式是不需要做数据库分离和附加操作的。

SQL 2008收缩清空日志方法:

1.在SQL2008中清除日志就必须在简单模式下进行,等清除动作完毕再调回到完整模式,一定必务要再改回完整模式,不然数据库就不支持时间点备份了。
1).选择数据库–属性—选项—恢复模式–选择简单。
2).收缩数据库后,再调回完整。
2.可以用命令直接操作

USE [master]
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY SIMPLE WITH NO_WAIT
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY SIMPLE      --简单模式
GO
USE 要清理的数据库名称
GO
DBCC SHRINKFILE (N'要清理的数据库名称_log' , 2, TRUNCATEONLY)  --设置压缩后的日志大小为2M,可以自行指定
GO
USE [master]
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY FULL WITH NO_WAIT
GO
ALTER DATABASE 要清理的数据库名称 SET RECOVERY FULL   --还原为完全模式
GO

使用sysbench对MySQL进行测试

sysbench是一个模块化的、跨平台、多线程基准测试工具,主要用于评估测试各种不同系统参数下的系统、数据库负载情况,项目地址:https://github.com/akopytov/sysbench
sysbench主要支持以下几种测试模式:
CPU运算性能
磁盘IO性能
调度程序性能
内存分配及传输速度
POSIX线程性能
数据库性能(OLTP基准测试)
目前sysbench主要支持 Mysql,Drizzle,PgSQL,Oracle等几种数据库。
快速安装:

yum -y install make automake libtool pkgconfig libaio-devel        
yum -y install mariadb-devel openssl-devel    # For MySQL support, replace with mysql-devel on RHEL/CentOS 5
yum -y install postgresql-devel        #For PostgreSQL support
curl -s https://packagecloud.io/install/repositories/akopytov/sysbench/script.rpm.sh | sudo bash
yum -y install sysbench

查看版本

[root@hongsin-monitor]# sysbench --version
sysbench 1.0.15

测试脚本路径

[root@hongsin-monitor sysbench]# pwd
/usr/share/sysbench
[root@hongsin-monitor sysbench]# ll
total 64
-rwxr-xr-x 1 root root  1452 Jul  4 04:06 bulk_insert.lua
-rw-r--r-- 1 root root 14369 Jul  4 04:06 oltp_common.lua
-rwxr-xr-x 1 root root  1290 Jul  4 04:06 oltp_delete.lua
-rwxr-xr-x 1 root root  2415 Jul  4 04:06 oltp_insert.lua
-rwxr-xr-x 1 root root  1265 Jul  4 04:06 oltp_point_select.lua
-rwxr-xr-x 1 root root  1649 Jul  4 04:06 oltp_read_only.lua
-rwxr-xr-x 1 root root  1824 Jul  4 04:06 oltp_read_write.lua
-rwxr-xr-x 1 root root  1118 Jul  4 04:06 oltp_update_index.lua
-rwxr-xr-x 1 root root  1127 Jul  4 04:06 oltp_update_non_index.lua
-rwxr-xr-x 1 root root  1440 Jul  4 04:06 oltp_write_only.lua
-rwxr-xr-x 1 root root  1919 Jul  4 04:06 select_random_points.lua
-rwxr-xr-x 1 root root  2118 Jul  4 04:06 select_random_ranges.lua
drwxr-xr-x 4 root root  4096 Oct 20 16:48 tests

写性能测试,数据准备

sysbench --test=/usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.255.90 --mysql-port=3306 --mysql-user=ice --mysql-password=xxxxxx --mysql-db=a1 --report-interval=10 --max-requests=0 --time=120 --threads=4500 --tables=10 --table-size=100000 prepare
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Initializing worker threads...

Creating table 'sbtest9'...Creating table 'sbtest8'...
Creating table 'sbtest3'...
Creating table 'sbtest4'...Creating table 'sbtest6'...


Creating table 'sbtest1'...
Creating table 'sbtest7'...
Creating table 'sbtest5'...
Creating table 'sbtest2'...
Creating table 'sbtest10'...
Inserting 100000 records into 'sbtest4'
Inserting 100000 records into 'sbtest10'
Inserting 100000 records into 'sbtest1'
Inserting 100000 records into 'sbtest2'
Inserting 100000 records into 'sbtest5'
Inserting 100000 records into 'sbtest8'
Inserting 100000 records into 'sbtest6'
Inserting 100000 records into 'sbtest9'
Inserting 100000 records into 'sbtest7'
Inserting 100000 records into 'sbtest3'
Creating a secondary index on 'sbtest10'...
Creating a secondary index on 'sbtest5'...
Creating a secondary index on 'sbtest8'...
Creating a secondary index on 'sbtest9'...
Creating a secondary index on 'sbtest6'...
Creating a secondary index on 'sbtest7'...
Creating a secondary index on 'sbtest1'...
Creating a secondary index on 'sbtest2'...
Creating a secondary index on 'sbtest4'...
Creating a secondary index on 'sbtest3'...
参数的解释:
--threads=4500  表示发起4500个并发连接
--oltp-read-only=off 表示不要进行只读测试,也就是会采用读写混合模式测试
--report-interval=10 表示每10秒输出一次测试进度报告
--rand-type=uniform 表示随机类型为固定模式,其他几个可选随机模式:uniform(固定),gaussian(高斯),special(特定的),pareto(帕累托)
--time=120 表示最大执行时长为 120秒
--max-requests=0 表示总请求数为 0,因为上面已经定义了总执行时长,所以总请求数可以设定为 0;也可以只设定总请求数,不设定最大执行时长
--tables=10  表示10个表
--table-size=100000  单表100000条记录
--percentile=99 表示设定采样比例,默认是 95%,即丢弃1%的长请求,在剩余的99%里取最大值

运行测试

sysbench --test=/usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.255.90 --mysql-port=3306 --mysql-user=ice --mysql-password=hongsinCS --mysql-db=a1 --report-interval=10 --max-requests=0 --time=120 --threads=4500 --tables=10 --table-size=100000 run
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Running the test with following options:
Number of threads: 4500
Report intermediate results every 10 second(s)
Initializing random number generator from current time


Initializing worker threads...

Threads started!

[ 10s ] thds: 4500 tps: 618.00 qps: 4951.50 (r/w/o: 0.00/1950.97/3000.53) lat (ms,95%): 8038.61 err/s: 91.70 reconn/s: 0.00
[ 20s ] thds: 4500 tps: 562.83 qps: 3806.01 (r/w/o: 0.00/1849.30/1956.71) lat (ms,95%): 15934.78 err/s: 227.01 reconn/s: 0.00
[ 30s ] thds: 4500 tps: 434.80 qps: 3051.53 (r/w/o: 0.00/1599.01/1452.51) lat (ms,95%): 22842.77 err/s: 226.20 reconn/s: 0.00
[ 40s ] thds: 4500 tps: 479.70 qps: 3310.41 (r/w/o: 0.00/1803.90/1506.50) lat (ms,95%): 28352.44 err/s: 224.60 reconn/s: 0.00
[ 50s ] thds: 4500 tps: 495.10 qps: 3403.11 (r/w/o: 0.00/1910.30/1492.80) lat (ms,95%): 28867.59 err/s: 219.60 reconn/s: 0.00
[ 60s ] thds: 4500 tps: 453.20 qps: 3140.89 (r/w/o: 0.00/1769.59/1371.29) lat (ms,95%): 28867.59 err/s: 215.80 reconn/s: 0.00
[ 70s ] thds: 4500 tps: 469.90 qps: 3246.01 (r/w/o: 0.00/1848.80/1397.20) lat (ms,95%): 28867.59 err/s: 228.90 reconn/s: 0.00
[ 80s ] thds: 4500 tps: 466.59 qps: 3238.67 (r/w/o: 0.00/1859.68/1378.99) lat (ms,95%): 29926.15 err/s: 225.20 reconn/s: 0.00
[ 90s ] thds: 4500 tps: 441.30 qps: 3084.43 (r/w/o: 0.00/1765.82/1318.61) lat (ms,95%): 29926.15 err/s: 225.30 reconn/s: 0.00
[ 100s ] thds: 4500 tps: 434.20 qps: 3026.20 (r/w/o: 0.00/1737.20/1289.00) lat (ms,95%): 29926.15 err/s: 217.40 reconn/s: 0.00
[ 110s ] thds: 4500 tps: 471.70 qps: 3247.39 (r/w/o: 0.00/1872.59/1374.80) lat (ms,95%): 32161.14 err/s: 218.40 reconn/s: 0.00
[ 120s ] thds: 4500 tps: 476.39 qps: 3289.44 (r/w/o: 0.00/1892.36/1397.07) lat (ms,95%): 31023.52 err/s: 232.80 reconn/s: 0.00
SQL statistics:
    queries performed:
        read:                            0         读操作
        write:                           233015     --写总数
        other:                           197026  --其他操作总数(SELECT、INSERT、UPDATE、DELETE之外的操作,例如COMMIT等)
        total:                           430041  --全部总数
    transactions:                        62617  (486.84 per sec.)  --总事务数(每秒事务数)
    queries:                             430041 (3343.55 per sec.) --查询数(每秒查询数)
    ignored errors:                      27087  (210.60 per sec.)  --忽略错误数
    reconnects:                          0      (0.00 per sec.)  --重新连接次数

General statistics:
    total time:                          128.6147s  --运行总时间
    total number of events:              62617  --事件总数

Latency (ms):
         min:                                    2.09
         avg:                                 8957.64
         max:                                99069.80
         95th percentile:                    27846.48
         sum:                            560900840.54

Threads fairness:    #线程平均数
    events (avg/stddev):           13.9149/3.92
    execution time (avg/stddev):   124.6446/2.39

清理数据:

sysbench --test=/usr/share/sysbench/oltp_write_only.lua --mysql-host=192.168.255.90 --mysql-port=3306 --mysql-user=ice --mysql-password=hongsinCS --mysql-db=a1 --report-interval=10 --max-requests=0 --time=120 --threads=4500 --tables=10 --table-size=100000 cleanup
WARNING: the --test option is deprecated. You can pass a script name or path on the command line without any options.
sysbench 1.0.15 (using bundled LuaJIT 2.1.0-beta2)

Dropping table 'sbtest1'...
Dropping table 'sbtest2'...
Dropping table 'sbtest3'...
Dropping table 'sbtest4'...
Dropping table 'sbtest5'...
Dropping table 'sbtest6'...
Dropping table 'sbtest7'...
Dropping table 'sbtest8'...
Dropping table 'sbtest9'...
Dropping table 'sbtest10'...

可以根据/usr/share/sysbench下面的lua脚本进行读、写、更新,随机等等测试,条件允许建议时间1小时以上,以便测试数据准确·

mysqlslap: [ERROR] unknown variable 'default-character-set=utf8mb4'

运行mysqlslap报错如下:

[root@monitor-db ~]# mysqlslap --version
mysqlslap: Error when connecting to server: Access denied for user 'root'@'localhost' (using password: NO)

解决方法:带上--no-defaults参数

[root@sso-db-a binlog]# mysqlslap --no-defaults --version
mysqlslap  Ver 1.0 Distrib 5.7.23, for Linux (x86_64)

或者在my.cnf里面将default-character-set修改为utf8,需重启生效

[client]
#设置MySQL客户端的字符集
default-character-set=utf8

mysqlslap.png

FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"

使用sysbench做MySQL性能压测的时候,报错:

FATAL: mysql_stmt_prepare() failed
(last message repeated 2 times)
FATAL: MySQL error: 1461 "Can't create more than max_prepared_stmt_count statements (current value: 16382)"
(last message repeated 1 times)

max_prepared_stmt_count参数限制了同一时间在mysqld上所有session中prepared 语句的上限。
它的取值范围为“0 - 1048576”,默认为16382。
mysql对于超出max_prepared_stmt_count的prepare语句就会报1461的错误。
sysvar_max_prepared_stmt_count.png
官方文档:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html
一般而言,默认值应该是足够用的,因为现场的并发其实没有那么的大。
一个可能的原因是应用端那边没有关闭prepared的语句。
直连后端master执行如下命令
mysql> show global status like ‘com_stmt%’;
查看如下3个参数值:
Com_stmt_close prepare语句关闭的次数
Com_stmt_execute prepare语句执行的次数
Com_stmt_prepare prepare语句创建的次数

请确认Com_stmt_close的值是否接近于Com_stmt_prepare。

mysql> show global status like 'com_stmt%';
+-------------------------+----------+
| Variable_name           | Value    |
+-------------------------+----------+
| Com_stmt_execute        | 79358467 |
| Com_stmt_close          | 18100    |
| Com_stmt_fetch          | 0        |
| Com_stmt_prepare        | 67646    |
| Com_stmt_reset          | 0        |
| Com_stmt_send_long_data | 0        |
| Com_stmt_reprepare      | 0        |
+-------------------------+----------+
7 rows in set (0.00 sec)
mysql> show global variables like 'max_prepared_stmt_count';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| max_prepared_stmt_count | 16382 |
+-------------------------+-------+
1 row in set (0.01 sec)
mysql> set global max_prepared_stmt_count=1048576;
Query OK, 0 rows affected (0.00 sec)
mysql> show global variables like 'max_prepared_stmt_count';
+-------------------------+-------+
| Variable_name           | Value |
+-------------------------+-------+
| max_prepared_stmt_count |1048576|
+-------------------------+-------+
1 row in set (0.00 sec)

修改之后再次使用100并发压测则没有报错了。
1 row in set (0.01 sec)
为保证mysql实例重启生效可以写到配置文件my.cnf

[mysqld]
max_prepared_stmt_count=1048576

PHP过滤输入表单XSS\HTML特殊字符等预防WEB攻击

hacker.png
Web应用系统的攻击大部分是来自于外部,如Url上添加一些字段注入($_GET输入),表单的提交注入(一般为$_POST),所以在接收数据时对数据进行过滤,是必须的:
过滤方法有以下几种:
trim过滤字符串首尾空格

$test1 = trim($_POST['test1']);

strip_tags函数过滤PHP、HTML标签 :
strip_tags会将字符串中的php标签(<?php ?>)Html标签(<h1></h1><script></script>....等)移除。一定程序上阻止了恶意注入。

$_POST['name'] = "<script>alert('hehe');</script>";
var_dump($_POST['name']);//弹出信息框 'hehe'
$name = strip_tags($_POST['name']);
var_dump($name);  //string(14) "alert('hehe');"

转数据类型
接收的数据是整形或浮点形,可以直接转数据类型。

//转整形 
$number = intval($_POST['number']);
$price  = floatval($_POST['price']);

移除攻跨站脚本xss攻击
xss攻击有时会把标签转换成其他数据,strip_tags防止不了,
ThinkPHP中有个remove_xss方法,可以将大部分xss攻击阻止。./ThinkPHP/Extend/Function/extend.php中,为了方便使用,可以放到项目的common.php里或公用文件里面直接调用:

/**
 * @from extend.php
 * 过滤xss攻击
 * @param str $val
 * @return mixed
 */
function remove_xss($val) {
    // remove all non-printable characters. CR(0a) and LF(0b) and TAB(9) are allowed
    // this prevents some character re-spacing such as <java\0script>
    // note that you have to handle splits with \n, \r, and \t later since they *are* allowed in some inputs
    $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);

    // straight replacements, the user should never need these since they're normal characters
    // this prevents like <IMG SRC=@avascript:alert('XSS')>
    $search = 'abcdefghijklmnopqrstuvwxyz';
    $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $search .= '1234567890!@#$%^&*()';
    $search .= '~`";:?+/={}[]-_|\'\\';
    for ($i = 0; $i < strlen($search); $i++) {
        // ;? matches the ;, which is optional
        // 0{0,7} matches any padded zeros, which are optional and go up to 8 chars

        // @ @ search for the hex values
        $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); // with a ;
        // @ @ 0{0,7} matches '0' zero to seven times
        $val = preg_replace('/(&#0{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); // with a ;
    }

    // now the only remaining whitespace attacks are \t, \n, and \r
    $ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script',
                  'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
    $ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut',
             'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 
             'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut',
             'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend',
             'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange',
             'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete',
             'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover',
             'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange','onreadystatechange',
             'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 
             'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
    $ra = array_merge($ra1, $ra2);

    $found = true; // keep replacing as long as the previous round replaced something
    while ($found == true) {
        $val_before = $val;
        for ($i = 0; $i < sizeof($ra); $i++) {
            $pattern = '/';
            for ($j = 0; $j < strlen($ra[$i]); $j++) {
                if ($j > 0) {
                    $pattern .= '(';
                    $pattern .= '(&#[xX]0{0,8}([9ab]);)';
                    $pattern .= '|';
                    $pattern .= '|(&#0{0,8}([9|10|13]);)';
                    $pattern .= ')*';
                }
                $pattern .= $ra[$i][$j];
            }
            $pattern .= '/i';
            $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2); // add in <> to nerf the tag
            $val = preg_replace($pattern, $replacement, $val); // filter out the hex tags
            if ($val_before == $val) {
                // no replacements were made, so exit the loop
                $found = false;
            }
        }
    }
    return $val;
}

调用方法:

$name = remove_xss($_POST['name']);
也可以和strip_tags结合起来使用
$name = strip_tags(remove_xss($_POST['name']));

保存文章内容类转义:
使用kindeditor之类的内容编辑器时,因为提交到后台时是以Html形式提交的,而且需要保存到数据库,为了防止sql注入,需要在进数据库前进行特殊字符转义,这时用过滤标签的方法或各类的方法都不适合。只能对标签和特殊符号进行转义,这时使用到的方法是addslashes。
addslashes在使用前先检查一下,php是否自动开启了自动转义。用get_magic_quotes_gpc()方法判断,如果已开,则是true,否为false。

    if(!get_magic_quotes_gpc()){
     $content = addslashes($_POST['content']);
    }else{
      $content= $_POST['content'];
    }

这样就完成了转义,然而在展示页面,从数据库拿出来的内容是经过转义的html,如果直接展示,html标签等都识别不到,会直接输出转义过的字符串。这时需要用反转义来还原数据。如下

echo stripslashes($content);

PHP内置过滤器参考使用 PHP内置过滤器filter_input
其他参考:
http://www.w3school.com.cn/php/func_filter_input_array.asp
https://my.oschina.net/jiec/blog/309467

JS弹出确认删除的提示信息

在后台管理系统中,在一些重要操作如删除按钮或连接被触发时,应给予弹窗提示,常用的代码有以下几种:
用户点击删除按钮时,弹出一个确定框,如果用户点击“确定”执行删除操作,否则不执行
1、通过链接来删除数据出现提示

<a href="del.php?id=1" onclick="return confirm('您确定删除该记录吗?')">删除</a>

2、通过提交表单来删除,也就是批量删除多条数据

<script type="text/javascript"> 
function DelFromLst(){  
        if(confirm('确认删除已选择数据吗?')){
          document.selform.action.value='batdel';
          document.selform.submit();
        }
}
</script>

这里的按钮是 button类型的,不是submit。

<input type="button" name="delbtn" value="批量删除" /> 

3、直接使用js方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 
<title>确认是否删除</title> 
<script type="text/javascript"> 
function del(){ 
if(!confirm("确认要删除?")){ 
window.event.returnValue = false; 
} 
} 
</script> 
</head> 
<body> 
<a href="http://www.baidu.com" onclick="return del()">删除</a> 
</body> 
</html>

OneDrive 一直显示"正在处理更改"的解决方法

OneDrive 一直显示"正在处理更改",能打开OneDrive网站查看,确认网络正常没被墙,解决方法如下:

1. 按下 Windows 按键 + R ,

2. 在弹出的运行/ Run视窗输入:%localappdata%\Microsoft\OneDrive\onedrive.exe /reset

3. 然后请点击OK (桌面右下角的OneDrive系统小图标将消失并在大约1-2分钟后再次出现)

4. 若桌面右下角的OneDrive系统小图标在数分钟后并没有再次出现,请再运行/ Run视窗并输入:%localappdata%\Microsoft\OneDrive\onedrive.exe

5.操作完成之后,再查看。

via:https://answers.microsoft.com/zh-hans/windows/forum/windows_10-files/onedrive/83687705-a43e-4b79-8db2-bed56abfbadf

Xshell6报错 WARNING! The remote SSH server rejected X11 forwarding request.

在用xshll6连接Linux服务器的时候控制台报错如下:

WARNING! The remote SSH server rejected X11 forwarding request.

xshell6-warning.png
可以忽略,但总是感觉不舒服,解决方法如下:
选择当Xshell连接属性菜单---连接---隧道---X11转移---取消掉 转发XX11连接到(X)的选择框,确定即可。
xshell_default.png
在次重新连接服务器,不在弹出警告信息。
xshel6_ok.png

昭仁寺

中国的寺庙道观草堂庙宇特别多,老家也不例外,基本有名胜古迹的地方都有xx塔,xx寺等等,从南到北基本都有,这可能就是五千年的历史文化吧。
昭仁寺外观


---阅读剩余部分---

sysctl.conf参数调优

sysctl.conf 工作原理
sysctl 命令被用于在内核运行时动态地修改内核的运行参数,可用的内核参数在目录 /proc/sys 中。它包含一些 TCP/IP 堆栈和虚拟内存系统的高级选项, 这可以让有经验的管理员提高引人注目的系统性能。用 sysctl 可以读取设置超过五百个系统变量。

vi /etc/sysctl.conf
# 禁用包过滤功能 
net.ipv4.ip_forward = 0  
# 启用源路由核查功能 
net.ipv4.conf.default.rp_filter = 1  
# 禁用所有 IP 源路由 
net.ipv4.conf.default.accept_source_route = 0  
# 使用 sysrq 组合键是了解系统目前运行情况,为安全起见设为 0 关闭 
kernel.sysrq = 0  
# 控制 core 文件的文件名是否添加 pid 作为扩展
kernel.core_uses_pid = 1  
# 开启 SYN Cookies,当出现 SYN 等待队列溢出时,启用 cookies 来处理
net.ipv4.tcp_syncookies = 1  
# 每个消息队列的大小(单位:字节)限制
kernel.msgmnb = 65536  
# 整个系统最大消息队列数量限制
kernel.msgmax = 65536  
# 单个共享内存段的大小(单位:字节)限制,计算公式 64G*1024*1024*1024(字节)
kernel.shmmax = 68719476736  
# 所有内存大小(单位:页,1 页 = 4Kb),计算公式 16G*1024*1024*1024/4KB(页)
kernel.shmall = 4294967296  
#timewait 的数量,默认是 180000
net.ipv4.tcp_max_tw_buckets = 6000  
# 开启有选择的应答
net.ipv4.tcp_sack = 1  
# 支持更大的 TCP 窗口. 如果 TCP 窗口最大超过 65535(64K), 必须设置该数值为 1
net.ipv4.tcp_window_scaling = 1  
#TCP 读 buffer
net.ipv4.tcp_rmem = 4096 131072 1048576
#TCP 写 buffer
net.ipv4.tcp_wmem = 4096 131072 1048576   
# 为 TCP socket 预留用于发送缓冲的内存默认值(单位:字节)
net.core.wmem_default = 8388608
# 为 TCP socket 预留用于发送缓冲的内存最大值(单位:字节)
net.core.wmem_max = 16777216  
# 为 TCP socket 预留用于接收缓冲的内存默认值(单位:字节)  
net.core.rmem_default = 8388608
# 为 TCP socket 预留用于接收缓冲的内存最大值(单位:字节)
net.core.rmem_max = 16777216
# 每个网络接口接收数据包的速率比内核处理这些包的速率快时,允许送到队列的数据包的最大数目
net.core.netdev_max_backlog = 262144  
#web 应用中 listen 函数的 backlog 默认会给我们内核参数的 net.core.somaxconn 限制到 128,而 nginx 定义的 NGX_LISTEN_BACKLOG 默认为 511,所以有必要调整这个值
net.core.somaxconn = 262144  
# 系统中最多有多少个 TCP 套接字不被关联到任何一个用户文件句柄上。这个限制仅仅是为了防止简单的 DoS 攻击,不能过分依靠它或者人为地减小这个值,更应该增加这个值(如果增加了内存之后)
net.ipv4.tcp_max_orphans = 3276800  
# 记录的那些尚未收到客户端确认信息的连接请求的最大值。对于有 128M 内存的系统而言,缺省值是 1024,小内存的系统则是 128
net.ipv4.tcp_max_syn_backlog = 262144  
# 时间戳可以避免序列号的卷绕。一个 1Gbps 的链路肯定会遇到以前用过的序列号。时间戳能够让内核接受这种“异常” 的数据包。这里需要将其关掉
net.ipv4.tcp_timestamps = 0  
# 为了打开对端的连接,内核需要发送一个 SYN 并附带一个回应前面一个 SYN 的 ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃连接之前发送 SYN+ACK 包的数量
net.ipv4.tcp_synack_retries = 1  
# 在内核放弃建立连接之前发送 SYN 包的数量
net.ipv4.tcp_syn_retries = 1  
# 开启 TCP 连接中 time_wait sockets 的快速回收
net.ipv4.tcp_tw_recycle = 1  
# 开启 TCP 连接复用功能,允许将 time_wait sockets 重新用于新的 TCP 连接(主要针对 time_wait 连接)
net.ipv4.tcp_tw_reuse = 1  
#1st 低于此值, TCP 没有内存压力, 2nd 进入内存压力阶段, 3rdTCP 拒绝分配 socket(单位:内存页)
net.ipv4.tcp_mem = 94500000 915000000 927000000   
# 如果套接字由本端要求关闭,这个参数决定了它保持在 FIN-WAIT-2 状态的时间。对端可以出错并永远不关闭连接,甚至意外当机。缺省值是 60 秒。2.2 内核的通常值是 180 秒,你可以按这个设置,但要记住的是,即使你的机器是一个轻载的 WEB 服务器,也有因为大量的死套接字而内存溢出的风险,FIN- WAIT-2 的危险性比 FIN-WAIT-1 要小,因为它最多只能吃掉 1.5K 内存,但是它们的生存期长些。
net.ipv4.tcp_fin_timeout = 15  
# 表示当 keepalive 起用的时候,TCP 发送 keepalive 消息的频度(单位:秒)
net.ipv4.tcp_keepalive_time = 30  
# 对外连接端口范围
net.ipv4.ip_local_port_range = 2048 65000
# 表示文件句柄的最大数量
fs.file-max = 102400

生产环境4核8G内存机器的sysctl.conf配置

net.ipv4.ip_nonlocal_bind = 1
net.ipv4.ip_forward = 0

# Controls source route verification
net.ipv4.conf.default.rp_filter = 1

# Do not accept source routing
net.ipv4.conf.default.accept_source_route = 0

# Controls the System Request debugging functionality of the kernel

# Controls whether core dumps will append the PID to the core filename.
# Useful for debugging multi-threaded applications.
kernel.core_uses_pid = 1

# Controls the use of TCP syncookies
net.ipv4.tcp_syncookies = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_fin_timeout = 30

net.nf_conntrack_max = 655360
net.netfilter.nf_conntrack_tcp_timeout_established = 1200

# Disable netfilter on bridges.
net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

# Controls the default maxmimum size of a mesage queue
kernel.msgmnb = 65536

# Controls the maximum size of a message, in bytes
kernel.msgmax = 65536

# Controls the maximum shared segment size, in bytes
kernel.shmmax = 68719476736


# Controls the maximum number of shared memory segments, in pages
kernel.shmall = 2147483648
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.netfilter.nf_conntrack_max = 1000000
kernel.unknown_nmi_panic = 0
kernel.sysrq = 0
fs.file-max = 1000000
vm.swappiness = 10
fs.inotify.max_user_watches = 10000000
net.core.wmem_max = 327679
net.core.rmem_max = 327679
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0

log_error_verbosity日志参数

MySQL中log_error定义是否启用错误日志的功能和错误日志的存储位置,log_warnings定义是否将告警信息(warning messages)也写入错误日志。此选项默认启用,具体来说:

log_warnings 为0, 表示不记录告警信息。
log_warnings 为1, 表示告警信息写入错误日志。
log_warnings 大于1, 表示各类告警信息,例如有关网络故障的信息和重新连接信息写入错误日志。

此参数在不同版本略有差别,在MySQL 5.6中,log_warnings的默认值为1
在MySQL 5.7中,有些版本默认值为2,有些版本默认值为1, 具体参考官方文档信息,如下所示:
5.7.png
从MySQL 5.7.2开始,首选log_error_verbosity系统变量,而不是使用--log-warnings选项或log_warnings系统变量,这个参数从MySQL 8.0.3开始被移除了:
This system variable was removed in MySQL 8.0.3. Use the log_error_verbosity system variable instead.

新参数log_error_verbosity更简单,它有三个可选值, 分别对应:1 错误信息;2 错误信息和告警信息; 3:错误信息、告警信息和通知信息。 具体参考官方文档,下面部分截取官方文档。
8.0.png
查看错误log设置:

root@sso_db_69 15:34:  [(none)]> show variables like '%log_error%';
+---------------------+-----------------------+
| Variable_name       | Value                 |
+---------------------+-----------------------+
| binlog_error_action | ABORT_SERVER          |
| log_error           | /data/mysql/error.log |
| log_error_verbosity | 2                     |
+---------------------+-----------------------+
3 rows in set (0.00 sec)

调整log_error_verbosity级别:

SET GLOBAL log_warnings=2;
SET GLOBAL log_error_verbosity=2;

永久调整my.cnf增加设置:

[mysqld]
log_warnings=1
log_error_verbosity=1

参数说明

Binlog_error_action=ABORT_SERVER
Binlog_error_action参数控制当不能写binlog时,mysql-server将会采取什么行动。
设置binlog_error_action=ABORT_SERVER会使mysql-server在写binlog遇到严重错误时退出,比如磁盘满了,文件系统不可写入了等。
在ABORT_SERVER选项下,binlog和从库都是安全的,这是官方修改此默认值的原因。
在先前的选项下(binlog_error_action=IGNORE_ERROR),如果一个错误发生,导致无法写入binlog,mysql-server会在错误日志中记录错误并强制关闭binlog功能。这会使mysql-server在不记录binlog的模式下继续运行,导致从库无法继续获取到主库的binlog。

官方参考资料:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_log_warnings
https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_log-warnings

MySQL全局锁库锁表

1、全局读锁定:

FLUSH TABLES WITH READ LOCK ;

执行了命令之后所有库所有表都被锁定只读,一般用在数据库联机备份,这个时候数据库的写操作将被阻塞,读操作顺利进行。

解锁:

UNLOCK TABLES ;

2、全局表级别锁定:

LOCK TABLES tbl_name ; #不影响其他表的写操作

解锁也是:

UNLOCK TABLES ;

这两个语句在执行的时候都需要注意个特点,就是隐式提交的语句,在退出mysql终端的时候都会隐式的执行unlock tables,也就是如果要让表锁定生效就必须一直保持对话。

read-lock:  允许其他并发的读请求,但阻塞写请求,即可以同时读,但不允许任何写。也叫共享锁
write-lock: 不允许其他并发的读和写请求,是排他的(exclusive)。也叫独占锁

PHP内置过滤器filter_input

定义和用法
filter_input() 函数从脚本外部获取输入,并进行过滤。
函数用于对来自非安全来源的变量进行验证,比如用户的输入。

本函数可从各种来源获取输入:

INPUT_GET
INPUT_POST
INPUT_COOKIE
INPUT_ENV
INPUT_SERVER
INPUT_SESSION (Not yet implemented)
INPUT_REQUEST (Not yet implemented)
//验证(validation) Filters
FILTER_VALIDATE_BOOLEAN:  把值作为布尔选项来验证,对 "1", "true", "on" 和 "yes" 返回 TRUE, 其余的都返回 FALSE
FILTER_VALIDATE_EMAIL:    把值作为邮件地址来验证
FILTER_VALIDATE_FLOAT:    把值作为浮点数来验证
FILTER_VALIDATE_INT:      以整数验证值,可以选择范围
FILTER_VALIDATE_IP:       把值作为 IP 进行验证
FILTER_VALIDATE_REGEXP:   根据兼容 Perl 的正则表达式来验证值
FILTER_VALIDATE_URL:      把值作为 URL 进行验证
//纠错(sanitization) Filters
FILTER_SANITIZE_EMAIL:         移除所有字符, 除了字母,数字和 !#$%&'*+-/=?^_`{|}~@.[].
FILTER_SANITIZE_ENCODED:       去除 URL 编码不需要的字符, 与 urlencode() 函数很类似
FILTER_SANITIZE_MAGIC_QUOTES:  在指定的预定义字符前添加反斜杠, 单引号(')、双引号(")、反斜线(\)与 NULL
FILTER_SANITIZE_NUMBER_FLOAT:  移除所有字符, 除了数字,+- 和可选(.,)
FILTER_SANITIZE_NUMBER_INT:    移除所有字符, 除了数字和 +-
FILTER_SANITIZE_SPECIAL_CHARS: 用于对 "<>& 以及 ASCII 值在 32 值以下的字符进行转义
FILTER_SANITIZE_STRING:        删除那些对应用程序有潜在危害的数据。它用于去除标签以及删除或编码不需要的字符
FILTER_SANITIZE_STRIPPED:      去除或编码不需要的字符,是 FILTER_SANITIZE_STRING 的别名
FILTER_SANITIZE_URL:           移除所有字符, 除了字母,数字和 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=.
FILTER_UNSAFE_RAW:             不进行任何过滤,去除或编码特殊字符

如果成功,则返回被过滤的数据,如果失败,则返回 false,如果 variable 参数未设置,则返回 NULL。

语法

filter_input(input_type, variable, filter, options)

参数 描述
input_type 必需。规定输入类型。参见上面的列表中可能的类型。
variable 规定要过滤的变量。
filter
可选。规定要使用的过滤器的 ID。默认是 FILTER_SANITIZE_STRING。

请参见完整的 PHP Filter 函数参考手册,获得可能的过滤器。

过滤器 ID 可以是 ID 名称 (比如 FILTER_VALIDATE_EMAIL),或 ID 号(比如 274)。

options 规定包含标志/选项的数组。检查每个过滤器可能的标志和选项。
例子
在本例中,我们使用 filter_input() 函数来过滤一个 POST 变量。所接受的 POST 变量是合法的 e-mail 地址。

<?php
if(!filter_input(INPUT_GET,'p',FILTER_VALIDATE_INT)) //p变量只接收整型数据,输入特殊符号等都会重置为1
{
    $p = 1;
}else{
    @$p = $_GET['p']?$_GET['p']:1;
}
<?php
#PHP内置的validate filter
$input_data = True;
$result = filter_var($input_data,FILTER_VALIDATE_BOOLEAN);
#FILTER_VALIDATE_BOOLEAN对应验证布尔值
var_dump($result); #因为input_data是真,所以结果是 True
$input_data = 123;
$result = filter_var($input_data,FILTER_VALIDATE_BOOLEAN);
var_dump($result); #因为input_data是123数字类型,所以结果是 False
/*
filter_var 函数有三个参数 分别是 输入数据 filter对应的id 和选项
输入数据类型可以是多种的
filter的对应id在这里可以查看列表 http://www.php.net/manual/zh/filter.filters.php
选项是一个关联数组 可以在上面的地址中查看可以使用的选项,也可以自己使用回调函数来处理输入数据
*/
#使用回调例子
function callback_filter($value) #回调函数
{
return $value.'_callback';
}
$result = filter_var('input',FILTER_CALLBACK,array('options'=>'callback_filter'));
var_dump($result);
#验证一个非10进制的整数
#8进制
$result = filter_var('0755', FILTER_VALIDATE_INT, array('flags'=>FILTER_FLAG_ALLOW_OCTAL));
var_dump($result);
#16进制
$result = filter_var('0XAF', FILTER_VALIDATE_INT, array('flags'=>FILTER_FLAG_ALLOW_HEX));
var_dump($result);
#注意这里输出的结果是10进制的
#当验证失败时设置默认值  因为字符a不是整数,所以在无法通过验证的时候被强制替换成了默认值123 
$result = filter_var('a',FILTER_VALIDATE_INT,array('options'=>array('default'=>123)));
var_dump($result);
#限制数字范围
$result = filter_var(99,FILTER_VALIDATE_INT,array('options'=>array('default'=>50,'max_range'=>98)));
var_dump($result);
$result = filter_var(99,FILTER_VALIDATE_INT,array('options'=>array('default'=>50,'min_range'=>100)));
var_dump($result);
#min与max可以同时使用
#验证email格式
$result = filter_var('a@a.c',FILTER_VALIDATE_EMAIL);
var_dump($result);
#验证IP
$result = filter_var('192.168.1.1',FILTER_VALIDATE_IP);
var_dump($result);
#FILTER_VALIDATE_IP的flags有四个分别是
#FILTER_FLAG_IPV4, FILTER_FLAG_IPV6, FILTER_FLAG_NO_PRIV_RANGE, FILTER_FLAG_NO_RES_RANGE
#对应 IPV4 IPV6 过滤私有地址 与 过滤保留地址
#验证url
$result = filter_var('http://www.yahoo.com/',FILTER_VALIDATE_URL);
var_dump($result);
#url 有两种flags 其中FILTER_FLAG_QUERY_REQUIRED 要求url中必须包含查询字符串
#FILTER_FLAG_PATH_REQUIRED 要求格式必须包含为/结尾的路径或者包含文件
#简单来说就是 http://aaa.com是不能通过的 但是http://aaa.com/或者http://aaa.com/index.html就可以通过)
#注意 url并不仅限于http与https ,而且目前也只支持ASCII字符,例如中文域名就会失败
#根据正则验证
$result = filter_var('0000112884634874',FILTER_VALIDATE_REGEXP,array('options'=>array('regexp'=>"/\d+/")));
var_dump($result);
#在php 5.4.11之前 +0与-0只能通过float验证,在5.4.11之后可以通过int和float验证
#以上就是PHP内置的几种validate filter,下回介绍其他filter


#Sanitize filters
#Sanitize filters 可以清理掉不规范的字符
# FILTER_SANITIZE_EMAIL 可以清理除了 字母和数字 以及  !#$%&'*+-/=?^_`{|}~@.[] 以外的字符  (感觉没什么用啊)
$result = filter_var('这里是一个email地址asdjaslkd@sdjkasdj.com',FILTER_SANITIZE_EMAIL);
var_dump($result);
# FILTER_SANITIZE_ENCODED 处理URL编码 有4个flags
# FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
# FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
# FILTER_FLAG_ENCODE_LOW - 编码 ASCII 值在 32 以下的字符
# FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
# 感觉还是urlencode函数更实用
$result = filter_var('http://www.longxiao7.com',FILTER_SANITIZE_ENCODED);
var_dump($result);
# FILTER_SANITIZE_MAGIC_QUOTES  等同于  addslashes 函数
# FILTER_SANITIZE_NUMBER_FLOAT 删除浮点数中所有非法的字符 此FILTER可能存在的flags如下
# FILTER_FLAG_ALLOW_FRACTION  允许小数部分
# FILTER_FLAG_ALLOW_THOUSAND  允许千分位计数
# FILTER_FLAG_ALLOW_SCIENTIFIC 允许科学计数
$result = filter_var('0.54548',FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_FRACTION);
var_dump($result);
$result = filter_var('1000,000,000',FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_THOUSAND);
var_dump($result);
$result = filter_var('1E20',FILTER_SANITIZE_NUMBER_FLOAT,FILTER_FLAG_ALLOW_SCIENTIFIC);
var_dump($result);
# FILTER_SANITIZE_NUMBER_INT 过滤整数以外的字符
$result = filter_var('54548)*)(……&*%6554……¥测试字符.055',FILTER_SANITIZE_NUMBER_INT);
var_dump($result);
# FILTER_SANITIZE_SPECIAL_CHARS  处理HTML转义字符 '"<>& 以及 ASCII 值小于 32 的字符
# flags
# FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
# FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
# FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
$result = filter_var('<script>alert(\'&nbsp;中文\')</script>',FILTER_SANITIZE_SPECIAL_CHARS);
var_dump($result);
# FILTER_SANITIZE_FULL_SPECIAL_CHARS 上面那个加强版?貌似和htmlspecialchars函数是一样的
#FILTER_SANITIZE_STRING 过滤器去除或编码不需要的字符。
# flags
# FILTER_FLAG_NO_ENCODE_QUOTES - 该标志不编码引号
# FILTER_FLAG_STRIP_LOW - 去除 ASCII 值在 32 以下的字符
# FILTER_FLAG_STRIP_HIGH - 去除 ASCII 值在 32 以上的字符
# FILTER_FLAG_ENCODE_LOW - 编码 ASCII 值在 32 以下的字符
# FILTER_FLAG_ENCODE_HIGH - 编码 ASCII 值在 32 以上的字符
# FILTER_FLAG_ENCODE_AMP - 把 & 字符编码为 &amp;
$result = filter_var('<script>alert(\'&nbsp;中文\')</a>',FILTER_SANITIZE_STRING,FILTER_FLAG_ENCODE_AMP);
var_dump($result);
# FILTER_SANITIZE_URL 可以清理除了 字母和数字 以及 $-_.+!*'(),{}|\\^~[]`<>#%";/?:@&=以外的字符
# FILTER_UNSAFE_RAW 感觉意义不大,需要配合flags才能工作 详见PHP手册

PHP提示Notice: Undefined variable的解决办法

PHP默认配置会报这个错误,我的PHP版本是5.x及7.x都存在这个问题:
Notice: Undefined variable
这就是将警告在页面上打印出来,虽然这是有利于暴露问题,但实现使用中会存在很多问题。

需要设置显示错误级别,来解决问题。
通用解决办法是修改php.ini的配置:
解决方法:

1) error_reporting设置:

找到error_reporting = E_ALL
修改为error_reporting = E_ALL & ~E_NOTICE

2) register_globals设置:

找到register_globals = Off
修改为register_globals = On

在php代码中直接顶部增加一句

ini_set("error_reporting","E_ALL & ~E_NOTICE");

也可解决;

WINDOWS SERVER 2008/R2/2012最大内存支持及版本升级方法

Windows Server 2008 最大内存限制:

Windows Server 2008 x86
Windows Server 2008 标准版,支持最大 4GB 内存
Windows Server 2008 企业版,支持最大 64GB 内存
Windows Server 2008 数据中心版,支持最大 64GB 内存

Windows Server 2008 x64 with 或 without Hyper-V Role Enable
Windows Server 2008 标准版,支持最大 32GB 内存
Windows Server 2008 企业版,支持最大 1TB 内存
Windows Server 2008 数据中心版,支持最大 1TB 内存

Windows Server2008 R2 最大内存限制:
Windows Server 2008 R2 with Hyper-V Role Enable
Windows Server 2008 R2 标准版,最大支持 32GB 内存
Windows Server 2008 R2 企业版,最大支持 1TB 内存
Windows Server 2008 R2 数据中心版,最大支持 1TB 内存
Windows Server 2008 R2 without Hyper-V Role Enable
Windows Server 2008 R2 标准版,最大支持 32GB 内存
Windows Server 2008 R2 企业版,最大支持 2TB 内存
Windows Server 2008 R2 数据中心版,最大支持 2TB 内存

Windows Server 2012 Standard
Windows Server 2012 Datacenter

Windows Server 2012支持以下最大的硬件规格
64个物理处理器
640个逻辑处理器(关闭Hyper-V,打开就支持320个)
4TB内存

2008R2标准版操作系统升级到企业版。不想重装系统只能用升级命令是DISM.exe。需在线升级。

升级步骤:  

第一步:停用此台服务器上所有正在运行的应用程序,把应用程序服务由自动改为手动 。 

第二步:获取当前操作系统版本信息,dism /online /Get-CurrentEdition

第三步:检查当前操作系统可升级的版本  dism/online /Get-TargetEditions

第四步:输入操作系统升级命令,目标版本和序列号。安装完成后第1次重启系统  

dism /online /Set-Edition:ServerEnterprise/productkey:XXXXX XXXXX - XXXXX - XXXXX - XXXXX

第一个参数是edition ID, 也就是第二步中查询到的目标版本; 第二个参数是ProductKey,25个字符的目标系统版本的产品密钥。

第五步:系统重新启后进行版本升级的系统配置,当配置完成后第2次重启系统。

第六步:第2次重启完成后,登录操作检查操作系统的版本、系统激活状态。

如果开始出现了一次语法错误报87,又出现了产品密钥不符报1605,总之这个密钥一定要对。待到成功后会提示重启,一共是两次重启吧,最终Windows Server 2008 R2 标准版升级到企业版大功告成,系统登陆时就能看到的。

JS实现页面打印

方式一:window.print()
整体打印

<a href="javascrīpt:window.print()" target="_self">打印</a>

现在就轻松实现了页面的打印,但是这种方式会将整个页面打印,如果想要实现指定区域的打印需要通过下面的设置
局部打印
首先,在html中,通过star和end来标记打印区域

<h1>这块内容不需要打印</h1>
<!--startprint-->
<div class="content">
    这里是需要打印的内容
        .....
</div>
<!--endprint-->
<h1>这块内容不需要打印</h1>

然后,在点击事件中添加如下代码

function doPrint() {      
        bdhtml=window.document.body.innerHTML;      
        sprnstr="<!--startprint-->";      
        eprnstr="<!--endprint-->";      
        prnhtml=bdhtml.substr(bdhtml.indexOf(sprnstr)+17);      
        prnhtml=prnhtml.substring(0,prnhtml.indexOf(eprnstr));      
        window.document.body.innerHTML=prnhtml;   
        window.print();      
}

过滤打印区域的内容
例如

<!--startprint-->
<div class="content">
    <button class="noprint">预览</button>
    <button class="noprint">打印</button>
      这里是需要打印的内容
        .....
    </div>
<!--endprint-->

上面的预览和打印按钮不希望打印,如果要过滤的话可以做下面的样式设置

        <style type="text/css">
            @media print {
                .noprint{
                    display: none;
                }
            }
        </style>
or

        <style type="text/css" media="print">
            .noprint{
                display: none;
            }
        </style>

两种写法任选其一

分页打印
使用 window.print() 打印时,如果内容超出会自动分页。但是我们如果需要自定义分页范围,如碰到表格分页打印,可以进行如下设置:

<table width="100%"  border="0" cellpadding="0" cellspacing="0"  style="page-break-after:always" > 
</table>

方式二、jqprint()
jqprint是一个基于jQuery编写的页面打印的一个小插件,但是不得不承认这个插件确实很厉害,最近的项目中帮了我的大忙,在Web打印的方面,前端的打印基本是靠window.print()的方式进行打印的,而这个插件在其基础上进行了进一步的封装,可以轻松实现打印网页上的某个区域,这是个亮点。

请注意!很多朋友遇到 Cannot read property 'opera' of undefined 错误问题是juqery版本兼容问题
解决方法:加入迁移辅助插件 jquery-migrate-1.0.0.js可解决版本问题

引入

<script language="javascript" src="jquery-1.4.4.min.js"></script>
<script language="javascript" src="jquery.jqprint-0.3.js"></script>
<script language="javascript">
function  a(){
        $("#ddd").jqprint();
    }
</script>
<div id="ddd">
    <table>
        <tr>
            <td>test</td>
            <td>test</td>
            <td>test</td>
            <td>test</td>
            <td>test</td>
        </tr>
    </table>
</div>
<input type="button" onclick=" a()" value="打印"/>

设置模板打印

$("#printContainer").jqprint({
     debug: false, //如果是true则可以显示iframe查看效果(iframe默认高和宽都很小,可以再源码中调大),默认是false
     importCSS: true, //true表示引进原来的页面的css,默认是true。(如果是true,先会找$("link[media=print]"),若没有会去找$("link")中的css文件)
     printContainer: true, //表示如果原来选择的对象必须被纳入打印(注意:设置为false可能会打破你的CSS规则)。
     operaSupport: true//表示如果插件也必须支持歌opera浏览器,在这种情况下,它提供了建立一个临时的打印选项卡。默认是true
});

附言
另外还可以使用html 标签<object>引入Webbrowser控件(只兼容IE)或者调用windows底层打印,报安全警告,不建议使用(不支持局部打印)
用户在打印网页的时候,页面上会出现网页的名字,页码,链接地址和打印时间,如果用户不需要这些信息,则需要设置用户的网页设置:
具体如下:文件-》页面设置-》将页眉页脚中的代码删除即可。打印出来的文档没有页码信息和链接地址信息
附件为用到的js文件下载。
jquery.jqprint-0.3.js
jquery-2.1.4.min.js
jquery-migrate-1.2.1.min.js

javascripts.zip

MySQL删除数据库中的所有表的两个方法

快速删除MySQL数据库中的所有表的两个方法:

1、最简单的方法,最方便的方法:

删除数据库,然后重新建立一个空数据库

2、但是有删除所有表的方法

(1)使用concat函数产生删除表的sql语句,

select concat("DROP TABLE IF EXISTS ", table_name, ";") from information_schema.tables where table_schema="Your_database_name";

(2)执行sql语句

DROP TABLE IF EXISTS aws_active_data;
DROP TABLE IF EXISTS aws_answer;
DROP TABLE IF EXISTS aws_answer_comments;
DROP TABLE IF EXISTS aws_answer_thanks;
DROP TABLE IF EXISTS aws_answer_uninterested;
DROP TABLE IF EXISTS aws_answer_vote;
DROP TABLE IF EXISTS aws_approval;
DROP TABLE IF EXISTS aws_article;
DROP TABLE IF EXISTS aws_article_comments;
DROP TABLE IF EXISTS aws_article_vote;
DROP TABLE IF EXISTS aws_attach;
DROP TABLE IF EXISTS aws_category;
DROP TABLE IF EXISTS aws_column;
DROP TABLE IF EXISTS aws_column_focus;
DROP TABLE IF EXISTS aws_draft;
DROP TABLE IF EXISTS aws_edm_task;
DROP TABLE IF EXISTS aws_edm_taskdata;
DROP TABLE IF EXISTS aws_edm_unsubscription;
DROP TABLE IF EXISTS aws_edm_userdata;
DROP TABLE IF EXISTS aws_edm_usergroup;
DROP TABLE IF EXISTS aws_education_experience;
DROP TABLE IF EXISTS aws_favorite;

附concat函数使用方法:
CONCAT(str1,str2,…)

返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回值为 NULL。

注意:
如果所有参数均为非二进制字符串,则结果为非二进制字符串。
如果自变量中含有任一二进制字符串,则结果为一个二进制字符串。
一个数字参数被转化为与之相等的二进制字符串格式;若要避免这种情况,可使用显式类型 cast, 例如:

SELECT CONCAT(CAST(int_col AS CHAR), char_col)

MySQL的concat函数可以连接一个或者多个字符串,如

mysql> select concat('10');
+--------------+
| concat('10') |
+--------------+
| 10   |
+--------------+
1 row in set (0.00 sec)
mysql> select concat('11','22','33');
+------------------------+
| concat('11','22','33') |
+------------------------+
| 112233 |
+------------------------+
1 row in set (0.00 sec)

MySQL的concat函数在连接字符串的时候,只要其中一个是NULL,那么将返回NULL
mysql> select concat('11','22',null);
+------------------------+
| concat('11','22',null) |
+------------------------+
| NULL   |
+------------------------+
1 row in set (0.00 sec)

最新

分类

归档

评论

  • Liang: 贴下编译参数和步骤,...
  • shao3911: 您好,为什么我在编译...
  • aliang: 先看是yum安装还是...
  • aliang: 将原来的nginx安...
  • yen: 3、如果要回滚的话,...
  • yen: 刚好需要升级ngin...
  • 文雨: 一些新的method...
  • aliang: 默认不屏蔽估计开发团...
  • 山野愚人居: PHP既然允许直接使...
  • aliang: 最下面有github地址·

其它