php面试题-待完善

面试总结

(一)索引

一、 索引类型

全文索引:fulltext
目前只有MyISAM引擎支持,其可以在创建表、更改表、创建索引使用, 目前只有char、varchar、text列上可以创建全文索引。
数据量较大时,现将数据放入一个没有全局索引得表中,然后在CREATE INDEX创建全文索引,要比先为一张表建立全文索引然后将数据写入的速度快很多。全文索引出现是为了解决like这类针对文本的模糊查询效率较低的问题。

哈希索引:hash
hash是一种key=》value形式的键值对,允许多个key对应相同的value,但不允许一个key对应多个value,由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。

B树形索引:BTREE
一种将索引值按一定的算法,存入一个树形的数据结构中,如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf

R树索引:RTREE

二、 哈希索引与树形索引的区别
1.hash索引仅仅能满足‘=’、‘in’、‘<=>’查询,不能使用范围查询,由于hash索引中存放的时经过hash计算后的hash值,所以只能用于等值的过滤,经过相应的hash算法处理之后额hash值的大小关系,并不能保证和hash运算前的完全一样。
2.hash索引无法被用来避免数据的排序操作,由于hash索引中存放的是经过hash计算后的hash值,而且hash值的大小关系并不一定和hash运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算。
3.hash索引不能利用部分索引键查询,对于组合索引,hash索引在计算hash值的时候时组合索引键合并后再一起计算hash值,而不是单独计算hash值,所以通过组合索引的前面一个或几个索引键进行查询的时候,hash左右也无法被利用。
4.hash索引在任何时候都不能避免表扫描,因为hash索引是将索引键通过hash运算之后,将hash运算结果的hash值和所对应的行指针信息存放于一个hash表中,由于不同的索引键存在相同的hash值,所以即使取满足某个hash键值的数据记录条数,也无法才从hash索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。
5.hash索引遇到大量的hash值相等的情况后性能并不一定就会比树索引高,对于选择性比较低的索引键,如果创建hash索引,那么将存在大量记录指针信息存于同一个hash值相关联,这样要定位某一条记录时就会非常麻烦,浪费多次表数据的访问,造成整体性能低下。

三、 索引失效
1.索引字段在条件中使用表达式或函数操作
2.索引字段在where中使用’!=’, ‘<>’、‘is null’、‘is not null’、‘not in’、‘in’中索引会失效
3.如果or前的条件中的列有索引,后面的没有,索引都不会被利用
4. 列类型是字符串类型,查询时一定要给值加引号,否则索引失效

(二)MYSQL优化
一、 SQL优化
1.尽量使用数字型字段
2.避免用select * 查询
3.合理建立索引
4.索引字段上避免进行运算,因为索引字段上进行运算索引会失效
5.避免使用!=、<>、is null、is not null、 in、not in等这样索引会失效
6.count优化,如:计算id>5的,常规sql:select count() from table where id > 5; 优化: select (select count() from table) - count(*) from table where id <= 5; 当没有where条件时直接查询所有会更快,因为mysql总是知道表的行数
7.合理使用exists,not exists字句
8.能够用between 就不要用in
9.能够用distinct就不用group by
二、防止SQL注入
1.检查变量数据类型和格式
2.过滤特殊符号
3.绑定变量,使用预编译语句
(三)Redis技术
二、 Redis和Memcache的区别
1.redis不仅仅支持简单的key=>value类型的数据,同时还提供list、set、zset、hash等数据结构的储存,
2.redis支持数据的备份,即master-slave模式(主从模式)的数据备份,
3.redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
三、 redis数据类型
1.string类型, 一个key对应一个value,
2.list类型,链表结构,主要功能是push、pop以及获取一个范围的所有值等,
3.set类型,集合类型,对集合操作有添加删除元素,有多个集合求交并差等操作,
4.sorted set类型,有序集合,比set多了一个权重参数score,使得集合元素能够按score进行有序排列,
5.hash类型,把一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般为json格式
四、 为什么使用redis
1.解决应用服务器的cpu和内存的压力
2.减少IO操作
3.关系型数据库的扩展性不强,难以改变表结构
五、 redis优点
1.nosql数据库没有关联关系,数据结构简单,拓展表比较容易
2.nosql读取速度快,对较大数据处理快
六、 redis适用场景
1.数据高并发读写
2.海量数据读写
3.对扩展性要求高的数据
七、 redis不适用场景
1.需要事务支持,因为非关系型数据库不支持事务
2.基于sql结构化查询储存,关系复杂
八、 redis使用场景
1.配合关系型数据库做高速缓存
一.缓存高频次访问数据,降低数据库IO操作
二.分布式架构,做session共享
2.可以持久化特定的数据
一.利用zset类型可以储存排行榜
二.利用list的自然时间排序储存最新的n个数据
九、 redis基础知识
1.端口:6379
2.默认16个数据库,下标从0开始
3.单线程:redis是单线程+IO多路复用,检查文件描述的就绪状态,memchache:多线程+锁

(四)进程和线程

一、 线程和进程
进程:指系统中正在运行的一个应用程序,程序一旦运行就是进程,更专业指程序执行时的一个实例,从内核的观点看,进程的目的就是担当分配系统资源(CPU时间、内存等)的基本单位。
线程:系统分配处理器时间资源的基本单元,或者说进程之内独立执行的一个单元执行流,
进程——资源分配的最小单位, 线程——程序执行的最小单位

二、 线程和进程区别
1.进程拥有独立的堆栈空间和数据段,每当启动一个新的进程必须分配给他独立的地址空间,建立众多数据表来维护代码段、堆栈段、数据段,多线程十分奢侈,系统开销比较大;线程拥有独立的堆栈空间,但是是共享数据段,彼此间使用相同的地址空间,共享大部分数据,比进程更节俭,开销小,切换速度快、效率高,但由于进程之间独立,所以进程比较安全,进程与进程之间在保护模式下不会产生影响,线程只是一个进程中的不同执行路径,一个线程死掉就等于整个进程死掉。
2.体现在通信机制上,因为进程之间互不干扰,相互独立,进程的通信机制相对复杂,如:管道、信号、消息队列、共享内存、套接字等通讯机制,线程由于共享数据段所以通信机制很方便;
3.体现CPU系统上,线程使得CPU系统更加有效,因为操作系统会保证当线程数不大于CPU数目时,不同的线程运行于不同的CPU上。

三、 多线程用在哪些地方
1.高并发地方,如订单状态修改、支付方面一般都用多线程
总之多线程就是为了充分利用cpu的资源,提高程序执行效率,当一个业务逻辑执行效率特别低、耗时特别长,就可以考虑多线程。
四、 多线程优点
1.使用线程可以把占据时间长的程序中的任务放到后台去处理
2.程序运行速度可能加快
3.多线程交替执行,减少或避免因程序阻塞或意外情况造成响应过慢,降低用户等待的概率

五、 多线程缺点
1.如果大量线程,影响性能,因为操作系统需要在他们之间切换,
2.更多的线程需要更多的内存空间
3.线程的中止需要考虑对其程序运行的影响
4.通常块模型数据是在多个线程间共享的,需要防止线程死锁情况发生
(五)Linux中Crontab定时器

Crontab定时器文件第一行必须是:#!/bin/bash 开头

Crontab定时器文件格式:分、时、日、月、周、命令;其中:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。

服务操作说明:
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
/sbin/service crond status //启动服务
常用命令:
Crontab –l :查看crontab定时任务列表
Crontab –e : 编辑定时任务
Crontab –r : 删除定时任务

面试题

 写出5个以上你所知道的常用Linux命令和它的功能
find / -name filename.text 查找文件
kill -9 进程号 终止进程
ls –al 查看文件列表,包含隐藏文件
pwd 当前工作目录
cp 复制文件
mkdir 创建目录
rmdir 删除目录
mv 移动文件
su –username 切换用户
chmod 777 filename 修改文件filename权限
vi 启动vi编辑器
df -hl 查看磁盘状况
touch 建立空文件
grep 在文件中查询内容

 PHP 中session 的运行机制

  1. session_start() 开启session
  2. 为session 赋值
  3. 写入session操作
  4. 销毁session
     大型网站中session方面应注意什么
  5. Session文件过多,消耗IO性能
    答:可以更改php.ini的session.save_handler 参数为redis或memcache等内存缓存数据库。
  6. Session同步问题
    前端可能有很多台服务器,用户在A服务器上登录了,有了session信息,然后访问网站某个页面跳转到B服务器上,如果B服务器上没有session信息又没有特殊处理,就可能会出现问题。
    解决方案:
  7. 更改php.ini的session.save_handler 参数为redis或memcache等内存缓存数据库
  8. 通过加密的cookie来实现,用户在A服务器上登录成功,在银行浏览器上种上一个加密的cookie,当用户访问B服务器时,检查有无session,如果有当然没问题,如果没有,就检查cookie是否有效,cookie有效就在B服务器上重建session。
  9. 如果使用负载均衡技术的话,可以在负载均衡那一层保持会话,把访问者绑定到某个服务器上,他的所有访问都在那个服务器上,就不需要session同步了,比如负载均衡中的ip_hash.

 简单描述mysql中索引、主键、唯一索引、联合索引的区别,对数据库的性能有什么影响(从读写两个方面)

索引类型:

  1. 普通索引:最基本的索引,没有任何约束限制
  2. 主键索引:与普通索引类似,但是具有唯一性约束
  3. 唯一索引:特殊的唯一索引,不允许有空值
  4. 联合索引:将多个列组合在一起创建,可以覆盖多个列
  5. 外键索引:只有innoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作
  6. 全文索引:MySql自带的全文索引只能用于MyISAM,并且只能对英文进行全文检索。

唯一索引与主键索引区别:

  1. 一个表只能有一个主键索引,可以有多个唯一索引
  2. 主键索引一定是唯一索引,唯一索引不一定是主键索引
  3. 主键可以与外键构成参照完整性约束,防止数据不一致

影响:

  1. 大大减少服务器需要扫描的数据量,(如数据表中有1000条数据,我们只需要根据条件查询其中一条,针对该列创建索引,只需扫描这一条即可,如果不创建索引,我们的扫描1000条)
  2. 帮助服务器避免排序和临时表的生成
  3. 将随机I/O变成顺序I/O
  4. 大大提高查询速度
  5. 降低写(增、删、改)的速度(由于对数据表进行写操作,会额外操作一遍索引),占用磁盘(本身索引也是一种数据)

 MYSQL索引创建原则

  1. 最适合索引的列是出现在where 子句中的列,或连接子句中的列,而不是出现在select关键字后面列(where/on后面的列)
  2. 索引列的基数越大,索引效果越好,
  3. 对字符串进行索引,应该制定一个前缀长度,可以节省大量的索引空间
  4. 根据情况创建复合索引,复合索引可以提高查询效率
  5. 避免创建过多索引,索引会额外占用磁盘空间,降低写操作效率
  6. 主键尽可能选择较短的数据类型(int/bigint),可以有效减少索引的磁盘占用,提高查询效率

 mysql外连接、内连接、自连接区别
外连接:左连接和右连接
左连接:select a., b. from a left join b on a.id = b.id; 会显示a表所有数据,b表满足条件的数据也会显示出来,没有满足条件的那一列就为null;其实左边表数据全部显示出来,右边表数据是根据条件显示出来。如下

右连接:select a., b. from a right join b on a.id = b.id;会显示b数据表中数据,a数据表满足关联条件的数据显示,没有满足null表示列;其实是右边表数据全部显示出来,但左边根据条件显示出来。

内连接:select a., b. from a inner join b on a.id = b.id;只有满足条件的数据显示出来,没有列为null值;其实就是相同的部分显示出来,其它不符合条件的删除。
自连接:select a., b. from a as s, a as s1 on s.id = s1.pid; 其实就是对一张表进行操作,

 说说下面这些协议的全称和中文解释SMTP、POP3、HTTP、FTP、DNS、HTTPS

  1. SMTP : (simple mail transfer protocal) 简单邮件传输协议 端口25

  2. POP3:(post office protocol) 简称pop3,即邮局协议 端口 110

  3. FTP : (file transfer protocol) 文件传输协议 端口号:21(控制端口),20(数据端口)

  4. DNS:(domain name system)域名解析协议 端口号 53

  5. HTTP:(hyper text transfer protocol)超文本传输协议 端口 80 范围:0——1023

  6. HTTPS:(hyper text transfer protocol secure)安全超文本传输协议 端口 443

  7. DHCP:动态主机配置协议 端口 67、68

  8. SNMP:简单网络管理协议 端口 161

  9. telnet:远程控制协议 端口 23
     列举一些自己在项目中用过的框架,并和一些主流的框架做一些简单的对比或是谈一下各个的优势和劣势

  10. ThinkPHP框架:轻量级的中型框架,面向对象的开发结构和mvc模式,
    优点:

  11. 易于上手,有丰富的中文文档学习成本低,社区活跃度高

  12. 框架兼容性较强,php4和php5完全兼容,完全支持utf8

  13. 适合中小项目开发
    缺点:

  14. 对Ajax的支持不是很好

  15. 目录结构有点混乱,

  16. 上手容易,深入学习较难

  17. Laravel框架
    优点:

  18. 设计思想先进,非常适合各种开发模式TDD,DDD、BDD

  19. 集合了php比较新的特性,各种设计模式,loc容器,依赖注入
    缺点:
    1.基于组件式框架,所有比较臃肿

  20. YII框架:一个基于组件的高性能php框架,用于开发大型web应用
    优点:

  21. 纯oop

  22. 用于大规模web应用

  23. 模型使用方便

  24. 开发速度快,运行速度也快,性能优异且功能丰富

  25. 使用命令行工具
    缺点:

  26. 文档实例比较少

  27. 英文太多

  28. 要求php技术精通,oop编程要熟练

  29. 对model层指导和考虑较少

  30. View并不是理想view,理想中view可能只是html代码,不会涉及php代码

 简单叙述下微信(支付宝)的支付流程,主要说一些关键操作和关键参数(也可以从给app提供的支付接口方面说)

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 、4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、下载 4使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合;、 4下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.m或d论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 、1资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值