【知识点】自定义函数及内部函数

变量的作用域:
1、函数体外部定义的变量在内部无法直接访问,可以通过globle及$GLOBLE[‘xx’]的方式来访问
2、定义的变量可在include、reqiure的文件中访问;
3、globle不能改变外面变量的值,而$GLOBLE[‘xx’]可以改变;
静态变量:
1、仅初始化一次,以后再次调用的时候也不会在执行static这一行,初始化的时候需要赋值;
2、执行函数后该值会保留,下次执行函数的时候值还存在;
3、static修饰的变量是局部的,仅在函数内部有效;
函数参数:
1、函数的参数默认通过值传递;
2、如果要在函数中改变传递参数的值,需要改成引用传递;
函数的引用返回:
从函数返回一个引用,必须在函数声明和指派函数返回值给一个变量的时候都使用&符合
[code]
function &func(){
static $b=10;
return $b;
}
$a = func();//$a=10
$a = &func();//$a=10
$a = 100;//$b=100
[/code]
include与require的区别:
include的文件时找不到文件会产生一个警告,程序将继续执行;而require的文件找不到就会产生一个致命错误;
include_once与require_once都先检查文件是否被包含过,如果已经包含过就不会在包含了;
时间日期函数:
date()\strtotime()\mktime()\time()\microtime()\date_default_timezone_set();
IP处理函数:
ip2long()\long2ip()
打印处理
print()\printf()\print_r()\echo\sprintf()\var_dump()\var_export()
print-只能打印单个变量
echo-可以打印多个变量
printf-输出
sprintf-返回
print_r-不会打印出类型
var_dump-可以打印出类型
var_export-将数组格式化输出

序列化和反序列化函数
serialize()\unserialize()

字符串函数
implode()\explode()\join()\strrev()\trim()\ltrim()\rtrim()\strstr()\number_format()

数组函数
array_keys()\array_values()\array_diff()\array_intersect()\array_merge()\array_shift()\array_unshift()\array_pop()\array_push()\sort()

【知识点】php流程控制

遍历数组的三种方式:
1、for循环,只能遍历索引数组
2、foreach,可以遍历索引数组和关联数组,会重置数组指针,不会导致只遍历部分的情况
3、while、each、list组合,可以遍历索引数组和关联数组,不会重置数组指针
if elseif
1、只能有一个语句块被执行,多个elseif是排斥关系
2、有一个基本准则,将范围小的条件放在前面执行以提高代码效率
switch case
1、后面的控制表达式数据类型只能是整型、浮点类型或者字符数
2、内部有跳转表,执行效率会稍微比if elseif高

【知识点】运算符

运算符优先级

递增/递减>!>算数运算符>大小比较>(不)相等比较>引用>位运算符(^)>位运算符(|)>逻辑与>逻辑或>三目>赋值>and>xor>or

结合方向 运算符 附加信息
clone new clone 和 new
[ array()
** 算术运算符
++ ~ (int) (float) (string) (array) (object) (bool) @ 类型和递增/递减
instanceof 类型
! 逻辑运算符
* / % 算术运算符
+ - . 算术运算符和字符串运算符
<< >> 位运算符
< <= > >= 比较运算符
== != === !== <> <=> 比较运算符
& 位运算符和引用
^ 位运算符
| 位运算符
&& 逻辑运算符
|| 逻辑运算符
?? 比较运算符
? : ternary
right = += -= *= **= /= .= %= &= |= ^= <<= >>= 赋值运算符
and 逻辑运算符
xor 逻辑运算符
or 逻辑运算符

算术运算符

例子 名称 结果
-$a 取反 $a 的负值。
$a + $b 加法 $a$b 的和。
$a – $b 减法 $a$b 的差。
$a * $b 乘法 $a$b 的积。
$a / $b 除法 $a 除以 $b 的商。
$a % $b 取模 $a 除以 $b 的余数。
$a ** $b Exponentiation Result of raising $a to the $b‘th power. Introduced in PHP 5.6.

赋值运算符
位运算符

例子 名称 结果
$a & $b And(按位与) 将把 $a$b 中都为 1 的位设为 1。
$a | $b Or(按位或) 将把 $a$b 中任何一个为 1 的位设为 1。
$a ^ $b Xor(按位异或) 将把 $a$b 中一个为 1 另一个为 0 的位设为 1。
~ $a Not(按位取反) $a 中为 0 的位设为 1,反之亦然。
$a << $b Shift left(左移) $a 中的位向左移动 $b 次(每一次移动都表示“乘以 2”)。
$a >> $b Shift right(右移) $a 中的位向右移动 $b 次(每一次移动都表示“除以 2”)。

比较运算符

例子 名称 结果
$a == $b 等于 TRUE,如果类型转换后 $a 等于 $b
$a === $b 全等 TRUE,如果 $a 等于 $b,并且它们的类型也相同。
$a != $b 不等 TRUE,如果类型转换后 $a 不等于 $b
$a <> $b 不等 TRUE,如果类型转换后 $a 不等于 $b
$a !== $b 不全等 TRUE,如果 $a 不等于 $b,或者它们的类型不同。
$a < $b 小与 TRUE,如果 $a 严格小于 $b
$a > $b 大于 TRUE,如果 $a 严格大于 $b
$a <= $b 小于等于 TRUE,如果 $a 小于或者等于 $b
$a >= $b 大于等于 TRUE,如果 $a 大于或者等于 $b
$a <=> $b 太空船运算符(组合比较符) $a小于、等于、大于$b时 分别返回一个小于、等于、大于0的integer 值。 PHP7开始提供.
$a ?? $b ?? $c NULL 合并操作符 从左往右第一个存在且不为 NULL 的操作数。如果都没有定义且不为 NULL,则返回 NULL。PHP7开始提供。

错误控制运算符

@放在一个php表达式之前,会忽略所有的错误信息
执行运算符
递增/递减运算符
1、递增、递减不影响布尔值
2、递减null没有效果、递增null为1
3、递增递减在前面就先运算再返回值,否则先返回值再运算
逻辑运算符
字符串运算符
数组运算符

例子 名称 结果
$a + $b 联合 $a$b 的联合。
$a == $b 相等 如果 $a$b 具有相同的键/值对则为 TRUE
$a === $b 全等 如果 $a$b 具有相同的键/值对并且顺序和类型都相同则为 TRUE
$a != $b 不等 如果 $a 不等于 $b 则为 TRUE
$a <> $b 不等 如果 $a 不等于 $b 则为 TRUE
$a !== $b 不全等 如果 $a 不全等于 $b 则为 TRUE

类型运算符

 

【知识点】php字符串定义的方式及区别

1、单引号
不解析变量
不解析转义字符,只能解析单引号及和反斜杠本身
变量和变量、变量和字符串、字符串和字符串之间可以用点连接
单引号的效率要高于双引号
2、双引号
可以解析变量,变量可以用{}进行包含
可以解析所有的转义字符
可以使用点来连接变量和变量、变量和字符串、字符串和字符串
3、heredoc、newdoc,主要用来处理大文本
heredoc类似于双引号,
[code]
$str = <<<MO
aaaaaaaaaaaaaaaaaaaaaaaaaaa
MO;
[/code]
newdoc类似于单引号
[code]
$str = <<<‘MO’
aaaaaaaaaaaaaaaaaaaaaaaaaaa
MO;
[/code]
延伸:
标量数据类型(整型、浮点、字符数、布尔)
1、浮点数据类型不能用于比较类型
2、false的情况,7种(0、0.0、”、’0’、false、array()、null)
3、超全局数组$GLOBAL\$_GET\$_POST\$REQUEST\$_SESSION\$COOKIE\$SERVER\$_FILE\$ENV
$GLOBAL包含后面的全部,$REQUEST包含$_GET\$_POST
$SERVER[‘SERVER_ADDR’]#服务器IP地址
$SERVER[‘REMOTE_ADDR’]#客服端IP地址
$SERVER[‘SERVER_NAME’]#服务器名称
$SERVER[‘REQUEST_TIME’]#请求时间
$SERVER[‘QUERY_STRING’]#?后面的查询支付串
$SERVER[‘REQUEST_URI’]#域名后面的部分
$SERVER[‘HTTP_REFERFER’]#请求来源
$SERVER[‘HTTP_USER_AGENT’]#header头中的USER_AGENT
$SERVER[‘PATH_INFO’]#路由部分
复合数据类型(数组、对象)
特殊数据类型(nul、resuore)
1、null
直接赋值、未定义的变量、unset销毁的变量
常量
1、定义常量const、define
const是语言结构,更快;define是函数;const可以定义类的常量,而define则不能定义类的常量;
2、系统预定义常量
__FILE__ 文件的路径+文件名
__LINE__ 你所在行的行号
__DIR__ 你所在的目录
__FUNCTION__ 函数名称
__CLASS__ 类名
__TRAIT__ trait的名称
__METHOD__ 类名+方法名
__NAMESPACE__ namespace的名称

【知识点】php引用变量理解

php的引用变量,就是用不同的名字访问相同变量内容;
注意:
1、引用指向同一个内存空间的变量,当内存中的值发生改变后,所有的变量都将看到改变后的值;
2、unset的时候只会取消引用,不会销毁内存空间;
2、php的类对象本身就是引用传值,将一个实例化的对象赋值给另外一个变量的时候,不需要加&符号;如果需要进行空间复制可以使用clone来实现
4、将一个变量赋值给另外一个变量的时候不会马上开辟一块内存空间,只有当其中一个变量发生修改的时候才会新开辟一块内存空间(COW机制:copy on write)

看看下面这个代码执行后的$data最终结果是什么?
[code]
$date = [‘a’,’b’,’c’];
foreach($data as $k=>$v){
$v = &$data[$k];
}
[/code]
解析:
第一次循环:
1、$k=0;$v=’a';
2、$v与$data[0]建立引用关系;
此时$data的结果是:[‘a’,’b’,’c’]
第二次循环:
1、$k=1;$v=’b';由于$v与上一次循环的$data[0]建立引用关系,无论两个变量哪一个发生变化都会导致另外一个变化,所以$data[0]也变成了b
2、$v与$data[1]建立引用关系;在与$data[1]建立引用关系的同时也解除了$v与$data[0]的引用关系;
此时$data的结果是:[‘b’,’b’,’c’]
第三次循环:
1、$k=2;$v=’c';由于$v与上一次循环的$data[1]建立引用关系,无论两个变量哪一个发生变化都会导致另外一个变化,所以$data[1]也变成了c
2、$v与$data[2]建立引用关系;在与$data[2]建立引用关系的同时也解除了$v与$data[1]的引用关系;
此时$data的结果是:[‘b’,’c’,’c’]

mysql视图

#概念
数据库视图是虚拟表或逻辑表;
因为数据库视图与数据库表类似,它由行和列组成,因此可以根据数据库表查询数据;
允许通过先决条件的数据库视图来更新基础表中的数据;
当基础表的数据发生变化时,视图也反映了这些数据的变化;

#优点
简化查询:使用数据库视图可隐藏最终用户和程序基础表的复杂性;只需要简单的sql语句就能拿到想要的结果;
权限控制:可以限制用户对数据的访问权限,不暴露敏感数据;创建只读视图用户只能看不能改;
计算列:可创建实时统计字段
向后兼容:从新设计数据库基础表,不需要修改应用程序,只需要修改视图即可

#缺点
性能低:从数据库视图查询数据可能会很慢,特别是如果视图是基于其他视图创建的。
高耦合:与基础表高耦合,如果更改了表结构同时需要更改视图

#视图的限制:
不能在视图上创建索引,查询的时候会使用mysql底层表的索引。
MySQL 5.7.7之前,不能在SELECT语句的FROM子句中使用子查询来定义视图。
删除或重命名视图所基于的表,MySQL会使视图无效,可以使用CHECK TABLE语句来检查视图是否有效。
简单的视图可以更新表中数据,基于具有连接,子查询等的复杂SELECT语句创建的视图无法更新。
MySQL是不支持物理视图

#创建视图
MySQL提供了三种算法:MERGE,TEMPTABLE和UNDEFINED,默认是UNDEFINED;
UNDEFINED算法使MySQL可以选择使用MERGE或TEMPTABLE算法。
MySQL优先使用MERGE算法进行TEMPTABLE算法,因为MERGE算法效率更高。
TEMPTABLE算法创建的视图将不能更新

[code]CREATE OR REPLACE ALGORITHM = UNDEFINED VIEW showTestTable AS
SELECT * FROM test LIMIT 2;[/code]

#基于另一个视图创建视图
[code]CREATE OR REPLACE VIEW showTest AS
SELECT * FROM showTestTable WHERE id=1;[/code]

#创建一个数据一致性的视图,WITH CHECK OPTION子句创建的视图在插入、更新、删除的时候会检查数据是否符合视图的定义,不符合的将拒绝执行
[code]CREATE OR REPLACE VIEW showTestTable4 AS
SELECT * FROM test WHERE id<10
WITH CHECK OPTION;[/code]

#查询视图
[code]SELECT * FROM showTestTable2;[/code]

#通过视图修改数据
[code]UPDATE showTestTable3 SET created=2 WHERE id=1;[/code]

#通过视图删除数据
[code]DELETE FROM showTestTable2 WHERE id=1;[/code]

#通过视图插入数据,使用了WITH CHECK OPTION语句的视图,不满足视图数据一致性的数据无法插入
[code]INSERT INTO showTestTable4 VALUES(10,11111);[/code]

#查询可以update的视图
[code]SELECT table_name, is_updatable FROM information_schema.views WHERE table_schema = ‘demo';[/code]

#查看所有的表,视图属于表
[code]SHOW TABLES;[/code]

#查看哪些是表,哪些是视图
[code]SHOW FULL TABLES;[/code]

#查看视图的定义
[code]SHOW CREATE VIEW showTestTable;[/code]

#修改视图
[code]ALTER VIEW showTestTable4 AS
SELECT * FROM test WHERE id=8;

SELECT * from showTestTable4;[/code]

#删除视图
[code]DROP VIEW IF EXISTS showTestTable;[/code]

mysql储存过程

#概念

存储过程是存储在数据库目录中的一段声明性SQL语句。

#优点

高性能:MySQL存储过程按需编译,在编译存储过程之后,MySQL将其放入缓存中,应用程序在单个连接中多次使用存储过程,则使用编译版本,否则存储过程的工作方式类似于查询。
节约流量:应用程序不必发送多个冗长的SQL语句,而只能发送存储过程的名称和参数。
重用性:存储过程将数据库接口暴露给所有应用程序,开发人员不必开发存储过程中已支持的功能。
安全性:数据库管理员可以向访问数据库中存储过程的应用程序授予适当的权限,而不向基础数据库表提供任何权限。

#缺点

消耗内存和CPU:大量存储过程会导致每个连接的内存使用量将会大大增加;存储过程中过度使用大量逻辑操作,则CPU使用率也会增加。
开发维护成本高
很难调试
存储过程的构造不利于复杂的业务逻辑开发

#创建一个储存过程
[code]
DELIMITER //
CREATE PROCEDURE procedureName()
BEGIN
SELECT * FROM test;
END //
DELIMITER ;
CALL procedureName();
[/code]

#创建一个带参数的储存过程 in
[code]
DELIMITER //
CREATE PROCEDURE procedureName(in p_id int(11))
BEGIN
SELECT * FROM test WHERE id=p_id;
END //
DELIMITER ;
CALL procedureName(1);
[/code]

#创建一个带参数的储存过程 out
[code]
DELIMITER //
CREATE PROCEDURE procedureName(OUT total int)
BEGIN
SELECT count(*) INTO total FROM test;
END //
DELIMITER ;
CALL procedureName(@total);
SELECT @total;
[/code]
#创建一个带参数的储存过程 inout
[code]
DELIMITER //
CREATE PROCEDURE procedureName(INOUT total int)
BEGIN
SET total=total+1;
END //
DELIMITER ;

SET @countTotal=1;
CALL procedureName(@countTotal);
SELECT @countTotal;
[/code]

#创建一个带参数的储存过程 返回多个值
[code]
DELIMITER //
CREATE PROCEDURE procedureName(
OUT idcount1 int,
OUT idcount2 int,
OUT idcount3 int,
OUT idcount4 int
)
BEGIN
SELECT COUNT(*) INTO idcount1 FROM test WHERE id>=1;
SELECT COUNT(*) INTO idcount2 FROM test WHERE id>=2;
SELECT COUNT(*) INTO idcount3 FROM test WHERE id>=4;
SELECT COUNT(*) INTO idcount4 FROM test WHERE id>=4;
END //
DELIMITER ;
CALL procedureName(@idcount1,@idcount2,@idcount3,@idcount4)
SELECT @idcount1,@idcount2,@idcount3,@idcount4
[/code]

#IF 判断
[code]
DELIMITER //
CREATE PROCEDURE procedureName(in p_id int(11),OUT res VARCHAR(20))
BEGIN
if(p_id>0 and p_id<=2) THEN
SET res=’aaa';
ELSEIF(p_id>2 and p_id<=4) THEN
SET res=’bbb';
ELSE
SET res=’ggg';
END IF;
END //
DELIMITER ;
CALL procedureName(5,@res);
SELECT @res
[/code]

#CASE WHEN 单条件
[code]
DELIMITER //
CREATE PROCEDURE procedureName(in p_id int(11),OUT res VARCHAR(20))
BEGIN
CASE p_id
WHEN 1 THEN
SET res=’aaa';
WHEN 2 THEN
SET res=’bbb';
WHEN 3 THEN
SET res=’ccc';
ELSE
SET res=’no';
END CASE;
END //
DELIMITER ;
CALL procedureName(1,@res);
SELECT @res
[/code]

#CASE WHEN 多条件
[code]
DELIMITER //
CREATE PROCEDURE procedureName(in p_id int(11),OUT res VARCHAR(20))
BEGIN
CASE
WHEN p_id>=1 AND p_id<=5 THEN
SET res=’aaa';
WHEN p_id>=6 AND p_id<=10 THEN
SET res=’bbb';
WHEN p_id>=11 AND p_id<=15 THEN
SET res=’ccc';
ELSE
SET res=’no';
END CASE;
END //
DELIMITER ;
CALL procedureName(44,@res);
SELECT @res
[/code]

#WHILE DO 满足条件的循环
[code]
DELIMITER //
CREATE PROCEDURE procedureName(OUT res VARCHAR(255))
BEGIN
DECLARE x INT;

SET x = 1;
SET res = ”;

WHILE x <= 5 DO
SET res = CONCAT(res,x,’,’);
SET x = x + 1;
END WHILE;
#SELECT res;
END //
DELIMITER ;
CALL procedureName(@res);
SELECT @res;
[/code]

#REPEAT UNTIL 不满足条件的循环
[code]
DELIMITER //
CREATE PROCEDURE procedureName(OUT res VARCHAR(255))
BEGIN
DECLARE x INT;

SET x = 1;
SET res = ”;

REPEAT
SET res = CONCAT(res,x,’,’);
SET x = x + 1;
UNTIL x > 5
END REPEAT;
#SELECT res;
END //
DELIMITER ;
CALL procedureName(@res);
SELECT @res;
[/code]

#loop LEAVE等于break ITERATE等于continue
[code]
DELIMITER //
CREATE PROCEDURE procedureName(OUT res VARCHAR(255))
BEGIN
DECLARE x INT;

SET x = 1;
SET res = ”;

loop_label: LOOP
IF x > 10 THEN
LEAVE loop_label;
END IF;

SET x = x + 1;
IF (x mod 2) THEN
ITERATE loop_label;
ELSE
SET res = CONCAT(res,x,’,’);
END IF;
END LOOP;
END //
DELIMITER ;
CALL procedureName(@res);
SELECT @res;
[/code]

#创建一个存储过程来获取用户的电子邮箱
[code]
DELIMITER //
CREATE PROCEDURE procedureName (INOUT email_list varchar(4000))
BEGIN
— 声明两个变量,是否是末尾,当前的邮箱账号
DECLARE v_finished INTEGER DEFAULT 0;
DECLARE v_email varchar(100) DEFAULT "";

— 声明游标
DEClARE email_cursor CURSOR FOR SELECT email FROM users_info;

— 游标找不到数据的时候设置v_finished=1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1;

— 打开游标
OPEN email_cursor;

— LOOP 循环
get_email: LOOP

— 读取游标中的电子邮箱账号
FETCH email_cursor INTO v_email;

— 未找到数据的时候跳槽循环
IF v_finished = 1 THEN
LEAVE get_email;
END IF;

— 拼接邮箱账号
SET email_list = CONCAT(v_email,";",email_list);

END LOOP get_email;
CLOSE email_cursor;
END//
DELIMITER ;

CALL procedureName(@res);
SELECT @res;
[/code]

#删除一个储存过程
[code]
DROP procedure IF EXISTS `procedureName`;
[/code]

#查询demo库中的存储过程
[code]
SHOW PROCEDURE STATUS WHERE db=’demo';
[/code]

#查询存储过程的创建语句
[code]
SHOW CREATE PROCEDURE `procedureName`;
[/code]

#储存过程中的异常处理
[code]
DELIMITER $$
CREATE PROCEDURE procedureName(IN article_id INT, IN tag_id INT)
BEGIN

— 主键冲突的时候抛出异常提示,并继续执行CONTINUE 终止执行EXIT
DECLARE CONTINUE HANDLER FOR 1062
SELECT CONCAT(‘duplicate keys (‘,article_id,’,’,tag_id,’) found’) AS msg;

INSERT INTO article_tags(article_id,tag_id) VALUES(article_id,tag_id);

SELECT COUNT(*) FROM article_tags;
END$$
DELIMITER ;

CALL procedureName(1,2);
CALL procedureName(1,3);
CALL procedureName(1,2);
[/code]

#mysql自定义函数
自定义函数可以在sql中调用,而存储过程只能在单独调用;下面是一个返回用户等级的函数
[code]
DELIMITER $$
CREATE FUNCTION CustomerLevel(p_creditLimit double) RETURNS VARCHAR(10) DETERMINISTIC
BEGIN
DECLARE lvl varchar(10);

IF p_creditLimit > 50000 THEN
SET lvl = ‘1’;
ELSEIF (p_creditLimit <= 50000 AND p_creditLimit >= 10000) THEN
SET lvl = ‘2’;
ELSEIF p_creditLimit < 10000 THEN
SET lvl = ‘3’;
END IF;
RETURN (lvl);
END $$
DELIMITER ;

SELECT CustomerLevel(100000);
[/code]

#删除函数
[code]
DROP FUNCTION IF EXISTS `CustomerLevel`;
[/code]

#预先执行的建表预计
[code]
CREATE TABLE `article_tags` (
`article_id` int(11) NOT NULL,
`tag_id` int(11) NOT NULL,
PRIMARY KEY (`article_id`,`tag_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `test` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`created` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
CREATE TABLE `users_info` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(50) DEFAULT NULL,
`email` varchar(255) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;
[/code]

删除mysql中的重复数据

[code]
//创建表
CREATE TABLE users_info (
id INT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) DEFAULT NULL,
email VARCHAR(255) NOT NULL
);

//插入数据
INSERT INTO users_info (username,email)
VALUES (‘Carine ‘,’aa@qq.com’),
(‘Jean’,’aa@qq.com’),
(‘Peter’,’bb@qq.com’),
(‘Janine ‘,’bb@qq.com’),
(‘Jonas ‘,’cc@qq.com’),
(‘Janine ‘,’cc@qq.com’);

//查看超过一条的数据
SELECT email, COUNT(email) FROM users_info GROUP BY email HAVING COUNT(email) > 1;

//删除重复数据,保留id最大的
DELETE t1 FROM users_info as t1 INNER JOIN users_info as t2 WHERE t1.id<t2.id AND t1.email=t2.email

//删除重复数据,保留id最小的
DELETE t1 FROM users_info as t1 INNER JOIN users_info as t2 WHERE t1.id>t2.id AND t1.email=t2.email

//查看删除后的结果
SELECT * FROM users_info
[/code]

nginx配置https

1、申请ssl证书
ssl证书是收费的,当然对于个人而言用免费版的就好了,免费版可在:https://freessl.cn/申请
2、下载并上传你申请的证书到服务器
3、配置nginx,并将http跳转到https
[code]
server {
listen 80;
server_name xxx.com www.xxx.com;
rewrite ^(.*)$ https://$host$1 permanent;
}

server {
#listen 80;
listen 443;
server_name xxx.com www.xxx.com;
ssl on;
ssl_certificate /home/wwwroot/nginx/conf/full_chain.pem;
ssl_certificate_key /home/wwwroot/nginx/conf/private.key;
access_log /home/wwwroot/nginx/logs/xxx.log;

location / {
root /home/wwwroot/www/xxx/;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /home/wwwroot/www/xxx/;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
[/code]

mongodb在命令行下的基础用法

#进入mongodb
/home/wwwroot/mongodb/bin/mongo 127.0.0.1:27017

#关闭mongodb服务
db.shutdownServer()

#查看有多少个数据库
show dbs

#使用指定的数据库(数据库不需要预先创建,在使用use参数后对数据库进行操作的时候会自己创建)
use test

#查看表
show tables

#删除数据库(需要先use才能删除)
db.dropDatabase()

#向集合中写入数据,mongodb中的集合与mysql的表差不多是一个概念
db.user.insert({x:1})

#查询数据库中已经创建的集合(表)
show collections

#查询集合中的数据,user集合,find中可以加条件,条件为json格式
db.user.find()

#查询一条数据
db.user.findOne()

#js语法插入多条数据
for(i=3;i<100;i++)db.user.insert({x:i})

#计数
db.user.find().count()

#调过前面三条取出两条按x排序
db.user.find().skip(3).limit(2).short({x:1})

#更新数据
db.user.find({x:1});
db.user.update({x:1},{x:999});

#部分更新,只更新y=99
db.user.insert({x:100,y:100,z:100})
db.user.update({z:100},{$set:{y:99}})

#更新一条不存在的数据时自动创建,第三个参数为true
db.user.update({z:10000},{z:1000},true)

#更新多条数据,update默认只会更新找到的第一条数据
db.user.insert({c:1})
db.user.insert({c:1})
db.user.insert({c:1})
db.user.update({c:1},{$set:{c:2}},false,true)

#删除数据,删除数据必须传递参数
db.user.remove({c:2})

#删除表
db.user.drop()