美文网首页
PHP技术面试

PHP技术面试

作者: 安晓生 | 来源:发表于2021-08-28 12:30 被阅读0次

大家后总结了一些面试题,后续遇到还会继续更新,如果有需要交流的可以私聊我。

1.数据库如何优化?

区分场景使用不同的引擎。
(1)选取适当的字段,打字段设置为NOT NULL,在查询的时候数据库不用比较NULL;
(2)使用链接(join)代替子查询;
(3)使用联合(UNION)查询代替手动创建临时表;
(4)尽量减少使用(LIKE)关键字和通配符
(5)使用事务和外健

2.sql语句应该考虑哪些安全性?

1,防止sql注入,对特殊字符进行转义,过滤或者使用预编译sql语句绑定
2,使用最小权限原则,特别是不要使用root账户,微不同的动作或者操作建立不同的账户
3,当sql出错时,不要把数据库出错的信息暴露到客户端

3,对于大流量的网站,你会采用什么方法来解决访问量?

1,首先确认服务器硬件是否满足支持当前的流量;
2,优化数据库的访问;
3,禁止外部盗链;
4,控制大文件下载;
5,使用不同的主机分流;
6,使用流量分析统计;

4,mysql 引擎中的MyISAM与InnoDB的区别理解?

InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

5,MySQL8.0的倒序索引是没什么

1,使用desc 的时候,你可以使用MySQL语句explanin进行分析 icp是使用了倒序索引。

MyISAM与InnoDB的区别是什么?

1,存储结构

MyISAM:每个MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型。.frm文件存储表定义。数据文件的扩展名为.MYD (MYData)。索引文件的扩展名是.MYI (MYIndex)。
InnoDB:所有的表都保存在同一个数据文件中(也可能是多个文件,或者是独立的表空间文件),InnoDB表的大小只受限于操作系统文件的大小,一般为2GB。

2、 存储空间

MyISAM:可被压缩,存储空间较小。支持三种不同的存储格式:静态表(默认,但是注意数据末尾不能有空格,会被去掉)、动态表、压缩表。
InnoDB:需要更多的内存和存储,它会在主内存中建立其专用的缓冲池用于高速缓冲数据和索引。

3、 可移植性、备份及恢复

MyISAM:数据是以文件的形式存储,所以在跨平台的数据转移中会很方便。在备份和恢复时可单独针对某个表进行操作。
InnoDB:免费的方案可以是拷贝数据文件、备份 binlog,或者用 mysqldump,在数据量达到几十G的时候就相对痛苦了。

4、 事务支持

MyISAM:强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。
InnoDB:提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

5、 AUTO_INCREMENT

MyISAM:可以和其他字段一起建立联合索引。引擎的自动增长列必须是索引,如果是组合索引,自动增长可以不是第一列,他可以根据前面几列进行排序后递增。
InnoDB:InnoDB中必须包含只有该字段的索引。引擎的自动增长列必须是索引,如果是组合索引也必须是组合索引的第一列。

6、 表锁差异

MyISAM:只支持表级锁,用户在操作myisam表时,select,update,delete,insert语句都会给表自动加锁,如果加锁以后的表满足insert并发的情况下,可以在表的尾部插入新的数据。
InnoDB:支持事务和行级锁,是innodb的最大特色。行锁大幅度提高了多用户并发操作的新能。但是InnoDB的行锁,只是在WHERE的主键是有效的,非主键的WHERE都会锁全表的。

7、 全文索引

MyISAM:支持 FULLTEXT类型的全文索引
InnoDB:不支持FULLTEXT类型的全文索引,但是innodb可以使用sphinx插件支持全文索引,并且效果更好。

8、 表主键

MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址。
InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

9、 表的具体行数

MyISAM:保存有表的总行数,如果select count() from table;会直接取出出该值。
InnoDB:没有保存表的总行数,如果使用select count(
) from table;就会遍历整个表,消耗相当大,但是在加了wehre条件后,myisam和innodb处理的方式都一样。

10、 CURD操作

MyISAM:如果执行大量的SELECT,MyISAM是更好的选择。
InnoDB:如果你的数据执行大量的INSERT或UPDATE,出于性能方面的考虑,应该使用InnoDB表。DELETE 从性能上InnoDB更优,但DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除,在innodb上如果要清空保存有大量数据的表,最好使用truncate table这个命令。

11、 外键

MyISAM:不支持
InnoDB:支持
通过上述的分析,基本上可以考虑使用InnoDB来替代MyISAM引擎了,原因是InnoDB自身很多良好的特点,比如事务支持、存储 过程、视图、行级锁定等等,在并发很多的情况下,相信InnoDB的表现肯定要比MyISAM强很多。另外,任何一种表都不是万能的,只用恰当的针对业务类型来选择合适的表类型,才能最大的发挥MySQL的性能优势。如果不是很复杂的Web应用,非关键应用,还是可以继续考虑MyISAM的,这个具体情况可以自己斟酌。

Redis 和 memache 缓存的区别

1.数据类型

Redis数据类型丰富,支持set list等类型
memcache支持简单数据类型,需要客户端自己处理复杂对象

2.持久性

redis支持数据落地持久化存储
memcache不支持数据持久存储

3.分布式存储

redis支持master-slave复制模式
memcache可以使用一致性hash做分布式
value大小不同
memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用

4.数据一致性不同

redis使用的是单线程模型,保证了数据按顺序提交。
memcache需要使用cas保证数据一致性。CAS(Check and Set)是一个确保并发一致性的机制,属于“乐观锁”范畴;原理很简单:拿版本号,操作,对比版本号,如果一致就操作,不一致就放弃任何操作

5.cpu利用

redis单线程模型只能使用一个cpu,可以开启多个redis进程

总结:Redis跟memcached区别

  • 1.Redis中,并不是所有的数据都一直存储在内存中的,这是和Memcached相比一个最大的区别。

  • 2.Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。

  • 3.Redis支持数据的备份,即master-slave模式的数据备份。

  • 4.Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
    我个人认为最本质的不同是Redis在很多方面具备数据库的特征,或者说就是一个数据库系统,而Memcached只是简单的K/V缓存

redis和memecache的不同在于:

1、存储方式:

memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。

2、数据支持类型:

redis在数据支持上要比memecache多的多。

3、使用底层模型不同:

新版本的redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4、运行环境不同:

redis目前官方只支持Linux 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上

memcache只能当做缓存,cache

redis的内容是可以落地的,就是说跟MongoDB有些类似,然后redis也可以作为缓存,并且可以设置master-slave

Redis类型场景作用

1,List 并发量很低用队列做秒杀(守护进程----业务复杂度高)(代码)---网盘中
2,Set(集合) 社交,用户标签,统计
3,Zset(有序)(score 权重) 商品、等排行数据、智能推荐、共同兴趣爱好
4,geo(3.2+)地图空间
5,storm(5.0)
6,bitmap (O2O(位置功能)- 地图)

Redis6的淘汰策略有那些:

noeviction:不删除策略,达到最大内存限制时,如果需要更多内存,
直接返回错误信息。大多数写命令都会导致占用更多的内存(有极少数
会例外。
LRU算法我: allkeys-lru:所有 key通用;优先删除最近最少使用(less recently used ,LRU)的key。
volatile-lru:只限于设置了expire的部分;优先删除最近最少使
用(less recently used ,LRU) 的key。
随机淘汰: allkeys-random:所有key通用;随机删除一部分key。volatile-random: 只限于设置了expire 的部分;随机删除一部分key。volatile-ttl: 只限于设置了expire的部分;优先删除剩余时间(time to live, TTL) 短的key。

Redis分布式锁?

1,先拿setnx来争抢锁,抢到之后,再用expire给锁加上一个过期时间,防止锁忘记释放,如果setnx之后执行,expire之前的进程意外crash,或者需要重启维护,那么就会产生死锁。
2.那么上面的方式就不太实用了,我们换成:set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用。

Redis做异步队列

1,一般实用list结构作为队列,rpush生成消息,lpop消费消息,当lpop没有消息的时候,要适当sleep,一会在重新试,缺点:在消费者下线的情况下,生产的消息会会丢失,得使用专用的消息队列如果rabbitmq,kafka等,能不能生产一次消费多次呢?使用pub/sub主题的订阅者模式,可以实现1:N的消息队列。

Redis中海量数据的正确操作方式

1.利用SCAN系列命令(SCAN,SSCAN,HSCAN,ZSCAN)完成数据迭代。

Redis集群原理。

1,Redis sentinal 着眼于高可用,在master宕机的时候会自动蒋slave提示为master,继续提供服务,Redis cluster着眼于扩展性,在单个redis内存不足时,使用cluster进行分片储存。

怎么理解Redis事务?

1,事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。事务是一个原子操作: 事务中的命令要么全部被执行,要么全部都不执行。

如果有大量的key需要设置同- -时间过期,一般 需要注意什么?

1,如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis 可能会出现短暂的卡顿现象。-般需要在时间,上加一个随机值,使得过期时间分散-一些。

PHP的垃圾回收机制是什么?

php5和php7的垃圾回收机制都是利用引用计数。

在zval结构体中定义了ref_count和is_ref , ref_count是引用计数 ,标识此zval被多少个变量引用 , 为0时会被销毁。

TCP跟HTTP 有什么区别吗?

答:TCP的三次握手,IP协议
第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认;

第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。

HTTP:HTTP协议即超文本传送协议(Hypertext Transfer Protocol ),是Web联网的基础,也是手机联网常用的协议之一,HTTP协议是建立在TCP协议之上的一种应用。

HTTP连接最显著的特点是客户端发送的每次请求都需要服务器回送响应,在请求结束后,会主动释放连接。从建立连接到关闭连接的过程称为“一次连接”。

TCP/IP有几层:

答:总共分为4层。链路层,网络层,传输层,应用层。

PHP的面向对象特征是什么:

答:封装,继承,多态。
1.1:什么是多态?多态的含义是什么?
当父类引用了子列的实例的时候, 由于子类从新编写了父类,父类的方法不同,这样是多态。

TCP跟UDP的区别是什么?

1,TCP:面向链接的。
2,UDP:无链接的,即发送数据,不需要进行链接。

安全方面:

1,tpc:稳定性,无差别, 不丢失,不重复,按序到达。
2,最大努力交付,容易丢包,不保证完全交付。

传输区别

TCP相对较低,
UDP相对较高

链接数量区别

TCP:一对一,点对点。
UDP:一对一,点对点,一对多。

Redis的持久化有几种。

答:2种,一种日志储存在文件中,一种快照方式,储存在磁盘上。

PHP与Nginx如何交互?

fastcgi进行通信。

PHP控制类中方法的访问权限

1.访问方式:

PHP5提供了3种访问方式:

(1)public:可以被毫无限制地访问,类外部的任何代码都可以读写public属性,在PHP5之前的版本中,所有的方法和属性都是public。

(2)private:只在类的内部可见,类中的任何成员和类实例都可以访问private成员,在所在类之外,不能改变或者读取private属性的值,也不能调用private的方法。子类也不能访问父类的private成员。

(3)protected:能被同类和继承出的类的方法访问到。

相关文章

  • PHP技术面试

    大家后总结了一些面试题,后续遇到还会继续更新,如果有需要交流的可以私聊我。 1.数据库如何优化? 区分场景使用不同...

  • PHP面试之HR喜欢问哪些与技术无关的问题

    PHP面试时,除了技术领域,HR面试官还喜欢问一些与技术无关的问题,这些问题背后代表了什么?如何应对?这都是我们要...

  • 中级面试

    PHP中级面试经历 - 耕毅 - 博客园 PHP中级程序员常见面试题 - CSDN博客 初中级 PHP 面试基础汇...

  • PHP 笔试 + 面试题

    本章主要介绍常见的 PHP 笔试 + 面试题,包括: 基础及程序题 数据库技术题 综合技术题 项目及设计题 基础及...

  • php面试:NULL

    php在线面试题集:http://cainiaophp.com/php面试讨论群:536633782

  • 1.1课程介绍

    这是基于慕课网 360大牛 讲解的PHP面试视频 各大企业常见php面试题 面试考点 考官考查思路 复习PHP...

  • PHP面试题汇总希望对PHPer们有所帮助

    PHP面试题汇总 视频版: 1.《最新PHP面试视频教程》 http://www.php.cn/course/87...

  • 零碎知识点

    PHP面试整理

  • PHP的垃圾回收机制-PHP高级面试题+详解

    面试10家公司,收获9个offer,2020年PHP 面试问题 ps:本篇内容包括精选面试题与知识篇。 PHP面试...

  • PHP面试相关知识树

    以下是自己根据《PHP程序员面试笔试宝典》、《PHP程序员面试笔试真题解析》书籍整理到的一些关于PHP面试相关的知...

网友评论

      本文标题:PHP技术面试

      本文链接:https://www.haomeiwen.com/subject/ywkdiltx.html