PHP 常见的面试题汇总

PHP常见的面试题汇总

 

 

 

  购物车里面的收藏怎么做

     首先在数据库里面建一个收藏表,让它与用户表相关联点击收藏的时候加入到用户所对应的收藏表里面

  什么是同步和异步

     同步就是客户端发送数据到服务器,服务器等发响应回数据的时候它才继续往下面走
     异步就是客户端的发送数据到服务器,不用等待服务器的响应,直接往下面走

   什么是拆单

     拆单也有两个层次,第一次是在提交订单后支付之前拆单,这次是拆分的订单,一次是在下单之后,发货之前,去拆分发货单(SKU层面)。

 

   面向对象三大特性五大原则

      1.封装2.继承3.多态

  1. 单一职责原则
  2. 开放封闭原则
  3. 里氏替换原则
  4. 依赖倒置原则
  5. 接口分离原则

 

   面向对象的三大特点


       1)封装:所谓封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏封装是面向对象的特征之一,是对象和类概念的主要特性。简单的说,一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外部访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用对象的私有部分

      。2)继承:所谓继承是指可以让某个类型的对象获得另一个类型的对象的属性的方法它支持按级分类的概念继承是指这样一种能力:。它可以使用现有类的所有功能,并在无需重新编写原来类的情况下对这些功能进行扩展。通过继承创建的新类称为“子类”或“派生类 ,被继承的类称为“基类”,“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过“继承”(继承)和“组合” (组合物)来实现继承概念的实现方式有二类:。实现继承与接口继承实现继承是指直接使用基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称,但是子类必须提供实现的能力;
      3)多态:所谓多态就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

 

   前端的优化:

第一:面向内容的优化

  •    减少HTTP请求
  •    减少DNS查找
  •    避免重定向
  •    使用Ajax缓存
  •    延迟载入组件
  •    预先载入组件
  •    减少DOM元素数量
  •    切分组件到多个域
  •    最小化iframe的数量
  •    不要出现http 404错误

第二:面向服务器

  •  

      缩小Cookie 
  •   针对 Web 组件使用域名无关性

 

memcache和redis区别:

1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等。
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10
5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从
6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化)
7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复
8、Redis支持数据的备份,即master-slave模式的数据备份。

 

 

支付宝同步回调和异步回调

当一个支付请求被发送到支付渠道方,支付渠道会很快返回一个结果。但是这个结果,只是告诉你调用成功了,不是扣款成功,这叫同步调用。
很多新手会拿这个结果 当作支付成功了,那就会被坑死,结果就是支付成功率特别高,伴随着一堆无法解释的坏账率,测试人员尤其要注意测试数据的篡改:金额,同步返回结果,订单号等。

同步请求参数里面会有一个回调地址,这个地址是支付渠道在扣款成功后调用的,这叫异步调用。
一般同步接口仅检查参数是否正确,签名是否无误等。异步接口才告诉你扣款结果。
一般异步接口有5秒以内的延迟。调用不成功会重试。有时候是这边成功了,但支付渠道侧没收到返回,于是会继续调。
当天的支付到第二天还在 被异步调用也都是正常的。这也是开发人员需要特别注意的地方,不要当做重复支付。
测试人员也要对重复回调进行测试,应只有一次有效。这还不是最坑的,一般 支付渠道侧,只有支付成功了才通知你。
要是支付失败了,压根儿都不告诉你。
另一方面,如何老收不到异步结果呢?那就得查查了。同步结果不可靠,异步调用不可靠,那怎么确定支付结果?最终的杀招就是查单了,
反查,一般支付渠道侧都 会提供反查接口,定时获取DB中待支付的订单调用支付渠道侧的反查接口,最终把支付渠道侧扣款成功的订单完成掉。

 

 

域名解析过程

  1. 本地host的文件. 找到对应的ip
  2. 本地DNS缓存
  3. DNS 服务商 去查询对应的IP
  4. 三次握手
  5. http请求
  6. 本地缓存(静态文件)
  7. 服务端请求web->php->myysql
  8. 响应页面内容
  9. 浏览器解析-渲染

 

单点登录

1.第一次登陆
某个
站点:a)用户输入用户名+密码,向用户验证中心发送登录请求b)当前登录站点,通过webservice请求,用户验证中心验证用户名,密码的合法性。如果验证通过,则生成ticket,用于标识当前会话的用户
c)将获取的用户数据和ticket返回给子站。如果验证不通过,则返回相应的错误状态码
。d)根据上一步的webservice请求返回的结果,当前子站对用户进行登陆处理:如状态码表示成功的话,则当前站点通过本站的cookie保存车票,并本站记录用户的登录状态状态码表示失败的话,则给用户相应的登录失败提示
。2.登陆状态下,用户转到另一子站:
a)通过本站cookie或会话验证用户的登录状态:如验证通过,进入正常本站处理程序;否则户中心验证用户的登录状态发送票到用户验证中心),如验证通过,则对返回的用户信息进行本地的登录处理,否 则表明用户未登录。


 

负载均衡和反向代理的区别

反向代理是实现负载均衡的一种方法。
先谈反向代理。用户在请求时,先把请求发送给代理的服务器,然后由代理服务器根据算法去请求真实的服务器,最后返回给用户。这种做法,其一是提高了安全性;其二是通过多台的real server分担了用户的请求,实现了负载均衡。
再谈负载均衡。负载均衡的出现,是通过横向的扩展,尽可能地降低单台服务器的压力。常见WEB层面的负载均衡的方案有硬件F5、Nginx代理、LVS、各个云商的负载均衡服务(如AWS的ELB服务)等。负载均衡后面连的一般是实际提供服务的服务器,如通过ELB服务,可以做到流量的均匀分担,从而减少单机服务器的压力。
由于增加了负载均衡这层,所以单纯地使用某个方案还是要考虑单点的问题。负责由于负载均衡这个服务器未能承受住压力,宕机了,服务也是不可用的。所以Nginx、LVS尽量配置多台代理,可以故障转移和故障报警,从而及时去处理代理层服务器的问题。ELB是亚马逊提供的服务,它本身的实现底层就有数百甚至上千的机器,所以把它想象成一个代理集群就好。

 

 


 

说几个魔术方法

    __construct(),类的构造函数
    __destruct(),类的析构函数
    __call(),在对象中调用一个不可访问方法时调用
    __callStatic(),用静态方式中调用一个不可访问方法时调用
    __get(),获得一个类的成员变量时调用
    __set(),设置一个类的成员变量时调用
    __isset(),当对不可访问属性调用isset()或empty()时调用
    __unset(),当对不可访问属性调用unset()时被调用。
    __sleep(),执行serialize()时,先会调用这个函数
    __wakeup(),执行unserialize()时,先会调用这个函数
    __toString(),类被当成字符串时的回应方法
    __invoke(),调用函数的方式调用一个对象时的回应方法
    __set_state(),调用var_export()导出类时,此静态方法会被调用。
    __clone(),当对象复制完成时调用
    __autoload(),尝试加载未定义的类
    __debugInfo(),打印所需调试信息

 

 

如何实现自动加载

         在PHP5之前,各个php框架如果要实现类的自动加载,一般都是按照某种约定自己    实现一个遍历目录,自动加载所有符合约定规则的文件的类或函数。 当然,PHP5    之前对面向对象的支持并不是太好,类的使用也没有现在频繁。 在PHP5后,当加    载PHP类时,如果类所在文件没有被包含进来,或者类名出错,Zend引擎会自动调    用__autoload 函数。此函数需要用户自己实现__autoload函数。 在PHP5.1.2版    本后,可以使用spl_autoload_register函数自定义自动加载处理函数。当没有调    用此函数,默认情况下会使用SPL自定义的spl_autoload函数。
        当实例化一个不存的类时,就是触发spl_autoload_register函数 , 这个函数就会找到这个类,去实例化他 .

 

 

 http的3次握手

     第一次握手:主机A发送位码为syn=1,随机产生seq number=1234567的数据包到服务器,主机B由SYN=1知道,A要求建立联机;

     第二次握手:主机B收到请求后要确认联机信息,向A发送ack number=(主机A的seq+1),syn=1,ack=1,随机产生seq=7654321的包

     第三次握手:主机A收到后检查ack number是否正确,即第一次发送的seq number+1,以及位码ack是否为1,若正确,主机A会再发送ack number=(主机B的seq+1),ack=1,主机B收到后确认seq值与ack=1则连接建立成功。

     完成三次握手,主机A与主机B开始传送数据。

 

 

oAuth协议

    OAUTH协议为用户资源的授权提供了一个安全的、开放而又简易的标准。同时,任何第三方都可以使用OAUTH认证服务,任何服务提供商都可以实现自身的OAUTH认证服务,因而OAUTH是开放的。

 

 

单例模式

    1. 单例模式是指整个应用中某个类只有一个对象实例的设计模式。具体来说,作为对象的创建方式,单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统全局的提供这个实例。它不会创建实例副本,而是会向单例类内部存储的实例返回一个引用。
    2. 单例模式的特点
          单例模式的主要特点是“三私一公”:
          需要一个保存类的唯一实例的私有静态成员变量
          构造函数必须声明为私有的,防止外部程序new一个对象从而失去单例的意义
          克隆函数必须声明为私有的,防止对象被克隆
          必须提供一个访问这个实例的公共静态方法(通常命名为getInstance),从而返回唯一实例的一个引用。

    3. 使用单例模式的原因及场景
              在PHP的大多数应用中都会存在大量的数据库操作,如果不用单例模式,那每次都要new操作,但是每次new都会消耗大量的系统资源和内存资源,而且每次打开和关闭数据库都是对数据库的一种极大考验和浪费。所以单例模式经常用在数据库操作类中。
              同样,如果系统中需要有一个类来全局控制某些配置信息,那使用单例模式可以很方便的实现。

 

数据据量特别大的表怎么建索引

给要求数据唯一的字段建立唯一索引,搜索频率高的字段建立普通索引,如果搜索情况复杂,可以建立复合索引,索引还是要根据情况来建立,并不是索引越多越好。索引越
多的时候,如果建立索引不够恰当,不仅不会加快查询速度,反而会拖慢查询速度,得不偿失。

 

 

 

动静分离

动静分离是将网站静态资源(HTML,JavaScript,CSS,img等文件)与后台应用分开部署,提高用户访问静态代码的速度,降低对后台应用访问。
动静分离的一种做法是将静态资源部署在nginx上,后台项目部署到应用服务器上,根据一定规则静态资源的请求全部请求nginx服务器,达到动静分离的目标。

 

 

TCP与UDP

    TCP:
        http协议是基于tcp协议
        tcp协议是传输控制协议
        建立链接需要经过三次握手,断开时会经过四次
        简单的描述下这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
    udp
        UDP是用户数据报协议
        UDP信息包的标题很短,只有8个字节,相对于TCP的20个字节信息包的额        外开销很小。
        UDP是面向报文的
    小结TCP与UDP的区别:
        1.基于连接与无连接;
        2.对系统资源的要求(TCP较多,UDP少);
        3.UDP程序结构较简单;
        4.流模式与数据报模式 ;
        5.TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证。

 

 

redis 持久化方式

两种方式:
1)RDB
以快照的形式存储到二进制文件中
2)AOF
。Redis的每次发生改变就写入到日志中
5.redis持久化哪种方式更安全一些
AOF安全更
相比RDB,AOF会将每次发生改变的内容写入到日志里面,保证了数据的完整性,数据不会丢失,RDB以快照形式存储,如果快照时间过长,这个过程中的数据可能丢失,不能保证数据的完整性

 

 

为什么要使用会话共享

为了提高用户体验,避免用户在同一网站下重复登录
。id是记录在一台服务器上的要通过会话共享让其他服务器都知道
防止多台服务器每台都要登录

 

你可能感兴趣的:(PHP)