1.什么是composer?以及composer是干什么用的?工作原理
composer是一个依赖管理工具,composer会帮你安装这些依赖的库文件;比如composer可以解决自动加载类,不用你写过多的new。
2.PHP如何实现静态化
PHP的静态化分为:纯静态和伪静态。其中纯静态又分为:局部纯静态和全部纯静态。PHP伪静态:利用Apachemod_rewrite实现URL重写的方法;PHP纯静态,就是生成HTML文件的方式,我们须要开启PHP自带的缓存机制,即ob_start来开启缓存。
3.你了解设计模式吗?说下你最常用的设计模式
4.观察者模式是如何实现的?工厂模式是如何实现的?适配器模式是如何实现的?
观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且有所作为。即出版者+订阅者=观察者模式。
工厂模式:将调用者和创建者分离,调用者直接向工厂类请求获取调用对象,减少代码耦合,提高系统的维护性和扩展性;工厂模式应用场景:有多个产品类时就要用到工厂模式,比如在数据库连接中,我们可以采用多种数据库连接方法,有mysql扩展,mysqli扩展,PDO扩展等,在这种情况下我们可以一个扩展对应一个产品类,然后采用工厂模式。
适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)–适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。
5.PHP的优化方案
6.说下你了解的session和cookie
7.如何实现不基于session和cookie的用户认证。
8.说下你目前框架所用到的核心概念
主要说下目前所用框架的好处以及为什么要用这个框架。比如:免费的,代码开源,类库强大,易扩展,上手容易等等。
TP框架:ThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。ThinkPHP的宗旨是简化开发、提高效率、易于扩展,其在对数据库的支持方面已经包括MySQL、MSSQL、Sqlite、PgSQL、Oracle,以及PDO的支持。ThinkPHP有着丰富的文档和示例,框架的兼容性较强,但是其功能有限,因此更适合用于中小项目的开发。
9.什么是CSRF攻击,XSS攻击?如何防范
XSS攻击主要将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。防范方法:通过过滤是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数
10.你了解RESTfulAPI吗?说说干什么用的。
RESTfulAPI是REST风格的API,是一套用来规范多种形式的前端和同一个后台的交互方式的协议。RESTfulAPI由后台也就是SERVER来提供前端来调用;前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端。
11.设计的原则
一般认为遵从以下六大原则的代码是可扩展易维护高复用的代码:(1)、单一职责原则不要多管闲事。(2)、开放封闭原则对扩展开放,对修改封闭(3)、里氏代换原则子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。子类中可以增加自己特有的方法。当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
(4)、接口隔离原则
(5)、依赖倒转原则(6)、迪米特法则–最少知道原则这六大原则任何面向对象的语言都应该遵守,好的代码不一定是严格按照设计模式写的代码,如果你的代码符合这六大原则,那么你的代码就是好代码,所以这六大原则还是很重要的。
12.如何实现自动加载?不用composer如何实现?PSR-4是什么?
自动加载就是当我们在当前文件中实例化一个不存在的类时,调用自动加载机制引入相应的类文件。注:自动加载有两种方式(都是php内置的),一种是通过__autoload(),另一种是通过spl_autoload_register()。
PSR是PHPStandardsRecommendation的简称,制定的代码规范,简称PSR,是代码开发的事实标准。PSR-4使代码更加规范,能够满足面向package的自动加载,它规范了如何从文件路径自动加载类,同时规范了自动加载文件的位置。
二、数据库方面
1.你知道nosql吗?你用的nosql都有哪些?
NoSQL即非关系型数据库的统称NoSQL其实就是关系型数据库的补充,就目前而言我们是不可能离开关系型数据库的,所以NoSQL就来弥补关系型数据库在某些情况下的不足。这里把常见的NoSQL分为4类:K-V类、文档型、列式存储型、全文搜索型。我常用nosql主要有Redis、MongoDB、MemcacheDB;为什么要用NOSQL为了处理超大量的数据。
2.mysql索引优化
索引其实是一种数据结构,其功能是帮助我们快速匹配查找到需要的数据行,是数据库性能优化最常用的工具之一。其作用相当于超市里的导购员、书本里的目录。索引的类型:主键索引、唯一索引、普通索引、组合索引、全文索引;索引一经创建不能修改,如果要修改索引,只能删除重建。
3.mysql的优化方案
MYSQL八大优化方案(1)、选取最适用的字段属性(2)、使用(JOIN)连接来代替子查询(Sub-Queries)(3)、使用联合(UNION)来代替手动创建的临时表(4)、事务(5)、锁定表(6)、使用外键(7)、使用索引(8)、优化的查询语句
4.mysql的事务
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Readuncommitted)、读提交(readcommitted)、可重复读(repeatableread)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
5.mysql的读写分离
数据量增多,单机的数据库不足以支撑业务,需要用到数据库集群。而读写分离,就是将数据库的读和写分离,对应到数据库一般就是主从数据库,一主一从或者一主多从;业务服务器把数据写到主数据库中,读操作都去从库读;主库会同步数据到从库,保证数据的一致性。
读写分离理解和实现相对简单,但是只能减少访问的压力,不能分担存储的压力,当数据增多是,查询的速度还是会很慢。这时候就需要用到分库分表了。正常情况下,单机不能支撑业务时,才会用数据库集群,软件设计越简单的设计越好。一般数据库的优化是,先优化一些查询操作,然后优化业务的逻辑,或者加入缓存,最后不行再用集群,最后再分库分表。
6.消息队列如何实现
从本质上说消息对列就是一个队列结构的中间件,也就是说消息放入这个中间件之后就可以直接返回,并不需要系统立即处理,而另外会有一个程序读取这些数据,并按顺序进行逐次处理。也就是说当你遇到一个并发特别大并且耗时特别长同时还不需要立即返回处理结果,使用消息队列可以解决这类问题。
7.查询优化
8.msyql的存储引擎,以及各自的区别
InnoDB是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL5.5.5之后,InnoDB作为默认的存储引擎,InnoDB主要特性有:支持事务灾难恢复性好为处理巨大数据量的最大性能设计实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取支持外键完整性约束。存储表中的数据时,每张表的存储都按逐渐顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6B的ROWID,并以此作为主键。被用在众多需要高性能的大型数据库站点上
MyISAM基于ISAM的存储引擎,并对其进行扩展。它是在Web、数据存储和其他应用环境下最常使用的存储引擎之一。MyISAM拥有较高的插入、查询速度,但不支持事务。在MySQL5.5.5之前的版本中,MyISAM是默认的存储引擎。MyISAM主要特性有:不支持事务使用表级锁,并发性差主机宕机后,MyISAM表易损坏,灾难恢复性不佳可以配合锁,实现操作系统下的复制备份、迁移只缓存索引,数据的缓存是利用操作系统缓冲区来实现的。可能引发过多的系统调用且效率不佳数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能可以把数据文件和索引文件放在不同目录
使用MyISAM引擎创建数据库,将产生3个文件。文件的名字以表的名字开始,扩展名指出文件类型:frm文件存储表定义,数据文件的扩展名为.MYD(MYData),索引文件的扩展名是.MYI(MYIndex)。
9.redis和memcache有什么区别?redis使用场景有哪些?
Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储;Redis支持数据的备份,即master-slave模式的数据备份;Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用;
10.索引有哪些,你是如何做索引的?
从数据结构角度(1)、B+树索引(O(log(n))):关于B+树索引,可以参考MySQL索引背后的数据结构及算法原理(2)、hash索引:a.仅仅能满足"=",“IN"和”<=>"查询,不能使用范围查询b.其检索效率非常高,索引的检索可以一次定位,不像B-Tree索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以Hash索引的查询效率要远高于B-Tree索引c.只有Memory存储引擎显示支持hash索引(3)、FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)(4)、R-Tree索引(用于对GIS数据类型创建SPATIAL索引)
从物理存储角度(1)、聚集索引(clusteredindex)(2)、非聚集索引(non-clusteredindex)
聚集索引和非聚集索引的区别如下:a)聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。b)聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的
CREATETABLEtable_name[col_namedatatype][unique|fulltext|spatial][index|key]index_name[asc|desc]unique|fulltext|spatial为可选参数,分别表示唯一索引、全文索引和空间索引;index和key为同义词,两者作用相同,用来指定创建索引col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择;index_name指定索引的名称,为可选参数,如果不指定,MYSQL默认col_name为索引值;length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;asc或desc指定升序或降序的索引值存储
11.如何分表
我事先建100个这样的表,message_00,message_01,message_02…message_98,message_99.然后根据用户的ID来判断这个用户的聊天信息放到哪张表里面,你可以用hash的方式来获得,可以用求余的方式来获得,方法很多,各人想各人的吧。下面用hash的方法来获得表名:
说明一下,上面的这个方法,告诉我们user18991这个用户的消息都记录在message_10这张表里,user34523这个用户的消息都记录在message_13这张表里,读取的时候,只要从各自的表中读取就行了。
(3)、利用merge存储引擎来实现分表我觉得这种方法比较适合,那些没有事先考虑,而已经出现了得,数据查询慢的情况。这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了,现在一张表要分成几十张表,甚至上百张表,这样sql语句是不是要重写呢?mysql>showengines;的时候你会发现mrg_myisam其实就是merge。这样我就成功的将一张user表,分成了二个表,这个时候有一个问题,代码中的sql语句怎么办,以前是一张表,现在变成二张表了,代码改动很大,这样给程序员带来了很大的工作量,有没有好的办法解决这一点呢?办法是把以前的user表备份一下,然后删除掉,上面的操作中我建立了一个alluser表,只把这个alluser表的表名改成user就行了。但是,不是所有的mysql操作都能用的
三、服务器方面
1.说下一些你常用的linux命令
2.Linux如何搭建LAMP环境
(1)、检查系统环境(2)、安装Apache、PHP、Mysql(3)、安装基本常用扩展包(4)、配置Apache、mysql开机启动(5)、配置Mysql(6)、测试环境
3.你们平常工作的系统环境是在哪里?
Linux
4.你了解Docker吗?
严格来说,docker是一个容器引擎,用来管理和运行容器。除此之外还有其它类似软件,但是都没docker名气大,所以现在docker基本上等同于容器技术。
5.你说下常用的服务端口号
常用端口号:IIS(HTTP):80Https:443SOCKS:1080SQLServer:1433Oracle:1521MySQL:3306FTP:21SSH:22Tomcat:8080Telnet:23SMTP:25Redis:6379
四、前端知识
1.说下都有哪些跨域。
跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。同源就是指,域名,协议,端口均相同。
2.事件冒泡
事件冒泡:当一个元素接收到事件的时候会把他接收到的事件传给自己的父级,一直到window。(注意这里传递的仅仅是事件并不传递所绑定的事件函数。所以如果父级没有绑定事件函数,就算传递了事件也不会有什么表现但事件确实传递了。)
3.DOM事件流
事件流又称为事件传播,DOM2级事件规定的事件流包括三个阶段:事件捕获阶段(capturephase)、处于目标阶段(targetphase)和事件冒泡阶段(bubblingphase)
首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应
4.JS是如何实现继承的
JavaScript实现继承的方式是用原型链来实现的。由于每个构造函数都一个属性,指向一个原型对象,所以我们将原型对象等于另一个类型的实例,显然这时这个实例中有一个指向另一个原型的指针。如果这样一层一层的嵌套下去,就构成一个原型链。
5.正则表达式
/^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,5}$/1手机号正则表达式
/^1[3456789]d{9}$/1
五、算法和其它方面
1.最常用的排序算法
3.如何防止高并发
优化方案一:数据表的number字段类型设置为unsigned优化方案二:使用mysql事务优化方案三:使用非文件的排他锁优化方案四:redis队列,因为pop操作是原子的
4.你用哪种版本控制?如何避免代码冲突
svn、git每次代码提交时首先要更新本地代码
5.在浏览中输入网址后都发生了什么
6.你了解socket吗?
7.如果打开网页的时候白屏10秒才显示出页面,如果进行排查。
利用调试工具
六、其它,必问知识
1.说下你在项目中碰到的问题
这个问题是个坑,你回答不回答都不行,最好是从自己的实际工作中挑一到二个问题,说下是怎么解决的。
2.你是如何解决的问题的
遇到问题冷静对待,查询错误信息,针对性解决问题。
3.你未来的规划是什么?
慢慢丰富自己的专业知识,期望在一个公司里长期稳定的发展。
4.你为什么离职
主动离职,原因无非就是钱少、活多、离家远、晋升遇到瓶颈、行业发展慢、工作环境差、领导同事不好相处,等被动离职,原因无非就是公司倒闭、裁员、末位淘汰等
5.你觉得你的领导会如何评价你
我虽然未必能做到八面玲珑,但是与人真诚相处是我一向的原则。和朋友相处我会比较随性自由,不计较一些得失,因此朋友们认为我是个有义气的人;同事间经常在工作上有合作,发生分歧时我会冷静处理,因此同事们说我是个理性的人;对于工作我始终都认真专注,能够让领导放心把工作交给我,因此领导评价我是一个负责的员工。我认为无论是朋友、同事还是领导,秉着真诚、和善的态度交流、沟通是基本原则。
6.说下你做得你公司最不错的项目,都用了哪些技术,对你带来了哪些成长
针对之前做过的项目进行描述
7.说下TCP的三次握手,为什么三次,两次不行吗?为什么挥手不是四次
TCP关闭链接四次握手原因在于tcp链接是全双工通道,需要双向关闭。client向server发送关闭请求,表示client不再发送数据,server响应。此时server端仍然可以向client发送数据,待server端发送数据结束后,就向client发送关闭请求,然后client确认。