PHP面试题整合

PHP面试题

跨域问题
什么是跨域?
浏览器从一个域名的网页去请求另一个域名的资源时,域名、端口、协议任一不同,都是跨域
②解决跨域的方法

  1. PHP端修改header
      header(‘Access-Control-Allow-Origin:*’);//允许所有来源访问
      header(‘Access-Control-Allow-Method:POST,GET’);//允许访问的方式
  2. 2.nginx反向代理:
     www.baidu.com/index.html需要调用www.sina.com/server.php,可以写一个接口www.baidu.com/server.php,由这个接口在后端去调用www.sina.com/server.php并拿到返回值,然后再返回给index.html
  3. 3.jsonp跨域
    JSONP(JSON with Padding:填充式JSON),应用JSON的一种新方法,
    JSON、JSONP的区别:
     1、JSON返回的是一串数据、JSONP返回的是脚本代码(包含一个函数调用)
     2、JSONP 只支持get请求、不支持post请求
     (类似往页面添加一个script标签,通过src属性去触发对指定地址的请求,故只能是Get请求)

请说明 PHP 中传值与传引用的区别,什么时候传值什么时候传引用?
①按值传递:函数范围内对值的任何改变在函数外部都会被忽略
②按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改
优缺点:

  1. 按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作
  2. 按引用传递则不需要复制值,对于性能提高很有好处

MySQL数据库中的字段类型varchar和char的主要区别是什么?
Varchar是变长,节省存储空间,
char是固定长度。
查找效率要char型快,因为varchar是非定长,必须先查找长度,然后进行数据的提取,比char定长类型多了一个步骤,所以效率低一些

MyISAM 和 InnoDB 的基本区别?

  1. MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快
  2. InnoDB类型支持事务,行锁,有崩溃恢复能力。读写速度比MyISAM慢

Mysql 默认是InooDB引擎

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

  • http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户
  • SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全。Session依赖于cookie进行传递
  • 禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的

面向对象中接口和抽象类的区别及应用场景?

  • 有抽象方法的类叫做抽象类,抽象类中不一定只有抽象方法,抽象方法必须使用abstract关键字定义
  • 接口中全部是抽象方法,方法不用使用abstract定义
  • 当多个同类的类要设计一个上层,通常设计为抽象类,当多个异构的类要设计一个上层,通常设计为接口

框架中什么是单一入口和多入口,单一入口的优缺点?

  • 多入口就是通过访问不同的文件来完成用户请求。单一入口指web程序所有的请求都指向一个脚本文件的
  • 单一入口更容易控制权限,方便对http请求可以进行安全性检查。缺点:URL看起来不那么美观,特别是对搜索引擎来说不友好

AJAX的优势是什么?
ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验。

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

  • 使用验证码防止注册机灌水
  • 使用预处理,绑定参数,参数过滤转义 防止sql注入
  • 使用token防止远程提交,使用token验证登录状态

在程序的开发中,如何提高程序的运行效率?

  • 优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询
  • 数据表中创建索引
  • 对程序中经常用到的数据生成缓存
  • 对mysql做主从复制,读写分离
  • 使用nginx做负载均衡

PHP语言的一大优势是跨平台,什么是跨平台?
PHP的运行环境最优搭配为Apache+MySQL+PHP,此运行环境可以在不同操作系统(例如windows、Linux等)上配置,不受操作系统的限制,所以叫跨平台
Get与post两种方式
区别:

  • url可见性:get 方式url参数可见,post 不可见
  • 可缓存性:get 方式是可以缓存的,post 方式不可以缓存
  • 传输数据大小:get一般传输数据大小不超过2k-4k(根据浏览器不同,限制不一样,但相差不大);post 请求传输数据的大小根据php.ini 配置文件设定,也可以无限大
  • 数据传输上:get 方式通过url地址栏拼接参数进行传输,post 方式通过body体进行传输

在程序的开发中,如何提高程序的运行效率?

  • 优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询
  • 数据表中创建索引
  • 对程序中经常用到的数据生成缓存(比如使用redis缓存数据,比如使用ob进行动态页面静态化等等)
  • 对mysql做主从复制,读写分离。(提高mysq执行效率和查询速度)
  • 使用nginx做负载均衡。(将访问压力平均分配到多态服务器)

include 和 require 都能把另外一个文件包含到当前文件中 他们有什么区别?include 和 include_once 又有什么区别?

  • 二者区别只有一个,那就是对包含文件的需求程度
  • include 就是包含,如果被包含的文件不存在的话, 那么则会提示一个错误,但是程序会继续执行下去
  • require 意思是需要,如果被包含文件不存在或者 无法打开的时候,则会提示错误,并且会终止程序的执行
  • once 的意思是一次,那么 include_once 和 require_once 表示只包含一次,避免重复包含

表单中 get 与 post 提交方法的区别?

  • GET 请求能够被 cache,GET 请求能够被保存在浏览器的浏览历史 里面(密码等重要数据 GET 提交,别人查看历史记录,就可以直接看 到这些私密数据)POST 不进行缓存
  • GET 参数是带在 URL 后面,传统 IE 中 URL 的最大可用长度为 2053 字符,其他浏览器对 URL 长度限制实现上有所不同。POST 请求无长 度限制(目前理论上是这样的)
  • GET 提交的数据大小,不同浏览器的限制不同,一般在 2k-8K 之间, POST 提交数据比较大,大小靠服务器的设定值限制,而且某些数据 只能用 POST 方法「携带」,比如 file
  • 全部用 POST 不是十分合理,最好先把请求按功能和场景分下类, 对数据请求频繁,数据不敏感且数据量在普通浏览器最小限定的 2k 范围内,这样的情况使用 GET。其他地方使用 POST
  • GET 的本质是「得」,而 POST 的本质是「给」。而且,GET 是「幂 等」的,在这一点上,GET 被认为是「安全的」。但实际上 server 端 也可以用作资源更新,但是这种用法违反了约定,容易造成 CSRF(跨 站请求伪造)

现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点?

业务模型、视图、控制器
由控制器层调用模型处理数据,然后将数据映射到视图层进行显示

优点:

  • 可以实现代码的重用性,避免产生代码冗余
  • M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式

什么是 CSRF 攻击 ?XSS 攻击?如何防范?
CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。
讲述基本原理:用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求(此时相当于是用户访问),A网站会认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。

CSRF防范:

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

echo(),print(),print_r()的区别?

  • echo是PHP语句, print和print_r是函数,语句没有返回值,函数可以有返回值(即便没有用)
  • print() 只能打印出简单类型变量的值(如int,string)
  • print_r() 可以打印出复杂类型变量的值(如数组,对象)
  • echo 输出一个或者多个字符串

函数内部 static 和 global 关键字的作用

  • static 是静态变量,在局部函数中存在且只初始化一次,使用过后再次使用会使用上次执行的结果; 作为计数,程序内部缓存,单例模式中都有用到
  • global 关键字,引用全局变量,wordpress中大量用到,如面向过程开发
  • static 静态方法,是类的成员方法,但不需要实例化类可直接使用
  • GLOBAL 在函数内使用具有全局作用域的变量,如GLOBAL[‘a’]

完整性约束包括哪些?

数据完整性(Data Integrity)是指数据的精确(Accuracy)和可靠性(Reliability)。 分为以下四类:

  • 实体完整性:规定表的每一行在表中是惟一的实体
  • 域完整性:是指表中的列必须满足某种特定的数据类型约束,其中约束又包括取值范围、精度等规定
  • 参照完整性:是指两个表的主关键字和外关键字的数据应一致,保证了表之间的数据的一致性,防止了数据丢失或无意义的数据在数据库中扩散
  • 用户定义的完整性:不同的关系数据库系统根据其应用环境的不同,往往还需要一些特殊的约束条件。用户定义的完整性即是针对某个特定关系数据库的约束条件,它反映某一具体应用必须满足的语义要求

与表有关的约束:包括列约束(NOT NULL(非空约束))和表约束(PRIMARY KEY、foreignkey、check、UNIQUE)

在程序的开发中,如何提高程序的运行效率?

  • 优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;少用子查询可用表连接代替;少用模糊查询。
  • 数据表中创建索引
  • 对程序中经常用到的数据生成缓存(比如使用redis缓存数据,比如使用ob进行动态页面静态化等等)
  • 对mysql做主从复制,读写分离。(提高mysq执行效率和查询速度)
  • 使用nginx做负载均衡

面向对象编程和面向对象设计的五个基本原则「SOLID」

单一职责原则(Single Responsibility Principle) 开放封闭原则(Open Closed Principle)
里氏替换原则(Liskov Substitution Principle) 接口隔离原则(Interface Segregation
Principle) 依赖反转原则(Dependency Inversion Principle)

  • 单一职责原则规定一个类有且仅有一个理由使其改变。换句话说,一个类的边界和职责应当是十分狭窄且集中的。我很喜欢的一句话"在类的职责问题上,无知是福"。一个类应当做它该做的事,并且不应当被它的任何依赖的变化所影响
  • 开放封闭原则,又称开闭原则,规定代码对扩展是开放的,对修改是封闭的
  • 里氏替换原则规定对象可以被其子类的实例所替换,并且不会影响到程序的正确性
  • 接口隔离原则规定,不应该强制接口的实现依赖于它不使用的方法
  • .依赖反转原则,它规定高层次的代码不应该依赖低层级的代码。换句话说,高层次的代码应该依赖抽象接口,抽象接口就像是「中间人」一样,负责连接着高层次和低层次代码。这个原则的另一层意思是,抽象接口不应该依赖具体实现,但具体实现应该依赖抽象接口

一个请求到PHP,Nginx的主要过程。完整描述整个网络请求过程,原理。

  • FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程。主进程php-fpm主要是管理fastcgi子进程,监听9000端口。fastcgi子进程等待来自Web Server的连接
  • 当客户端请求到达Web Server Nginx是时,Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx通过location指令,将所有以php为后缀的文件都交给127.0.0.1:9000来处理
  • FastCGI进程管理器PHP-FPM选择并连接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程
  • FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成
  • FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接

PHP的魔术方法

__set() // 在给不可访问属性赋值时,__set()会被调用
__get() // 读取不可访问属性的值时,__get()会被调用
__isset() //当对不可访问属性调用isset()或empty(),__isset()会被调用
__unset() // 当对不可访问属性调用unset()时,__unset()会被调用
__call() // 在对象中调用一个不可访问方法时,__call()会被调用
__callStatic() // 在静态上下文中调用一个不可访问的方法时,__callStatic会被调用
__construct() // 构造函数的类会在每次创建新对象时先调用此方法,所以非常适合在使用对象之前做一些初始化工作。
__destruct() // 析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执行。
__sleep() // serialize()函数会检查类中是否存在一个魔术方法__sleep(),如果存在,该方法会先被调用,然后再执行序列化操作。此功能可以用于清理对象,并返回一个包含对象中所有应被序列化的变量名称的数组。如果该方法未返回任何内容,则
NULL 被序列化,并产生一个 E_NOTICE 级别的错误。
__wakeup() // unserialize()函数会检查是否存在一个__wakeup()方法,如果存在,则会先调用该方法,然后再执行反序列化操作。__wakeup()
经常用在反序列化操作中,例如重新建立数据库连接,或执行其它初始化操作。

HTTP协议中GET、POST和HEAD的区别?

HEAD: 只请求页面的首部。
GET: 请求指定的页面信息,并返回实体主体。
POST:请求服务器接受所指定的文档作为对所标识的URI的新的从属实体。

  • HTTP 定义了与服务器交互的不同方法,最基本的方法是 GET 和 POST。事实上 GET 适用于多数请求,而保留 POST 仅用于更新站点
  • 在FORM提交的时候,如果不指定Method,则默认为GET请 求,Form中提交的数据将会附加在url之后,以?分开与url分开。字母数字字符原样发送,但空格转换为“+“号,其它符号转换为%XX,其中XX为 该符号以16进制表示的ASCII(或ISO Latin-1)值。GET请求请提交的数据放置在HTTP请求协议头中,而POST提交的数据则放在实体数据中
  • GET 这个是浏览器用语向服务器请求最常用的方法。POST这个方法也是用来传送数据的,但是与GET不同的是,使用POST的时候,数据不是附在URI后面传递的,而是要做为独立的行来传递,此时还必须要发送一个Content_length标题,以标明数据长度,随后一个空白行,然后就是实际传送的数据。网页的表单通常是用POST来传送的

XML 与 HTML 的主要区别
语法要求不同:

  • 在html中不区分大小写,在xml中严格区分

  • 在HTML中,有时不严格,如果上下文清楚地显示出段落或者列表键在何处结尾,那么你可以省略
    或者之类的结束标记。在XML中,是严格的树状结构,绝对不能省略掉结束标记

  • 在XML中,拥有单个标记而没有匹配的结束标记的元素必须用一个/ 字符作为结尾。这样分析器就知道不用查找结束标记了

  • 在XML中,属性值必须分装在引号中。在HTML中,引号是可用可不用的

  • 在HTML中,可以拥有不带值的属性名。在XML中,所有的属性都必须带有相应的值

  • 在XML文档中,空白部分不会被解析器自动删除;但是html是过滤掉空格的

标记不同:

  • html使用固有的标记;而xml没有固有的标记
  • Html标签是预定义的;XML标签是免费的、自定义的、可扩展的

作用不同

  • html是用来显示数据的;xml是用来描述数据、存放数据的,所以可以作为持久化的介质!Html将数据和显示结合在一起,在页面中把这数据显示出来;xml则将数据和显示分开。 XML被设计用来描述数据,其焦点是数据的内容。HTML被设计用来显示数据,其焦点是数据的外观
  • xml不是HTML的替代品,xml和html是两种不同用途的语言。 XML 不是要替换 HTML;实际上XML 可以视作对 HTML 的补充。XML 和HTML 的目标不同HTML 的设计目标是显示数据并集中于数据外观,而XML的设计目标是描述数据并集中于数据的内容
  • 对于XML最好的形容可能是: XML是一种跨平台的,与软、硬件无关的,处理与传输信息的工具
  • XML未来将会无所不在。XML将成为最普遍的数据处理和数据传输的工具

猜你喜欢

转载自blog.csdn.net/weixin_54882119/article/details/115004724