HTTP是无状态协议,HTTP状态码含义:
302:临时转移成功,请求已经转移到新的位置
401:未授权
403:禁止访问
404:文件未找到
500:服务器内部错误
502:服务器内部错误
200:请求成功
Session和Cookie的区别:
1. 存储位置不同
cookie的数据信息存放在客户端浏览器上
session的数据存放在服务器上
2. 存储容量不同
单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie
对于session来说并没有上限,但是处于服务器端的性能考虑,session内不要存放过多的东西,并删除session删除机制
3. 存储方式不同
cookie中只能保存ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据
session中能够存储任何类型的数据,包括且不限于string, integer, list, map等
4. 隐私策略不同
cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的
session是存储再服务器端的,对客户端是透明的,不存在敏感信息泄露的风险
5. 有效期上不同
开发可以通过设置cookie属性,达到使cookie长期有效的效果
session依赖于名为Jsessionid的cookie,而cookie jsessionid的过期时间默认为-1, 只需要关闭窗口,该session就会失效,因而session不能达到长期有效的效果
6. 服务器压力不同
cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择
session使保存再服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存
7. 浏览器支持不同
假如客户端浏览器不支持cookie
cookie使需要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效,关于WAP上的应用,常规的cookie就派不上用场
运用session需要使用URL地址重写的方式,一切用到session程序的URL都要进行URL地址重写,否则session会话跟踪还会失效
假如客户端支持cookie:
cookie既能够设为本浏览器窗口以及子窗口内有效,也能够设为一切窗口内有效。
session只能在本窗口以及子窗口内有效。
8、跨域支持上不同
cookie支持跨域名访问。
session不支持跨域名访问。
PHP中的传值和传引用
按值传递:在函数范围内对值的修改,在函数外部会被忽略。按值传递是对值的复制,两个变量指向不同的内存地址。
按引用传递:在函数范围内对值的修改,在函数外部有效。按引用传递是将一个变量的内存地址传给另一个变量,两个变量最终指向同一个内存地址。
按值传递,是对值的复制,对于大型的字符串和对象,会是一个很大代价的操作,按引用传递对性能优化有好处。
include与require的区别
1. include()在执行文件时每次都要读取和评估,require()文件只处理一次
2. require()通常放在脚本的最前面,include()的使用和require()一样,一般都放在流程控制的处理区段,PHP脚本文件读到include()语句时,才将它包含的文件读进来,这种方式,可以把程序执行时的流程简单化。
3. require()和include()语句是语言结构,不是真正的函数,可以像PHP的其他语言结构一样。即,可以不加圆括号,直接加参数。
4. include_once()和require_once()语句也是在脚本执行期间包括并运行指定文件,与include()和require()的唯一区别是如果文件中的代码被包括了,则不会再次包括。
5. require()引入文件时,如果碰到错误,停止执行,给出错误提示(致命错误);include()引入文件时,如果碰到错误,继续运行,给出提示。
关于Cookie的小知识点
1. setcookie()函数用于设置cookie,且必须位于<html>标签之前
2. cookie是服务器留在用户计算机中的小文件
3. cookie常用于标识客户端
4. 会话cookie的生命周期是:如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命周期为浏览器会话期的cookie被称为会话cookie。会话cookie一般不保存在磁盘上,而是保存在内存里。如果设置了过期时间,浏览器就会把cookie保存在硬盘上,关闭后再次打开浏览器,这些cookie依然有效,直到超过设定的过期时间。
JS怎么取得用户设备是手机还是浏览器
Navigator对象,userAgent属性是一个只读的字符串,声明了浏览器用于HTTP请求的用户代理头的值。
mysql删除drop、truncate、delete哪个更快
一,从执行速度来看
drop > truncate > delete
二,原理
1. delete
(1). delete属于数据库DML操作语言,只删除数据,不删除表结构。会走事务,执行时会触发trigger
(2). 在InnoDB中,delete其实并不会把真的数据删除,Mysql实际上只是给删除的数据打了个标记为已删除,因此delete删除表中的数据时,表文件在磁盘上所占空间不会变小,存储空间不会释放,只是把删除的数据行设置为不可见。虽然未释放磁盘空间,但是下次插入数据时,仍然可以重用这部分空间(即覆盖)。
(3). delete执行时,会先把所删除数据缓存到rollback segment中,事务commit之后提交。
(4). delete from table_name删除表中的全部数据,对于MyISAM会立刻释放磁盘空间,InnoDB不会释放磁盘空间。
(5). 对于delete from table_name where xxx 带条件的删除,不管是InnoDB还是MyISAM都不会释放磁盘空间。
(6). delete操作以后使用optimize table table_name会立刻释放磁盘空间,不管是InnoDB还是MyISAM。所以要想达到释放磁盘空间的目的,delete以后执行optimize table操作。
(7). delete操作是一行一行执行删除的,并且同时将该行的删除操作记录在redo和undo表空间中,以便进行回滚(rollback)和重做操作,生成的大量日志文件也会占用磁盘空间。
2. truncate
(1). truncate属于数据库DDL定义语言,不走事务,原数据不放在rollback segment中,操作不触发trigger
执行后立即生效,无法找回!!!
(2). truncate table table_name 立即释放磁盘空间,不管是InnoDB还是MyISAM。 truncate table有点类似于drop table之后create, 只不过create table的过程做了优化,比如表结构文件之前已经有了等等,所以速度上应该是接近于drop table的速度。
(3). truncate能够快速清空一个表,并且重置auto_increment的值。
对于不同类型的存储引擎需要注意的是:
对于MyISAM,truncate会重置auto_increment(自增序列)的值为1。而delete后仍然保持auto_increment。
对于InnoDB,truncate会重置auto_increment的值为1。delete之后仍然保持auto_increment。但是在做delete整个表之后重启Mysql的话,则重启后的auto_increment会被置为1.
也就是说,InnoDB的表本身是无法持久保持auto_increment的。delete表之后auto_increment仍然保存在内存,但是重启后就丢失了,只能从1开始。实质上重启后的auto_increment会从select 1 + 1+max(ai_col) from t开始。
(4). 小心使用truncate,尤其是没有备份的时候
3. drop
(1). drop属于数据库DDL语言,同truncate
执行后立即失效,无法找回!!!
(2). drop table table_name立刻释放磁盘空间,不管是InnoDB还是MyISAM,drop语句将删除表的结构被依赖的约束(constrain),触发器(trigger),索引(index);依赖于该表结构的存储过程、函数将被保留,但是变为invalid状态
可以这么理解,一本书,delete是把目录撕了,truncate是把书的内容撕下来烧了,drop是把书烧了。
参考链接:https://www.cnblogs.com/winnerREN/p/14109352.html
项目运行一段时间后发现CPU占用过高,怎么排查
Linux平台:
1. 命令:top
找到cpu占用最高的进程PID
2. 命令:ps -mp "pid" -o THREAD,tid,time
查询pid进程中,哪个现成的cpu占用率高,记录TID
3. 命令:jstack "pid" >> xxx.log
打印出该pid进程下的进程日志
4. 命令:sz xxx.log
将日志文件下载到本地
5. 将第2步记录的TID(十进制)转成十六进制
6. 在xxx.log中查找第5步的十六进制,找到对应线程
参考链接:https://blog.csdn.net/qq_35033270/article/details/89459197
Windows平台:
1. 首先下载ProcessExplorer工具
2. 启动jvisualvm,位于jdk/bin下,打开需要监听的程序,点击线程,点击线程dump
3. 打开ProcessExplorer,选中需要查看的程序,右击,选择properties
4. 找到cpu高的线程,记录首行tid,此处tid是十进制,jvisualvm是十六进制,自行转换,此处是9876,转换是2694
5. 找到2694的线程,分析线程的具体情况,比如是哪个类产生的
参考链接:https://www.pianshen.com/article/6703796478/