PHP技术面试
大家后总结了一些面试题,后续遇到还会继续更新,如果有需要交流的可以私聊我。
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:能被同类和继承出的类的方法访问到。