Linux Mysql常用命令

连接Mysql
1、本地连接
mysql -uroot -p123456
2、远程连接
mysql -h110.110.110.110 -uroot -p123456
//连接host为110.110.100.100的服务器,数据库用户名为root,密码为123456的机器,回车即可进入到MYSQL中了,MYSQL的提示符是: mysql>

操作Mysql
1、显示数据库列表。
show databases;
2、显示库中的数据表:
use mysql; //打开库
show tables;
3、显示数据表的结构:
describe 表名;
4、建库:
create database 库名;
5、建表:
use 库名;
create table 表名(字段设定列表);
6、删库和删表:
drop database 库名;
drop table 表名;
7、将表中记录清空:
delete from 表名;
8、显示表中的记录:
select * from 表名;
9、导出数据库和表:
mysqldump -hhost -uuser -ppass –databases dbname > file.sql //不是在mysql>状态下执行
10、增加新用户:
grant select on 数据库.* to 用户名@登录主机 identified by “密码”
如增加一个用户test密码为123,让他可以在任何主机上登录, 并对所有数据库有查询、插入、修改、删除的权限。首先用以root用户连入mysql,然后键入以下命令:
grant select,insert,update,delete on *.* to ” Identified by “123″;
增加所有权限命令:
GRANT ALL PRIVILEGES ON *.* TO ‘root’@'%’ IDENTIFIED BY ’123456′;
11、刷新权限:
FLUSH PRIVILEGES;
12、查看创建表的SQL语句:
SHOW CREATE TABLE table_name;
13、查看表状态(已用空间等):
SHOW TABLE STATUS LIKE ‘Login’\G
*************************** 1. row ***************************
Name: Login
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 31687398
Avg_row_length: 110
Data_length: 3494789120
Max_data_length: 0
Index_length: 1858551808
Data_free: 67802905968640
Auto_increment: NULL
Create_time: NULL
Update_time: NULL
Check_time: NULL
Collation: utf8_general_ci
Checksum: NULL
Create_options: partitioned
Comment: NULL
1 row in set (28.03 sec)

[转]利用php调用C语言 扩展函数

第一步. 生成需要调用的so文件

1. 首先做一个简单的so文件:

/** * hello.c
* To compile, use following commands:
*   gcc -O -c -fPIC -o hello.o hello.c
*   gcc -shared -o libhello.so hello.o
*/
int hello_add(int a, int b)
{
return a + b;
}

然后将它编译成.so文件并放到系统中:

$ gcc -O -c -fPIC -o hello.o hello.c #-fPIC:是指生成的动态库与位置无关;假如是c++程序,用g++  -O -c -fPIC -o hello.o hello.c
$ gcc -shared -o libhello.so hello.o #-shared:是指明生成动态链接库;假如需要编译多个文件:g++ a.h b.cpp -fPIC -shared -o libtest.so
$ cp libhello.so /usr/local/lib #把生成的链接库放到指定的地址
$ echo /usr/local/lib > /etc/ld.so.conf.d/local.conf #把库地址写入到配置文件中
$ /sbin/ldconfig #用此命令,使刚才写的配置文件生效

2. 写段小程序来验证其正确性:

/**
* hellotest.c
* To compile, use following commands:
*   gcc -o hellotest -lhello hellotest.c
*/
#include <stdio.h>
int main()
{
int a = 3, b = 4;
printf("%d + %d = %d", a, b, hello_add(a,b));
return 0;
}

编译并执行:

$ gcc -o hellotest -lhello hellotest.c #编译测试文件,生成测试程序
$ ./hellotest #运行测试程序

第二步. 制作PHP模块(外部模块)

请确保你已安装 PHP及APACHE服务器。

$ cd php-5.2.3/ext

1. 然后通过下面的命令用ext_skel脚本建立一个名为 hello 的模块:

$ ./ext_skel --extname=hello

2. 执行该命令之后它会提示你应当用什么命令来编译模块,可惜那是将模块集成到php内部的编译方法。

如果要编译成可动态加载的 php_hello.so,方法要更为简单。

$ cd hello

首先编辑 config.m4 文件,去掉第16行和第18行的注释(注释符号为 dnl 。)

16: PHP_ARG_ENABLE(hello, whether to enable hello support,

17: dnl Make sure that the comment is aligned:

18: [ --enable-hello Enable hello support])

3. 然后执行 phpize 程序,生成configure脚本:

$ phpize

该程序在ubuntu的php5-dev包中

4. 打开 php_hello.h,在 PHP_FUNCTION(confirm_hello_compiled); 之下加入函数声明:

PHP_FUNCTION(confirm_hello_compiled); /* For testing, remove later. */

PHP_FUNCTION(hello_add);

5. 打开 hello.c,在 PHP_FE(confirm_hello_compiled, NULL) 下方加入以下内容。

zend_function_entry hello_functions[] = {

PHP_FE(confirm_hello_compiled, NULL) /* For testing, remove later. */

PHP_FE(hello_add, NULL) /* For testing, remove later. */

{NULL, NULL, NULL} /* Must be the last line in hello_functions[] */};

然后在 hello.c 的最末尾书写hello_add函数的内容:

PHP_FUNCTION(hello_add)

{

long int a, b;

long int result;

if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, “ll”, &a, &b) == FAILURE) {

return;

}

result = hello_add(a, b);

RETURN_LONG(result);}保存退出,编译并安装。

表: zend_parse_parameters() 字母对应的类型

类型 字母 变量类型
Boolean b zend_bool
Long l long
Double d double
String s char *, int
Resource r zval *
Array a zval *
Object o zval*
zval z zval*

6. 编译

$ ./configure
#此处由于php-config的路径问题报错,解决方法:./configure --with-php-config=/usr/local/php/bin/php-config
$ make LDFLAGS=-lhello
$ sudo make install #编译生成了php扩展模块
Installing shared extensions: /usr/lib/php5/20060613
$ cp modules/hello.so /usr/lib/php/modules
$ vim /usr/local/php/lib/php.ini
#enable_dl = Off;允许dl()动态加载so扩展功能enable_dl = On
#增加一条:extension=hello.so
$ /usr/local/apache2/bin/apachectl restart

然后在 /var/www/html 下建立一个 hello.php 文件,内容如下:

<?php
dl("hello.so");
echo hello_add(3, 4);
?>

然后在浏览器中打开hello.php文件,如果显示7,则说明函数调用成功了。

第三步. 制作PHP模块(内部模块)

另外可以在apache重启的时候让我们的so库直接动态编译进php5,就像linux的insmod hello.ko模块一样,不用dl加载也不用重新编译php,就可以直接使用so的函数了,步骤如下:

$ vim /etc/php5/apache2/php.ini
#enable_dl = Off
#增加一条:extension=hello.so
$ /usr/local/apache2/bin/apachectl restart

不能reload而必须restart apache,这样so就像insmod hello.ko一样被融到了php5内核,然后代码就可以忽略掉dl(“hello.so”);了,
[注意,这种方式只适合hello.so库内所有功能代码已经全部调试ok,如果还处在调试期间,那么需要采用上面的dl强制加载的方式]

代码如下:

<?php
echo hello_add(3, 4);
?>

但是该功能不太适合调试,因为每次修改hello.so中代码的话,都需要让service apache restart重启才能让php5内核再次加载新的hello.so扩展.可以这样定义hello.so的实现,这样每次执行.php网页,都会在 /var/www/下建立一个文件夹,所以php扩展实现了

samba安装与配置

由于公司的代码统一独立服务器管理,为了方便开发,在开发机上配置samba映射一个目录,来进行SVN的提交和更新。

samba安装

$ wget http://www.samba.org/samba/ftp/stable/samba-3.6.0.tar.gz
$ ls
$ rm samba-3.6.0.tar.gz
$ rz
$ tar -zxvf samba-3.6.0.tar.gz
$ cd samba-3.6.0/
$ ls
$ find . -name configure
$ ./source3/configure
$ cd source3/
$ mkdir /usr/local/samba
$ ./configure --prefix=/usr/local/samba/
$ make
$ make install
$ make clean
$ cd /usr/local/samba
$ ls
$ mkdir etc
$ cp /home/super/samba-3.6.0/examples/smb.conf.default  ./etc/smb.conf

//启动samba服务

$ /usr/local/samba/sbin/smbd -D
$ /usr/local/samba/sbin/nmbd -D
$ /usr/local/samba/sbin/winbindd -D

//查看samba网络情况

$ netstat -tlnp | grep smb

samba配置

# 添加系统用户
$ useradd superzc
$ passwd superzc
# 创建samba用户
$ /usr/local/samba/bin/smbpasswd -a superzc #必须是系统已存在的用户

$ vim /usr/local/samba/lib/smb.conf
#增加
[superzc]
comment = superzc
path = /var/www/html/superzc
directory mask = 0700
valid users = superzc
read only = No
create mask = 0755

连接
Windows -> 映射网络驱动器 -> \\10.1.163.42\superzc -> 输入用户名和密码 -> 成功访问

subversion和apache,apr,apr-util,neon的关系

这里简单说明一下svn服务器和客户端的安装说明。

服务器

subversion服务器是不需要apache的,但是可以使用apache,视具体情况来选择。
1、如果只要通过file://或svn://来访问,则不需要apache,只安装svn即可,使用svnserve来作为服务。
2、如果你要建立一个可以通过http://或https://来访问的版本库服务器,则你需要使用apache。

客户端

在windows下,不管你要访问的是什么类型的服务器,只要安装一个TortoiseSVN就可以了,开发者已经帮你搞定一切。
在类Linux系统下,如果你通过file://或svn://来访问,则只要编译安装svn就可以,
如果通过http://访问,则要同neon编译,
如果通过https://访问,则要同带ssl支持的neon编译,
不论怎样,都要同apr和apr-util编译。

LINUX平台安装SVN客户端

1. 安装前准备

1)安装环境:SUSE-10.0,subversion-1.4.5
2) 需要3个tar.gz形式的源代码压缩包:
apr-1.2.11.tar.gz
apr-util-1.2.10.tar.gz
subversion-1.4.5.tar.gz
3) 系统需带有gcc等编译器

2. 安装步骤

1) 安装apr
以root帐号登陆linux系统,进入apr软件包存放的路径,依次执行以下命令:

$ tar zxvf apr-1.2.11.tar.gz
$ cd apr apr-1.2.11
$ ./configure
$ make
$ make install
$ make clean

2) 安装apr-util
和apr类似,进入apr-util软件包存放的路径,依次执行以下命令:

$ tar zxvf apr-util-1.2.10.tar.gz
$ cd apr apr-1.2.11
$ ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/
$ make
$ make install
$ make clean

3)安装neon //为了支持http://和https://访问

$ tar zxvf neon-0.28.4.tar.gz
$ cd neon-0.28.4
$ ./configure --prefix=/usr/local/neon --enable-shared --with-ssl
$ make
$ make install

4)安装sqlite

$ tar zxvf sqlite-amalgamation-3.7.3.tar.gz
$ cd sqlit-3.7.3
$ ./configure --prefix=/usr/loca/sqlite
$ make && make install

5) 安装subversion
在存放subversion软件包的路径下,依次执行:

$ tar zvxf subversion-1.4.5.tar.gz
$ cd subversion-1.4.5
$ ./configure --prefix=/usr/local/svn --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-neon=/usr/local/neon --with-ssl
$ make
$ make install
$ make clean

3. 验证安装成功

键入svn –version,如出现版本信息,显示如下,则表示安装成功:

4. 遇到问题

1)重启apache时出现错误:Error:while loading shared libraries libexpat.so.1 cannot open open shared object file No such file or directory

解决方案:在etc/ld.so.config文件中加入:usr/lib和usr/local/lib然后ldconfig下。

PS:/etc/ld.so.conf: 这个文件记录了编译时使用的动态链接库的路径。ldconfig命令是:将/etc/ld.so.conf列出的路径下的库文件 缓存到/etc/ld.so.cache 以供使用。

2)编译subversion时出现:configure: error: Subversion requires SQLite
解决方案:

$ cd sqllit-3.7.3
$ cp sqlite3.c ../subversion-1.6.17/sqlite-amalgamation/sqlite3.c

3)配置完成后,重启apache时出现的错误:httpd: Syntax error on line 53 of /usr/local/apache2/conf/httpd.conf: Cannot load /usr/local/apache2/modules/mod_dav_svn.so into server: /usr/local/apache2/modules/mod_dav_svn.so:

解决方案:

$ ./configure --prefix=/usr/local/apache2/--enable-module --enable-shared--enable-dav--enable-so --enable-maintainer-mode --enable-rewrite
#此处配置的为apache的参数,配置完成后需要重新安装。

解决远程连接mysql 错误1130代码

更改 “mysql” 数据库里的 “user” 表里的 “host” 项,从”localhost”改称’%'。
#mysql -u root -p
mysql>use mysql;
mysql>select ‘host’ from user where user=’root’;
mysql>update user set host = ‘%’ where user =’root’;
mysql>flush privileges;
mysql>select ‘host’ from user where user=’root’;
第一句是以权限用户root登录
第二句:选择mysql库
第三句:查看mysql库中的user表的host值(即可进行连接访问的主机/IP名称)
第四句:修改host值(以通配符%的内容增加主机/IP地址),当然也可以直接增加IP地址
第五句:刷新MySQL的系统权限相关表
第六句:再重新查看user表时,有修改。。
重起mysql服务即可完成:
#/etc/init.d/mysqld restart

PS:
之前lamp环境配置的时候将mysqld服务放到了/etc/rc.d/init.d/目录下,这里解释一下/etc/init.d和/etc/rc.d/init.d的区别是:/etc/init.d是/etc/rc.d/init.d软链接(soft link) 。/etc/rc.d/init.d目录下的脚本就类似与windows中的注册表,这个目录存放的是一些脚本,一般是linux以rpm包安装时设定的一些服务的启动脚本,在系统启动的时候某些指定脚本将被执行开机时运行的脚本。

[转]mysql explain详解

关于常常运用mysql的兄弟们,对explain一定不会生疏。当你在一条SELECT语句前放上关键词EXPLAIN,MySQL解释它将如何处置SELECT,提供有关表如何结合和以什么次第的信息。
借助于EXPLAIN,你可以晓得
1)你什么时分必需为表参加索引以失掉一个运用索引找到记载的更快的SELECT。
2)你也能晓得优化器能否以一个最佳次第联合表。为了强迫优化器对一个SELECT语句运用一个特定联合次第,添加一个STRAIGHT_JOIN子句。
官方的关于explain的文档在http://dev.mysql.com/doc/refman/5.1/en/using-explain.html(英文),本文可作为官方文献的不完好浅显读物。
运用的办法

EXPLAIN tbl_name
或:
EXPLAIN [EXTENDED] SELECT select_options

前者可以得出一个表的字段构造等等,后者次要是给出相关的一些索引信息,而明天要讲述的重点是后者。
举例

mysql> explain select * from event;
+—-+————-+——-+——+—————+——+———+——+——+——-+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+—-+————-+——-+——+—————+——+———+——+——+——-+
| 1 | SIMPLE | event | ALL | NULL | NULL | NULL | NULL | 13 | |
+—-+————-+——-+——+—————+——+———+——+——+——-+
1 row in set (0.00 sec)
各个属性的含义

id
select查询的序列号

select_type
select查询的类型,次要是区别普通查询和结合查询、子查询之类的复杂查询。

table
输入的行所援用的表。

type
结合查询所运用的类型。
type显示的是拜访类型,是较为重要的一个目标,后果值从好到坏顺次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
普通来说,得保证查询至多到达range级别,最好能到达ref。

possible_keys
指出MySQL能运用哪个索引在该表中找到行。假如是空的,没有相关的索引。这时要进步功能,可经过检验WHERE子句,看能否援用某些字段,或许反省字段不是合适索引。

key
显示MySQL实践决议运用的键。假如没有索引被选择,键是NULL。

key_len
显示MySQL决议运用的键长度。假如键是NULL,长度就是NULL。文档提示特别留意这个值可以得出一个多重主键里mysql实践运用了哪一局部。

ref
显示哪个字段或常数与key一同被运用。

rows
这个数表示mysql要遍历多少数据才能找到,在innodb上是不精确的。

Extra
假如是Only index,这意味着信息只用索引树中的信息检索出的,这比扫描整个表要快。
假如是where used,就是运用上了where限制。
假如是impossible where 表示用不着where,普通就是没查出来啥。
假如此信息显示Using filesort或许Using temporary的话会很费劲,WHERE和ORDER BY的索引常常无法统筹,假如依照WHERE来确定索引,那么在ORDER BY时,就必定会惹起Using filesort,这就要看是先过滤再排序划算,还是先排序再过滤划算。
罕见的一些名词解释

Using filesort
MySQL需求额定的一次传递,以找出如何按排序顺序检索行。

Using index
从只运用索引树中的信息而不需求进一步搜索读取实践的行来检索表中的列信息。

Using temporary
为理解决查询,MySQL需求创立一个暂时表来包容后果。

ref
关于每个来自于后面的表的行组合,一切有婚配索引值的即将从这张表中读取

ALL
完全没有索引的状况,功能十分地差劲。

index
与ALL相反,除了只要索引树被扫描。这通常比ALL快,由于索引文件通常比数据文件小。

SIMPLE
复杂SELECT(不运用UNION或子查询)

使用USE INDEX优化Mysql数据库

USE INDEX (indexname) 来强制使用一个索引

优化前SQL执行时间,如下图:

优化表结构,增加联合索引,如下图:

优化后SQL执行时间,如下图:

优化后,执行SQL:

EXPLAIN  SELECT  DISTINCT (
shop_id
)
FROM goods_items
USE  INDEX ( package_2 )
WHERE package =  'false'
AND channel_id =  '1'
AND marketable =  'true'
AND shop_open =  'true'
AND areaflag =  'suzhou'
AND price_sc >  '0.00'
AND cat_id
IN (
'403',  '410',  '414',  '404',  '405',  '406',  '407',  '408',  '409',  '806',  '411',  '412',  '413',  '393'
)
ORDER  BY buy_count DESC
LIMIT 0 , 10;

如下图所示:

而优化前则,如下图所示:

总结一下,加了USE INDEX之后效率提升非常明显。经过测试,应该和SQL语句中带有ORDER BY也有很大的关系,如下图所示:

[转]树形结构算法—预排序遍历树算法

预排序遍历树算法(modified preorder tree traversal algorithm),比递归查询更效率。

树结构:
Food
|
|—Fruit
| |
| |—Red
| | |
| | |–Cherry
| |
| |—Yellow
| |
| |–Banana
|
|—Meat
| |
| |–Beef
| |
| |–Pork

预排序遍历树算法:
1 Food 18
|
+—————————————+
| |
2 Fruit 11 12 Meat 17
| |
+————————+ +———————+
| | | |
3 Red 6 7 Yellow 10 13 Beef 14 15 Pork 16
| |
4 Cherry 5 8 Banana 9

表结构:
+————+—–+—–+
| name | lft | rgt |
+————+—–+—–+
| Food | 1 | 18 |
| Fruit | 2 | 11 |
| Red | 3 | 6 |
| Cherry | 4 | 5 |
| Yellow | 7 | 10 |
| Banana | 8 | 9 |
| Meat | 12 | 17 |
| Beef | 13 | 14 |
| Pork | 15 | 16 |
+————+—–+—–+
例如:我们需要得到”Fruit”项下的所有所有节点就可以这样写查询语句: SELECT * FROM tree WHERE lft BETWEEN 2 AND 11; 这个查询得到了以下的结果。
+————+—–+—–+
| name | lft | rgt |
+————+—–+—–+
| Fruit | 2 | 11 |
| Red | 3 | 6 |
| Cherry | 4 | 5 |
| Yellow | 7 | 10 |
| Banana | 8 | 9 |
+————+—–+—–+

显示整个树状结构:

我们还需要对这样的查询进行排序。用节点的左值进行排序:
SELECT * FROM tree WHERE lft BETWEEN 2 AND 11 ORDER BY lft ASC;
剩下的问题如何显示层级的缩进了。

function display_tree($root)
{
// 得到根节点的左右值
$result = mysql_query('SELECT lft, rgt FROM tree '.'WHERE name="'.$root.'";');
$row = mysql_fetch_array($result); 

// 准备一个空的右值堆栈
$right = array(); 

// 获得根基点的所有子孙节点
$result = mysql_query('SELECT name, lft, rgt FROM tree '.
'WHERE lft BETWEEN '.$row['lft'].' AND '.
$row['rgt'].' ORDER BY lft ASC;'); 

// 显示每一行
while ($row = mysql_fetch_array($result))
{
// only check stack if there is one
if (count($right)>0)
{
// 检查我们是否应该将节点移出堆栈
while ($right[count($right)-1]<$row['rgt'])
{
array_pop($right);
}
} 

// 缩进显示节点的名称
echo str_repeat(' ',count($right)).$row['name']."n"; 

// 将这个节点加入到堆栈中
$right[] = $row['rgt'];
}
}

将name和parent结构的表自动转换成带有左右值的数据表的函数:

function rebuild_tree($parent, $left) {
// the right value of this node is the left value + 1
$right = $left+1; 

// get all children of this node
$result = mysql_query('SELECT name FROM tree '.
'WHERE parent="'.$parent.'";');
while ($row = mysql_fetch_array($result)) {
// recursive execution of this function for each
// child of this node
// $right is the current right value, which is
// incremented by the rebuild_tree function
$right = rebuild_tree($row['name'], $right);
} 

// we've got the left value, and now that we've processed
// the children of this node we also know the right value
mysql_query('UPDATE tree SET lft='.$left.', rgt='.
$right.' WHERE name="'.$parent.'";'); 

// return the right value of this node + 1
return $right+1;
}

当然这个函数是一个递归函数,我们需要从根节点开始运行这个函数来重建一个带有左右值的树

rebuild_tree(‘Food’,1);
这个函数看上去有些复杂,但是它的作用和手工对表进行编号一样,就是将立体多层结构的转换成一个带有左右值的数据表。

增加一个节点一般有两种方法:

保留原有的name 和parent结构,用老方法向数据中添加数据,每增加一条数据以后使用rebuild_tree函数对整个结构重新进行一次编号。
效率更高的办法是改变所有位于新节点右侧的数值。举例来说:我们想增加一种新的水果”Strawberry”(草莓)它将成为”Red”节点的最后一个子节点。首先我们需要为它腾出一些空间。”Red”的右值应当从6改成8,”Yellow 7-10 “的左右值则应当改成 9-12。 依次类推我们可以得知,如果要给新的值腾出空间需要给所有左右值大于5的节点 (5 是”Red”最后一个子节点的右值) 加上2。 所以我们这样进行数据库操作:

UPDATE tree SET rgt=rgt+2 WHERE rgt>5;
UPDATE tree SET lft=lft+2 WHERE lft>5;

这样就为新插入的值腾出了空间,现在可以在腾出的空间里建立一个新的数据节点了, 它的左右值分别是6和7

INSERT INTO tree SET lft=6, rgt=7, name='Strawberry';

Linux 常用命令

vim替换命令

利用 :s 命令可以实现字符串的替换。具体的用法包括:

:s/str1/str2/ 用字符串 str2 替换行中首次出现的字符串 str1

:s/str1/str2/g 用字符串 str2 替换行中所有出现的字符串 str1

:.,$ s/str1/str2/g 用字符串 str2 替换正文当前行到末尾所有出现的字符串 str1

:1,$ s/str1/str2/g 用字符串 str2 替换正文中所有出现的字符串 str1

:g/str1/s//str2/g 功能同上

chmod

说明:Linux/Unix 的档案调用权限分为三级 : 档案拥有者、群组、其他。利用 chmod 可以藉以控制档案如何被他人所调用

chmod [-cfvR] [--help] [--version] mode file

mode : 权限设定字串,格式如下 : [ugoa...][[+-=][rwxX]…][,...],其中
u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该档案是个子目录或者该档案已经被设定过为可执行。
-c : 若该档案权限确实已经更改,才显示其更改动作
-f : 若该档案权限无法被更改也不要显示错误讯息
-v : 显示权限变更的详细资料
-R : 对目前目录下的所有档案与子目录进行相同的权限变更(即以递回的方式逐个变更)
–help : 显示辅助说明
–version : 显示版本

此外chmod也可以用数字来表示权限如 chmod 777 file
语法为:chmod abc file
其中a,b,c各为一个数字,分别表示User、Group、及Other的权限。
r=4,w=2,x=1
若要rwx属性则4+2+1=7;
若要rw-属性则4+2=6;
若要r-x属性则4+1=7。

例子1:chmod a=rwx file 和 chmod 777 file

例子2:将档案 file1.txt 设为所有人皆可读取 : chmod ugo+r file1.txt

例子3:将目前目录下的所有档案与子目录皆设为任何人可读取 : chmod -R a+r *

chown

chmod [-cfvR] [--help] [--version] mode file

说明:chown将指定文件的拥有者改为指定的用户或组。用户可以是用户名或用户I D。组可以是组名或组ID。文件是以空格分开的要改变权限的文件列表,支持通配符。

-R 递归式地改变指定目录及其下的所有子目录和文件的拥有者。
-v 显示chown命令所做的工作

例子1:chown super test.c 把文件test.c的所有者改为super。
例子2:chown -R super.users /his 把目录/his及其下的所有文件和子目录的属主改成super,属组改成users。

crontab

crontab命令的功能是在一定的时间间隔调度一些命令的执行。在/etc目录下有一个crontab文件,这里存放有系统运行的一些调度程序。每个用户可以建立自己的调度crontab。

第一到第五个字段的整数取值范围及意义是:
0~59 表示分
1~23 表示小时
1~31 表示日
1~12 表示月份
0~6 表示星期(其中0表示星期日)

#cd /etc
#vim crontab

例子1:*/5 * * * * root links –dump http://www.superzc.com
例子2:*/5 * * * * root /var/www/html/test.php

df

说明:Df命令是Linux查看磁盘空间系统以磁盘分区为单位查看文件系统,可以加上参数查看磁盘剩余空间信息,如下:

#df -hl

Filesystem Size Used Avail Capacity Mounted on
/dev/disk0s2 298Gi 36Gi 261Gi 13% /

scp

1.获取远程服务器上的文件

#scp -P 2222 root@www.superzc.com:/root/test.tar.gz /home/test.tar.gz

2.获取远程服务器上的目录

#scp -P 2222 -r root@www.superzc.com:/root/test/ /home/test/

PS:拷贝mysql的数据库之后,需要更改文件权限:
#chown mysql.mysql *
#ls -ll

getconf

说明:将系统配置变量值写入标准输出

#getconf -a //将全部系统配置变量值写入标准输出

#getconf LONG_BIT //假如在uname -a无法判断系统位数时,可以判断系统属于32位或者是64位

rz/sz

说明:只要在windows下安装SecureCRT,就可以进行文件传输,真方便啊!

#rz

curl

说明:curl是Linux下一个很强大的http命令行工具,其功能十分强大。

# curl -d user=superzc http://www.superzc.com/cgi-bin/super //以POST模式请求,user是POST的参数;superzc是POST的参数值;http://www.superzc.com/cgi-bin/super请求地址

HTTP 协议

HTTP 304

304 的标准解释是:Not Modified 客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。

如果客户端在请求一个文件的时候,发现自己缓存的文件有 Last Modified ,那么在请求中会包含 If Modified Since ,这个时间就是缓存文件的 Last Modified 。因此,如果请求中包含 If Modified Since,就说明已经有缓存在客户端。只要判断这个时间和当前请求的文件的修改时间就可以确定是返回 304 还是 200 。对于静态文件,例如:CSS、图片,服务器会自动完成 Last Modified 和 If Modified Since 的比较,完成缓存或者更新。但是对于动态页面,就是动态产生的页面,往往没有包含 Last Modified 信息,这样浏览器、网关等都不会做缓存,也就是在每次请求的时候都完成一个 200 的请求。

因此,对于动态页面做缓存加速,首先要在 Response 的 HTTP Header 中增加 Last Modified 定义,其次根据 Request 中的 If Modified Since 和被请求内容的更新时间来返回 200 或者 304 。虽然在返回 304 的时候已经做了一次数据库查询,但是可以避免接下来更多的数据库查询,并且没有返回页面内容而只是一个 HTTP Header,从而大大的降低带宽的消耗,对于用户的感觉也是提高。

当这些缓存有效的时候,查看一个请求会得到这样的结果:

第一次访问 200

鼠标点击二次访问 (Cache)

按F5刷新 304

按Ctrl+F5强制刷新 200

HTTP 3xx

301 Moved Permanently:请求的资源已经被赋予一个新的URL

header( "HTTP/1.1 301 Moved Permanently" ) ;
header( "Location:http://www.superzc.com" );

304 Not Modified:如果客户端已经完成一个有条件的请求并且是允许的,但是这个文档并没有改变,服务器应该返回304状态码。304状态码一定不能包含信息主体,从而通常通过一个头字段后的第一个空行结束

HTTP 4xx:客户端错误

400 Bad Request:因为错误的语法导致服务器无法理解请求信息
403 Forbidden:服务器接收请求,但是被拒绝处理
404 Not Found

HTTP 5xx:服务器错误

500 Internal Server Error:服务器遭遇异常阻止了当前请求的执行
502 Bad Gateway

第 3 页,共 5 页12345