php最新面试题及答案
php是跨平台的开放源代码,它尤其轻巧方便,没有任何繁琐程序所产生的负担,因此可以很快的返回结果。今天小编整理了php最新面试题及答案解析供大家参考,一起来看看吧!
php最新面试题及答案解析
1、如何查看是否是用索引:
explain + sql
查看索引使用情况 :show status like ‘%Handler_read%’;
2、数据结构 :
数组 堆 栈 队列 链表 集合 树 字典
3、网络7层协议:
应用层
与其它计算机进行通讯的一个应用,它是对应应用程序的通信服务的。例如,一个没有通信功能的字处理程序就不能执行通信的代码,从事字处理工作的程序员也不关心OSI的第7层。但是,如果添加了一个传输文件的选项,那么字处理器的程序就需要实现OSI的第7层。示例:TELNET,HTTP,FTP,NFS,SMTP等。
表示层
这一层的主要功能是定义数据格式及加密。例如,FTP允许你选择以二进制或ASCII格式传输。如果选择二进制,那么发送方和接收方不改变文件的内容。如果选择ASCII格式,发送方将把文本从发送方的字符集转换成标准的ASCII后发送数据。在接收方将标准的ASCII转换成接收方计算机的字符集。示例:加密,ASCII等。
会话层
它定义了如何开始、控制和结束一个会话,包括对多个双向消息的控制和管理,以便在只完成连续消息的一部分时可以通知应用,从而使表示层看到的数据是连续的,在某些情况下,如果表示层收到了所有的数据,则用数据代表表示层。示例:RPC,SQL等。
传输层
这层的功能包括是否选择差错恢复协议还是无差错恢复协议,及在同一主机上对不同应用的数据流的输入进行复用,还包括对收到的顺序不对的数据包的重新排序功能。示例:TCP,UDP,SPX。
网络层
这层对端到端的包传输进行定义,它定义了能够标识所有结点的逻辑地址,还定义了路由实现的方式和学习的方式。为了适应最大传输单元长度小于包长度的传输介质,网络层还定义了如何将一个包分解成更小的包的分段方法。示例:IP,IPX等。
数据链路层
它定义了在单个链路上如何传输数据。这些协议与被讨论的各种介质有关。示例:ATM,FDDI等。
物理层
OSI的物理层规范是有关传输介质的特性,这些规范通常也参考了其他组织制定的标准。连接头、帧、帧的使用、电流、编码及光调制等都属于各种物理层规范中的内容。物理层常用多个规范完成对所有细节的定义。示例:Rj45,802.3等。
4、数据库中的事务是什么?
事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,
事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。
5、for 和 foreach 哪个快 :
由于for循环的特性,每次循环都会进行比较,所以效率上不如foreach。
但这个结论并不是绝对的,选择for或者foreach,还要考虑几点:
如果只是读数据,优先选择foreach,因为效率高,而且代码简单,方便;
如果要写数据,即替换指定索引位置处的对象,就只能选择for了。
6、单链表,双链表,循环链表
单向链表或者单链表
单向链表,它包含两个域,一个信息域和一个指针域。这个链接指向表中的下一个节点,而最后一个节点则指向一个空值NULL。
单向链表只可向一个方向遍历。
查找一个节点的时候需要从第一个节点开始每次访问下一个节点,一直访问到需要的位置。也可以提前把一个节点的位置另外保存起来,然后直接访问。
双向链表,也叫双链表
双向链表中不仅有指向后一个节点的指针,还有指向前一个节点的指针。第一个节点的"前连接"指向NULL,最后一个节点的"后连接"指向NULL。
这样可以从任何一个节点访问前一个节点,也可以访问后一个节点,以至整个链表。一般是在需要大批量的另外储存数据在链表中的位置的时候用。
由于另外储存了指向链表内容的指针,并且可能会修改相邻的节点,有的时候第一个节点可能会被删除或者在之前添加一个新的节点。这时候就要修改指向首个节点的指针。
有一种方便的可以消除这种特殊情况的方法是在最后一个节点之后、第一个节点之前储存一个永远不会被删除或者移动的虚拟节点,形成一个循环链表。这个虚拟节点之后的节点就是真正的第一个节点。这种情况通常可以用这个虚拟节点直接表示这个链表。
循环链表
在一个循环链表中, 首节点和末节点被连接在一起。这种方式在单向和双向链表中皆可实现。要转换一个循环链表,你开始于任意一个节点然后沿着列表的任一方向直到返回开始的节点。循环链表可以被视为"无头无尾"。
循环链表中第一个节点之前就是最后一个节点,反之亦然。循环链表的无边界使得在这样的链表上设计算法会比普通链表更加容易。对于新加入的节点应该是在第一个节点之前还是最后一个节点之后可以根据实际要求灵活处理,区别不大。
另外有一种模拟的循环链表,就是在访问到最后一个节点之后的时候,手工跳转到第一个节点。访问到第一个节点之前的时候也一样。这样也可以实现循环链表的功能,在直接用循环链表比较麻烦或者可能会出现问题的时候可以用。
7、public private protected区别
(1)、public:public表明该数据bai成员、成员函数是对du所有用户开放的,所有用户都可zhi以直接进行dao调用
(2)、private:private表示私有,私有的意思就是除了class自己之外,任何人都不可以直接使用。
(3)、protected:protected对于子女、朋友来说,就是public的,可以自由使用,没有任何限制,而对于其他的外部class,protected就变成private。
三种类型的继承,父类的成员均被子类继承(之前的百科关于这点的描述是错误的),只是由类实例化的对象对其继承的成员的访问权限会有所变化。三种不同方式的继承,描述的是子类实例化对象对其成员的访问权限,并非是描述子类时,子类对继承自父类的成员的访问权限。
公有继承 继承自父类的成员保持不变。
私有继承 继承自父类的成员全部变为私有成员。
保护继承 继承自父类的公有成员变为保护成员,其余不变。
9、redis中字符串和hash区别:
redis 的字符串和哈希对比
相同点和不同点
相同点:
首先是他们有很多效果类似的命令,比如set和hset,mset和hmset等等
大多数情况下使用字符串存储的场景使用hash也可以实现。
不同点
他们的存储结构决定了他们有一些本质的差异
使用hash散列的优势
使用hash可以将数据放在同一个地方方便管理,而不必用字符串将数据放在整个数据库,而且还可以避免误操作。
使用hash散列既可以减少创建键的数量又可以避免键名冲突。
使用hash散列比使用字符串键更节约内存。因为在数据库中创建key都有数据库附加的管理信息(比如键的类型,最后一次访问时间等等),所以keys越多,服务器在存储附加管理信息方面消耗的内存就越多,同时花在管理数据库中key的cu’p也会越多。而且redis本事也会对hash的存储做一些底层的优化,内存消耗更少。
特定情况下使用字符串
使用过期功能
因为redis的过期功能只能对键进行操作而不能对散列键的field进行操作。
对二进制存储的命令
因为redis目前只支持对字符串键进行setbit,getbit,bitop等二进制相关的命令操作。
9、mysql:innodb及mysiam的了解
mysiam
1、不支持行锁,读取时对需要读到的所有表加锁,写入时则对表加排它锁
2、不支持事务
3、不支持外键
4、不支持崩溃后的安全恢复
5、在表有读取查询的同时,支持往表中插入新纪录
6、支持BLOB和TEXT的前500个字符索引,支持全文索引
7、支持延迟更新索引,极大提升写入性能
8、对于不会进行修改的表,支持压缩表,极大减少磁盘空间占用
InnoDB
InnoDB在MySQL 5.5后成为默认索引,它的特点是:
1、支持行锁,采用MVCC来支持高并发
2、支持事务
3、支持外键
4、支持崩溃后的安全恢复
5、不支持全文索引
10、nginx平滑升级
nginx平滑upgrade和普通reload的过程有区别,不能一概而论
在upgrade过程中,还涉及到3个信号(USR2、WINCH和QUIT)。
首先发送USR2信号给原master,原master进程会额外启动一个master进程和若干worker进程,新旧worker进程同时提供对外服务。
第二步发送WINCH信号,原worker进程停止服务并退出。
最后发送QUIT信号给原master使之退出,只保留新的master和worker。
PHP程序员面试要注意哪些问题
1、不准备经历方面的问题
一定要多花时间回忆你过去的相关经历,包括你参与的项目,你遇到的各种困难,以及如何解决的这些难题。你的回答会影响面试官对你技术能力的印象,所以一定要回顾和整理一下你过去的项目经历。
2、依赖于事先背诵的答案
试图通过事先背诵一些答案,然后在面试派上用场是一个非常不好的方法。首先,恰好能用上你背的答案的概率微乎其微,其次,这样的准备会花费你大量的时间和精力,而没有真正能力上的提高。记住,你在现场发挥的越好、越真实,你身上的价值就越高。
3、缺乏对面试的模拟
这是很显然的,做很多事情前你都要准备和模拟一下,防止意外的情况发生。PHP程序员面试也是一样的,如果你正在准备一个PHP程序员面试,你应该找一些可以和你一起准备的PHP程序员,你们一起模拟面试的场景,互相提问。
4、没有展现思考的过程
如果你在回答问题时很长时间不说话,就会让人理解为你无法解答这个问题。你不提供一个思考的过程,面试官就无法了解你的想法,不知道你是在思考还是被难住了。但是,如果你和面试官一直交谈,他就会了解你的想法,看到你的思维过程,这是很重要的。而且当你的思路有偏差时,面试官还可以引导你回到正确的解决方案中来。
5、写代码离不开编辑器
如果你要参加一个技术型的面试,面试官通常会要求你在白板/白纸上写代码,而不是在电脑上。所以,你不能过度依赖于代码编辑器,因为在那里它会帮你补充代码、显示出你的语法错误等。赶快拿出笔和纸,写下你的代码,当你满意自己在纸上写的程序的时候,再把它输入到电脑,让编译器验证它正确与否。
6、没有养成良好的编程习惯
不要因为你仅仅写了一个可以执行的程序,就以为自己已经做得很好了。你还要注意在程序中有没有重复的代码、混乱的数据结构、过度的空格等等。要像在实际的开发中一样,设计更有逻辑性的数据结构、有更好的框架、代码更整洁和易读。
7、不进行测试
当你的程序写完后,花点时间检查一下你的代码,以确保其中没有bug。如果是在用笔和纸来练习,就要把程序再写到编辑器中,让编译器帮助你检查。
8、总是着急忙慌
在解决问题时不要着急,否则只会导致更多的错误,显得你很粗心。要有条理和准确的的做事,经常回头看看你的代码,如果有错误就改正它们。
PHP语言特点
开源免费
PHP是一个受众大并且拥有众多开发者的开源软件项目,Linux + Nginx + Mysql + PHP是它的经典安装部署方式,相关的软件全部都是开源免费的,所以使用PHP可以节约大量的正版授权费用。不过PHP作为一个开源软件,它缺乏大型科技公司的支持背景,网络上对它的唱衰也是经久不衰,不过它的持续迭代和性能持续增强的现实却是鼓舞人心的,PHP社区用实际行动给予各种质疑强有力的回击。
快捷高效
PHP的内核是C语言编写的基础好效率高,可以用C语言开发高性能的扩展组件;PHP的核心包含了数量超过1000的内置函数,功能应有尽有很全面,开箱即用程序代码简洁; PHP数组支持动态扩容,支持以数字、字符串或者混合键名的关联数组,能大幅提高开发效率; PHP是一门弱类型语言,程序编译通过率高,相对其他强类型语言开发效率快;PHP天然热部署,在php-fpm运行模式下代码文件覆盖即完成热部署;PHP经过20多年的发展,在互联网上可以搜到海量的参考资料供参考学习。
性能提升
PHP版本越高它的整体性能越高,根据官方介绍,PHP7.0.0 对比PHP5.6性能就提升了2倍,PHP7.4已经比PHP7.0快了约30%,PHP8.0在性能上又相对PHP7.4大约改进了10%。PHP 8.0 引入了 JIT编译器特性,同时加入多种新的语言功能,例如命名参数、联合类型、注解、Constructor Property Promotion、match 表达式、nullsafe 运算符以及对类型系统、错误处理和一致性的改进。PHP拥有自己的核心开发团队,保持5年发布一个大版本、1个月发布2个小版本的频率,最新的版本是PHP8.08 。PHP 7.0.0 发布于2015-12-03,此版本下最新版本是PHP 7.4.21 (发布日期:2021-07-01),PHP 8.0.0 发布于2020-11-26,此版本下最新版本是PHP 8.0.8(发布日期:2021-07-01)。
跨平台
每个平台都有对应的php解释器版本,指针对不同平台均编译出目标平台的二进制码(PHP解释器),php开发的程序可以不经修改运行在windows、linux、unix等多个操作系统上。
常驻内存
php-cli模式下可以实现程序常驻内存,各种变量和数据库连接都能长久保存在内存 实现资源复用,比较常用的做法是结合swoole 组件编写cli框架。
页面生命周期
在php-fpm模式下,所有的变量都是页面级的,无论是全局变量还是类的静态成员,都会在页面执行完毕后被清空,对程序员水平要求低,占用内存非常少,特别适合中小型系统的开发。