这是我整理的一套面试题,老手们看看复习一下吧。Overview感觉现在发面试题有点冷门,就像昨天德国的一样,不过提前复习的时候看看。提前准备。最近2个月外出面试的童鞋要注意不要中暑。说说你知道的几种设计模式单例模式保证一个类只有一个实例,并提供一个全局的访问点来访问它,比如框架中的数据库连接——类似DB类策略模式的一套algorithms,每个算法都封装成一个独立的类,有一个通用的接口,比如在进入个人主页时,根据不同的浏览者给出不同的展示和操作——类似于不同的用户展示不同的效果。注册模式在程序中提供了一个有组织的存储和管理Group全局对象(object)——注入适配器模式类似于一个服务提供者将不同的接口适配成一个统一的API接口。比如数据操作有mysql、mysqli、pdo等,可以采用适配器模式统一接口观察者模式。一个对象可以添加一个方法使其自身可观察。当一个可观察对象发生变化时,它会向注册的观察者发送一条消息。比如实现消息推送——将所有类的实例化注册到一个数组中,在不修改原有类代码和继承的情况下,通过循环批量执行类装饰器模式。动态扩展类的功能,例如框架的每个Controller文件都会提供before和after方法——Executebeforeorafteramethodoroutput,用于修改iterator模式提供顺序访问聚合对象中每个元素的方法,在PHP中会继承Iterator类——yieldPOST和GET有什么区别GET是从服务器获取数据,POST是向服务器发送数据,GET是通过URl传参发送HTTP协议接收,而POST是实体数据,GET通过表单提交传输的数据量较小,不能大于2KB。POST传输的数据量较大,一般默认为无限制。GET的安全性很低,POST的安全性很高。session和cookie的区别在于session保存在服务器上php指定的目录(session_dir)。指一组有序的数据库操作为一个单元,如果该组中的所有操作都成功,则认为事务成功,即使一个操作失败。交易也不成功。如果所有操作都已完成并且事务已提交,则其修改将应用于所有其他数据库进程。如果一个操作失败,事务将被回滚,被事务影响的操作将被取消。PHP中按引用传递和按值传递有什么区别?值传递:函数内值的内容变化对函数外部没有影响引用传递:函数内值内容的变化也会使函数外发生相应的变化MYSQL优化方案有哪些?选择合适的字段类型,避免给数据库增加不必要的空间。字段尽量设置为NOTNULL,类似性别,省份尽量使用枚举类型ENUM,使用JOIN查询代替子查询,使用UNION代替临时表,尽量不要使用外键,除非必要保持一致性和数据表与表之间的完整性,尽量不要使用视图分表分库,读写分离并合理设置主键和索引索引分为:普通索引、唯一索引、全文索引、primarykey(也是唯一索引)后期演进的数据表优化-垂直拆分:表数据拆分到不同的表,按业务拆分-水平拆分:行数据拆分到不同的表,按时间拆分表、类型、身份等因素——水平和垂直联合拆分9.索引建立原则——最左前缀匹配原则——索引列尽量不参与计算——尽量扩theindexanddodonotcreateanewindex面向对象编程的五个基本原则(S.O.L.I.D)去做,不是说你应该这样去做)——永远不要有超过一个因素导致一个类发生变化,确保类有一个且只有一个职责OCP开闭原则(在开胸手术期间无需穿外套)-对扩展开放,修改封闭LSPLiskov替换原则-当子类的实例应该能够替换任何实例时它的父类,它们之间是IS-A关系ISP接口隔离原则——不强制客户端(一般指调用者)去依赖它们不使用的接口DIP依赖倒置原则高层模块不应该依赖低级模块,两者都应该依赖于它们的抽象一种实现简单对象迭代的简单方法,与定义一个实现Iterator接口的类相比,性能开销和复杂度都很大减少了。子类覆盖父类的保护方法有什么限制?Final修饰的类方法不能被子类重写。5.3之后,方法参数个数必须一致。重写时,访问级别只能等于或低于当前重写方法的访问级别。什么是CGI?什么是FastCGI?php-fpm、FastCGI、Nginx是什么关系?CGI是一个通用的网关接口。用户的WEB服务器和应用程序之间的交互定义了输入和输出规范。用户的请求通过WEB服务器转发给FastCGI进程,FastCGI进程调用应用程序进行处理,比如PHP解析器,应用程序处理HTML等结果返回给FastCGI,FastCGI返回给Nginx进行处理输出。假设web服务器是NGINX,应用程序是PHP,php-fpm管理FastCGI。这就是php-fpm、fastCGI和NGINX的关系。FastCGI用于提高cgi程序性能,启动一个master,然后启动多个worker,不需要每次都解析php.ini并且php-fpm实现了fastcgi协议,是fastcgi的进程管理器,支持平滑重启,可以pre-启动时生成多个进程。什么是CSRF攻击?跨站脚本攻击?如何预防?CSRF,跨站请求伪造,攻击者冒充用户发送请求窃取信息或破坏系统。防止api请求方式合理标准化,GET和POST在POST请求中加入token令牌验证,生成一个随机码存入session中,表单中带上这个随机码,提交时验证随机码是否相同.XSS,跨站脚本攻击。防止不信任任何输入,过滤输入。基本算法顺序查找functionsearch($arr,$k){ $n=count($arr);$arr[$n]=$k;for($i=0;$i<$n;$i++){如果($arr[$i]==$k){中断;}}如果($i<$n){返回$i;}else{返回-1;}}二分查找functionbinaryRecursive($arr,$low,$top,$target){if($low<=$top){$mid=floor(($low+$top)/2);如果($arr[$mid]==$target){返回$arr[$mid];}elseif($arr[$mid]<$target){返回binaryRecursive($arr,$mid+1,$top,$target);}else{returnbinaryRecursive($arr,$low,$top-1,$target);}}else{返回-1;}}冒泡排序函数_sort($arr){$count=count($arr)-1;$临时=0;对于($i=0;$i<$count;$i++){对于($j=0;$j<$count-$i;$j++){如果($arr[$j]<$arr[$j+1]){$temp=$arr[$j];$arr[$j]=$arr[$j+1];$arr[$j+1]=$temp;}}}返回$arr;}quicksortfunctionquick_sort($arr){//判断参数是否为数组if(!is_array($arr)){returnfalse;}else{//递归退出:数组长度为1,直接返回数组$length=count($arr);如果($length<=1)返回$arr;//如果有多个数组元素,定义两个空数组$left=$right=array();//使用for循环遍历,以第一个元素作为比较对象for($i=1;$i<$length;$i++){//判断当前元素的大小if($arr[$i]<$arr[0]){$left[]=$arr[$i];}else{$right[]=$arr[$i];}}//递归调用$left=quick_sort($left);$right=quick_sort($right);//合并所有结果returnarray_merge($left,array($arr[0]),$right);}}NOSQLRedis和Memecached有什么区别?Redis支持更丰富的数据存储类型,String、Hash、List、Set和SortedSetMemcached只支持简单的键值结构。Memcachedkey-value存储比Redis使用hash结构进行key-value存储,内存利用率更高。Redis提供了事务功能,可以保证一系列命令的原子性。Redis支持数据持久化,可以将内存中的数据保存在磁盘上。Redis只使用单核,而Memcached可以使用多核,所以平均每核Redis在存储小数据时比Memcached有更高的性能。Redis是如何实现持久化的?RDB持久化,将内存中redis的状态保存到硬盘,相当于备份数据库状态AOF持久化(Append-Only-File),AOF持久化是通过保存Redis服务器锁执行的写状态来记录数据库.相当于备份数据库收到的命令。所有写入AOF的命令都以redis协议格式存储。Laravel的设计原则服务提供者是什么?服务提供者是所有Laravel应用程序引导的中心。Laravel的核心服务器、注册服务、绑定服务、监听器、中间件、路由注册和我们的应用程序都是由服务提供者引导的。什么是IOC容器?IOC即控制反转,也称为依赖注入(DI)。对象A可以依赖对象B,但是控制权在对象A,所以称为控制反转。依赖注入就是在IOC容器运行的时候动态的注入一定的依赖。关系被注入到对象中。作用:解决代码难度,实现低耦合,高扩展。什么是门面?提供一个“静态”接口来访问在IoC容器中注册的类。提供简单易记的语法,无需记住必须手动注入或配置的长类名。此外,由于PHP动态方法的独特使用,非常容易测试。什么是合同?契约是定义Laravel框架提供的核心服务的接口。Contract和Facades没有本质的区别,它的作用就是让接口的耦合度更低,更简单。架构Thrift实现的基本原理和作用通过使用RPC通信协议,实现多语言开发场景下的无感知相互调用。优点数据包以二进制形式发送,流量消耗低,传输效率高。语言间无障碍分布式数据库分布式缓存TCP三次握手三次握手是客户端在与服务器建立TCP连接时需要发送3个数据包来确认连接,之后才能建立连接三向握手完成。第一次握手。客户端发送请求报文,标志位SYN置1,seq值随机生成x,客户端进入SYN_SENT状态,等待服务器响应。第二次握手。服务器收到请求报文,将SYN和ACK都设置为1,ack为x+1,随机生成seq值y,然后将数据包发送给客户端确认,服务器进入SYN_RCVD状态。第三次握手。客户端收到响应数据包后,确认ack是否为x+1,ACK是否为1,如果正确则设置ACK为1,ack为y+1,然后将数据发送给服务器。服务器收到数据后,检查ack是否为y+1,ACK是否为1,如果正确,则连接建立正确。双方进入ESTAB-LISHED状态,完成三次握手。TCP和UDP的区别除了TCP,我们经常听到的就是UDP,那么它们有什么区别呢?TCP对应于可靠性要求高的应用。从上面的解释可以看出,实际通信前需要三次握手,是面向连接的;而TCP使用序列号来保证消息的顺序。UDP对应对可靠性要求不高,但流量大、速度快的应用;与TCP相比,UDP是无连接的,可能是乱序的。TCP较重,UDP较轻。没有高低之分,只是应用场景不同而已。你为什么因为非技术问题离开你以前的公司?未来三年的职业规划是什么?你有什么要了解的吗?非技术问题没有正确答案
