面试问题汇总

1.cookie被禁用了 session还能用吗

在php里面,session_id是每个会话的唯一id,它默认被保存到cookie中(session_id一个存在服务器端,一个存在cookie当中),请求时,根据cookie里面的session_id来识别会话。

但可通过trans_sid设置(在编译时或php.ini)文件中,对其进行修改。修改后,session_id能脱离cookie而存在,不同点在于,使用cookie时,从cookie中获取session_id,而不使用cookie时,session_id会跟在url后面(PHP自动干这事情),所以cookie被禁用之后session就不能用了。

 

2.分布式集群时候共享session问题

通过php自身的session配置实现
session.save_handler = redis#配置为redis
session.save_path ="tcp://127.0.0.1:6379"#如果redis设置了密码则:session.save_path = "tcp://redis服务地址:端口?auth=密码"
该方案由于配置不支持多样化,只能用于用户少量时的应用。

3.mysql中char和varchar的区别,哪种字段的查找效率高

在mySQL 中char 和 varchar 都是存储字符串的,区别在于char有固定的长度,而varchar属于可变长的字符类型。
char 固定长度,所以在处理速度上要比varchar快速很多,但是对费存储空间,所以对存储不大,但在速度上有要求的可以使用char类型。

4.isset和empty的区别
只要变量是否为” “或者0,或者是false和null,只要是这些值empty都会返回true(
判断变量是否存在),而isset是判断变量是否存在,只要你这个变量不是null或未赋值,返回结果都是true

5.javascript的数据类型

字符串、数字、布尔、数组、对象、Null、Undefined

6.MyISam和InnoDb的主要区别和用场景
主要区别:
  • 1).MyISAM是非事务安全型的,而InnoDB是事务安全型的。
  • 2).MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
  • 3).MyISAM支持全文类型索引,而InnoDB不支持全文索引。
  • 4).MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
  • 5).MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
  • 6).InnoDB表比MyISAM表更安全,可以在保证数据不会丢失的情况下,切换非事务表到事务表(alter table tablename type=innodb)。
应用场景:
  • 1).MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择。
  • 2).InnoDB用于事务处理应用程序,具有众多特性,包括ACID事务支持。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能。

 

7.PHP魔术函数

php引擎将类的相关接口以魔术方法的形式暴露给用户,

用户可以通过自定义相关接口,实现灵活的功能组织    (php中的魔法函数都是以“__”两个连续的下划线开头的)

 

8.PHP面向对象之访问权限修饰符

public(公共的、默认)
protected(受保护的)
private(私有的)
public(公共的、默认)在PHP5中如果类没有指定成员的访问修饰符,默认就是public的访问权限。
protected(受保护的)被声明为protected的成员,只允许该类的子类进行访问。
private(私有的 ) 被定义为private的成员,对于类内部所有成员都可见,没有访问限制。对类外部不允许访问。

 

9.require,include,require_one,include_one区别

require和include几乎完全一样,除了处理失败的方式不同之外,require在出错时产生 E_COMPILE_ERROR 级别的错误。换句话说将导致脚本中止而 include 只产生警告(E_WARNING),脚本会继续运行。

require_once 语句和 require 语句完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。

include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含。如同此语句名字暗示的那样,只会包含一次。

 

10.TCP建立连接为什么是三次握手,为什么不是两次或四次?

 

 

如图所示:

第一次握手:客户端发送TCP包,置SYN标志位为1,将初始序号X,保存在包头的序列号(Seq)里

第二次握手:服务器端回应确认包,置SYN标志位为1,置ACK为X+1,将初始序列号Y,保存在包头的序列号里

第三次握手:客户端对服务端的确认包进行确认,置SYN标志位为0,置ACK为Y+1,置序列号为Z

 

为什么不是两次握手:

因为我们不进行第三次握手,第二次握手之后,就会理所当然的认为链接已经建立,而如果服务端并没有收到客户端的回应呢,此时,客户端任认为链接未建立,服务端对已链接保存必要的资源,如果大量的这种情况,服务端会崩溃,因此第三次握手是必要的。

为什么不是四次:

首先,如果乐于思考的同学应该会对上面有这样的疑问:(既然没法确认第二次的握手,客户端是否收到,那么怎么确认第三次握手服务端就可以收到呢?)

不错,这根本没法确定,因为完全可靠的通信协议是根本不存在的,我们任何的通信协议都是在接受这样的现实情况之上进行的,而三次握手后,客户端和服务端至少可以确认之前的通信情况,但无法确认之后的情况,在这个道理上说,无论是四次还是五次或者是更多次都是徒劳的、

posted @ 2018-07-07 17:31  Mr_Echo  阅读(131)  评论(0编辑  收藏  举报