本文目录导航:
2020年PHP 面试问题(二)
CGI(通用网关接口)用于WEB服务器和应用程序间的交互,定义输入输出规范,用户请求通过WEB服务器转发给FastCGI进程,FastCGI进程调用应用程序进行处理,如php解析器,处理结果如html返回给FastCGI,FastCGI再返回给Nginx进行输出。
假设WEB服务器是Nginx,应用程序是PHP,而php-fpm是管理FastCGI的,这就是它们之间的关系。
FastCGI用于提高CGI程序性能,启动一个master,再启动多个worker,不需要每次解析。
而php-fpm实现了FastCGI协议,是FastCGI进程管理器,支持平滑重启,可以启动时预先生成多个进程。
memcache和Redis的区别在数据结构方面,memcache仅支持简单的key-value形式,而Redis支持更复杂的数据类型如字符串、集合、列表、散列和有序集合。
多线程方面,memcache支持多线程,而Redis支持单线程。
持久化方面,Redis支持持久化,memcache不支持。
分布式方面,Redis使用主从结构,memcache需要通过哈希一致性来支撑主从结构。
实际运用中,Redis和memcache可以结合使用,memcache可用作session的存储方式,session是键值对的形式。
Redis和Memcache的区别在于,Redis中并非所有数据都存储在内存中,这是它们最大的区别。
Redis具有数据库特征,而Memcache只是简单的键值对缓存。
它们都需要集群扩展,实现方式为master-slave或哈希。
在100k以上的数据中,Memcache性能高于Redis。
如果内存使用效率是关键,Memcache在简单键值存储时效率更高,而Redis使用哈希结构时,组合式压缩使内存利用率高于Memcache,这取决于应用场景和数据特性。
Redis持久化特性包括RDB和AOF,AOF文件记录所有写操作命令,适用于数据完整性和同步需求。
Redis消息队列的实现通常使用列表,先进先出,但如果需要优先处理某些任务,可以通过将任务放入队列头部实现,获取任务时从队列尾部弹出,先处理高优先级任务。
使用两个队列,一个为高优先级任务队列,一个为普通任务队列,使用BRPOP命令按顺序从多个队列中取值,可以优先处理高优先级任务。
Redis防止高并发的方法主要在客户端,使用连接池并采用内部锁synchronized,服务器层面利用setnx实现锁机制。
单线程机制导致高并发对同一个键的操作排队处理,可能造成请求超时,远程访问时出现延迟返回问题。
SQL语句优化包括:Where子句中优先处理可以过滤掉最大数量记录的条件,避免使用计算在索引列上,避免使用NULL值判断,避免在Where子句中进行表达式操作,尽量避免全表扫描,优先考虑索引列,避免NULL值判断导致的引擎放弃使用索引。
2020年PHP最新面试题(含答案)
数据库设计经验,为何进行分表与分库?通常开始分表与分库的数据量是在几百万条记录以上,以减少数据库的负担,缩短查询时间。
数据库中的数据量往往无法控制,在未分库分表前,随着业务发展,表的增加与数据量的膨胀,数据操作效率将下降。
分库分表则能减轻数据库负担,提升效率,尤其是提高表的增删改查效率。
分表方案包括集群部署,通过分散SQL请求到多个数据库服务器来缩短等待时间。
垂直分割是按字段分表,水平分割则是按记录分表。
集群部署的优势在于扩展性好,但硬件开销大,且单表数据量不变。
数据库优化涉及SQL优化原则,包括减少BLOCK读取次数,调整不良SQL,检查子查询,优化索引使用,避免SELECT *查询,前移过滤条件,使用索引覆盖查询,避免COUNT和TOP查询,使用内层限定原则,避免ORDER BY中使用表达式,限制多表关联查询,避免IN和OR操作,使用<、>代替<、>,优化字段属性,如减少CHAR字段长度,使用MEDIUMINT代替BIGINT,尽可能将字段设置为NOTNULL,使用ENUM类型以提高性能。
缓存策略包括浏览器缓存、代理服务器缓存和网关缓存,用于提高数据访问速度。
对于大文件处理,可以采用流式读取方法,逐块处理以减少内存负担。
PHP的生命周期包括模块初始化、请求初始化、请求处理、请求关闭和模块关闭。
在CLI模式下,每个脚本完整执行这五大阶段;而在FastCGI模式下,只执行初始化阶段,后续请求通过处理请求、关闭请求和关闭模块阶段完成。
PHP的垃圾回收机制基于引用计数,当对象的引用计数为0时,对象可被回收。
对象的引用计数在修改变量、函数返回和unset变量时减少。
数组和对象可能存在循环引用导致无法回收,PHP通过将引用计数减少的数组或对象放入垃圾收集器处理。
PHP7相对于PHP5的改进包括性能提升、内存消耗降低、新增标量类型声明、64位支持、异常层次改进、异常范围扩大、安全随机数发生器、移除旧SAPI和扩展、添加空合并运算符、支持返回和参数类型声明、匿名类和零成本断言。
MongoDB适合高写入负载、高可用性、大数据量存储、基于位置的数据查询和表结构不明确的场景。
其支持副本集、索引和自动分片,能够快速响应单节点故障,适合不稳定环境。
PHP短信验证码防刷机制包括时间限制、手机号限制、短信验证码限制、前后端校验、唯一性限制、产品流程限制、图形验证码限制、IP及Cookie限制和短信预警机制。
方法多样,但需综合考虑以防止绕过。
高并发系统设计需要关注数据库优化、使用缓存减少IO、分布式数据库与缓存、服务器负载均衡等。
控制反转(IOC)与依赖注入(DI)模式有助于组件解耦与管理依赖。
对于大数据库与小Redis存储,通过Redis的淘汰策略,如volatile-lru、volatile-ttl等,确保存储的数据为热点数据。
PHP中高级面试题 – 第一天
一、写一个函数,获取一篇文章内容中的全部图片,并下载
XSS:跨站脚本攻击,可以通过对内容转义和过滤来防范,还有 CSP
三、应用中我们经常会遇到在 user 表随机调取 10 条数据来展示的情况,简述你如何实现该功能。
四、MYSQL 中主键与唯一索引的区别
主键:绝对不能有空值。唯一索引:可以有空值
五、http 与 https 的主要区别
关键是 S 上。
简而言之,https 建立连接后要先把 SSL 的证书发下去,有了公钥和私钥,就可以解密了。
六、两台 mysql 服务器,其中一台挂了,怎么让业务端无感切换,并保证正常情况下讲台服务器的数据是一致的
不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。
如果是核心业务的话,现在所有的操作都在正常的状态机器上。
把好的这台机器的备机拉起来,当主机。
以上全是应急操作。
实际上数据库的容灾设计要复杂得多。
面试官要是问你,备机的数据不一致怎么办,你要勇敢怼回去,你们每秒多少写入操作。
按照百万级表,每秒 1000 的写入效率,正常的设计是,分布在 2 台机器上每台 500。
这个级别的数据同步,出现差异的概率 可以忽略不计的。
有一台出现问题,另一台也可以抗住。
(正常的操作,还是先停写,等数据一致,切换,开写。
我们公司搞这些切换都是在凌晨 4.00 左右,核心业务的每秒写操作,只有十几个。
前后耽搁不到 20 秒)。
七、10 瓶水,其中一瓶有毒,小白鼠喝完有毒的水之后,会在 24 小时后死亡,问:最少用几只小白鼠可以在 24 小时后找到具体是哪一瓶水有毒。
答案:四只二进制问题。
薛定谔的老鼠。
一只老鼠有两个状态,死活,对应 01。假设老鼠的个数为 A,则有 2^A>=10; A=4;
思路很简单,十瓶药编号:0,1,10,11….1001;
0 不喝。
第一只老鼠喝所有个位是 1 的,第二只喝十位是 1 的,第三只和百位是 1 的,第四只喝千位是 1 的。
24 小时后,看下死了的是 1,活着的是 0。
按老鼠的顺序乖乖站好…… 假如第一只和第三只死了,那就是 0101,就是 5 有问题。
评论(0)