什么事面向对象?主要特征是什么?

面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。

SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?

  1. http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户。
  2. SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递。

禁用cookie后,session不能正常使用。

Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。

Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的。

Tcp/Ip四层网络结构

应用层,传输层,网络层,物理层

  1. 应用层,就是使用的协议,如http,ftp,smtp
  2. 传输层就是底层协议,tcp/udp
  3. 网络层是传输目的地的解析识别
  4. 物理层负责具体的数据转换成电信号传输。

http请求的全流程

  1. 浏览器DNS解析域名为IP
  2. 根据IP找到对应的服务器三次握手链接
  3. 建立TCP连接后发送http请求报文
  4. 服务器响应请求,浏览器获得响应结果
  5. 浏览器解析响应结果
  6. 浏览器渲染页面
  7. 服务器四次挥手关闭TCP连接

三次握手

  1. 客户端发送SYN,服务端确认客户端发送能力
  2. 服务端发送SYN+ACK,客户端确认客户端发送能力,服务端发接收能力
  3. 客户端发送ACK 服务端确认客户端接收能力

四次挥手

  1. 客户端向服务端发送结束报文
  2. 服务端收到结束报文并返回确认报文
  3. 服务端数据发送完毕关闭链接并发送结束报文
  4. 客户端接收服务端发来的结束报文

MyISAM和 InnoDB 的基本区别?索引结构如何实现?

Myisam不支持事务,表锁,读取速度快,适用于频繁查询的应用

Innodb支持事务,行锁,读写比myisam快,适用于插入和更新操作比较多的应用。

什么是事务?及其特性?

事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。

事务特性:

  1. 原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。
  2. 一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态
  3. 隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,
  4. 持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。

什么是锁?

多个用户并发存取数据,就会造成存取不一的情况,破坏数据一致性。

加锁的过程

  1. 向数据库发送加锁请求
  2. 数据库加锁
  3. 程序提交事务操作数据
  4. 操作完毕数据库释放锁。

索引的作用?和它的优点缺点是什么?

索引是特殊的查询表,就相当于书籍的目录,利用索引可以快速查找数据

缺点是会降低数据库写入速度,因为需要更新索引,还会增加数据库的占用空间。

如何优化网站运行速度

核心是优化整个程序中的瓶颈。分为两大部分

  1. 数据库部分
  2. 程序部分

数据库部分

  1. 针对常用查询建立索引
  2. 优化sql语句,尽量不用select *,查询尽量简单,避免模糊查询,连表尽量用小表连大表等。
  3. 使用数据库缓存
  4. 表结构字段等设计优化,比如针对报表类建立中间表,设计冗余字段,字段针对具体使用使用合理的数据结构
  5. 数据库参数调优
  6. 主从复制做读写分离
  7. 分区分库分表

程序部分

  1. 避免在请求中做耗时操作,比如生成excel文件下载,延时,网络请求等
  2. 对程序进行调优,优化nginx,php-fpm参数
  3. 关闭debug,数据库debug
  4. 避免循环查询数据库
  5. 使用redis,memacahe等缓存提高程序效率
  6. 合并文化,压缩文件大小
  7. 对静态文件使用cdn进行存储和加速
  8. 提高啊服务器配置
  9. 使用负载均衡

什么是 CSRF 攻击 ?XSS 攻击?如何防范?

CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。

基本原理:用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求(此时相当于是用户访问),A网站会认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。

CSRF防范:

  1. 合理规范api请求方式,GET,POST
  2. 对POST请求加token令牌验证,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务端进行验证随机码是否相同。

XSS,跨站脚本攻击。

防范:不相信任何输入,过滤输入。

安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?

  1. 防远程提交;
  2. 防SQL注入,对特殊代码进行过滤;
  3. 防止注册机灌水,使用验证码。

堆和栈的区别?

  1. 堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小;
  2. 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义。

$this和self、parent这三个关键词分别代表什么?在哪些场合下使用?

$this 当前对象,指向的是实例化后的对象

self 当前类,指向的是类本身,而不是实例化对象

parent 当前类的父类,指向父类本身

$this在当前类中使用,使用->调用属性和方法

self也在当前类中使用,不过需要使用::调用

parent在类中使用

__autoload()方法的工作原理是什么?

答:使用这个魔术函数的基本条件是类文件的文件名要和类的名字保持一致。

当程序执行到实例化某个类的时候,如果在实例化前没有引入这个类文件,那么就自动执行__autoload()函数。

这个函数会根据实例化的类的名称来查找这个类文件的路径,当判断这个类文件路径下确实存在这个类文件后

执行include或者require来载入该类,然后程序继续执行,如果这个路径下不存在该文件时就提示错误。

使用自动载入的魔术函数可以不必要写很多个include或者require函数。

简述高并发网站解决方案。

  1. 前端优化(CND加速、建立独立图片服务器)
  2. 服务端优化(页面静态化、并发处理[异步|多线程]、队列处理)
  3. 数据库优化(数据库缓存[Memcachaed|Redis]、读写分离、分库分表、分区)
  4. Web服务器优化(负载均衡、反向代理)

请深入解释ThinkPHP框架的核心架构和运行机制。

ThinkPHP的核心架构主要由三大部分组成:核心层(Core)、行为层(Behavior)和驱动( Driver ),简称CBD。

核心层(Core)是框架的基础,提供了基本的HTTP请求处理、路由分发、模板引擎等功能;

行为层(Behavior)提供了一些常用的行为,如日志记录、图片处理、验证码等,也可以自定义;

驱动( Driver ):数据库驱动、缓存驱动、标签库驱动和模板引擎驱动,以及外置的类扩展。

ThinkPHP采用MVC模式,即将用户请求分解为模型(Model)、视图(View)和控制器(Controller)三个部分。

当用户发起请求时,路由器根据URL匹配到相应的控制器,然后由控制器调用模型获取数据并传送给视图渲染。这种模式有利于将业务逻辑、数据处理和界面展示区分开来,提高代码的可读性和可维护性。

运行机制方面,ThinkPHP采用“入口”、“调度”、“响应”三层结构。

“入口”是指接收用户请求的部分,“调度”是指决定如何处理请求的部分,“响应”则是指向客户端发送结果的部分。

具体来说,当用户发出一个请求时,入口程序会接收到这个请求,然后根据配置文件解析URL,找到对应的控制器和动作,并将其交给调度器处理。调度器负责加载相应的模型,执行业务逻辑,然后将结果返回给响应器,最后由响应器向客户端发送结果。

另外,ThinkPHP还提供了许多实用的特性,如路由调度、自动加载、模板引擎等,帮助开发者快速开发和调试项目。

thinkphp运行流程

  1. 系统常量判断及定义:
  2. 载入框架引导类并执行初始化
  3. 设置错误处理机制和自动加载机制
  4. 存储初始化
  5. 读取应用模式和核心文件
  6. 加载惯例配置文件
  7. 加载应用配置文件
  8. 路由检测与处理
  9. 请求分发与响应输出