美文网首页
PHP面试题1--状态码,Session和Cookie的区别,I

PHP面试题1--状态码,Session和Cookie的区别,I

作者: Amy1234567 | 来源:发表于2021-05-13 13:46 被阅读0次

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请求的用户代理头的值。

my test

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/

相关文章

网友评论

      本文标题:PHP面试题1--状态码,Session和Cookie的区别,I

      本文链接:https://www.haomeiwen.com/subject/ajvadltx.html