PHP面试经常被问到的问题(附答案)

PHP 同时被 2 个专栏收录
10 篇文章 0 订阅
3 篇文章 0 订阅

回答问题时带上你自己的理解会更好。
倾情整理,希望每道题都可以举一反三,防止被面试官挖坑。

一、PHP方面的问题

1.什么是composer?以及composer是干什么用的?工作原理

composer是一个依赖管理工具,composer会帮你安装这些依赖的库文件;
比如composer可以解决自动加载类,不用你写过多的new。

2.PHP如何实现静态化

PHP的静态化分为:纯静态和伪静态。其中纯静态又分为:局部纯静态和全部纯静态。
PHP伪静态:利用Apache mod_rewrite实现URL重写的方法;
PHP纯静态,就是生成HTML文件的方式,我们须要开启PHP自带的缓存机制,即ob_start来开启缓存。

3.你了解设计模式吗?说下你最常用的设计模式

PHP常用六大设计模式

4.观察者模式是如何实现的?工厂模式是如何实现的?适配器模式是如何实现的?

观察者模式:定义了对象之间的一对多依赖,这样一来,当一个对象改变状态时,它的所有依赖者都会收到通知并且有所作为。即出版者+订阅者=观察者模式。

工厂模式 :将调用者和创建者分离,调用者直接向工厂类请求获取调用对象,减少代码耦合,提高系统的维护性和扩展性;
工厂模式应用场景:有多个产品类时就要用到工厂模式,比如在数据库连接中,我们可以采用多种数据库连接方法,有mysql扩展,mysqli扩展,PDO扩展等,在这种情况下我们可以一个扩展对应一个产品类,然后采用工厂模式。

适配器模式核心思想:把对某些相似的类的操作转化为一个统一的“接口”(这里是比喻的说话)–适配器,或者比喻为一个“界面”,统一或屏蔽了那些类的细节。适配器模式还构造了一种“机制”,使“适配”的类可以很容易的增减,而不用修改与适配器交互的代码,符合“减少代码间耦合”的设计原则。

5.PHP的优化方案

常用性能优化方案
1.使用单引号替换双引号,单引号在运行的时候不检查运行引号内部的变量,执行效率是双引号的两倍;
2.使用PHP内置的数组操作方法,PHP内置的数组操作方法的运行效率是自行编写代码的10倍以上;
3.使用字符串函数替换正则函数,例如:使用 str_replace 替换 preg_replace;
4.使用isset( a 5 ) 替 换 s t r l e n ( a{5})替换strlen( a5)strlen(a)>5;
5.require_once() 代价昂贵,include 文件时尽量使用绝对路径,因为它避免了PHP去 include_path 里查找文件的速度,解析操作系统路径所需时间会更少。
循环优化方案
1.在执行for循环之前确定最大循环数,不要把count/strlen/sizeof等每次都要重复做的但结果都一样的事情放到for循环的条件语句中,另外最好运用foreach代替for循环;
2.禁止在循环内部查询数据库,应将查询放在循环外部;
3.循环内部不宜使用@操作符;
4.循环内部不宜声明变量,尤其是大变量:对象,解决办法是循环之前预定义需要声明的变量。

6.说下你了解的session和cookie

(1)、存储位置不同:
cookie的数据信息存放在客户端浏览器上。
session的数据信息存放在服务器上;
(2)、存储容量不同:
单个cookie保存的数据<=4KB,一个站点最多保存20个Cookie。
对于session来说并没有上限,但出于对服务器端的性能考虑,session内不要存放过多的东西,并且设置session删除机制;
(3)、存储方式不同:
cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据。session中能够存储任何类型的数据,包括且不限于string,integer,list,map等。
(4)、隐私策略不同:
cookie对客户端是可见的,别有用心的人可以分析存放在本地的cookie并进行cookie欺骗,所以它是不安全的。
session存储在服务器上,对客户端是透明对,不存在敏感信息泄漏的风险。
(5)、有效期上不同:
开发可以通过设置cookie的属性,达到使cookie长期有效的效果。
session依赖于名为JSESSIONID的cookie,而cookie JSESSIONID的过期时间默认为-1,只需关闭窗口该session就会失效,因而session不能达到长期有效的效果。
(6)、服务器压力不同:
cookie保管在客户端,不占用服务器资源。对于并发用户十分多的网站,cookie是很好的选择。
session是保管在服务器端的,每个用户都会产生一个session。假如并发访问的用户十分多,会产生十分多的session,耗费大量的内存。
(7)、浏览器支持不同:
假如客户端浏览器不支持cookie:
cookie是需要客户端浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效。关于WAP上的应用,常规的cookie就派不上用场了。
运用session需要使用URL地址重写的方式。一切用到session程序的URL都要进行URL地址重写,否则session会话跟踪还会失效。
假如客户端支持cookie:
cookie既能够设为本浏览器窗口以及子窗口内有效,也能够设为一切窗口内有效。
session只能在本窗口以及子窗口内有效。
(8)、跨域支持上不同:
cookie支持跨域名访问。
session不支持跨域名访问

7.如何实现不基于session和cookie的用户认证。

将用户信息加密放到http的header部分,每次拿到http的时候,验证获取header的信息。

8.说下你目前框架所用到的核心概念

主要说下目前所用框架的好处以及为什么要用这个框架。
比如:免费的,代码开源,类库强大,易扩展,上手容易等等。

TP框架:
ThinkPHP(FCS)是一个轻量级的中型框架,是从Java的Struts结构移植过来的中文PHP开发框架。它使用面向对象的开发结构和MVC模式,并且模拟实现了Struts的标签库,各方面都比较人性化,熟悉J2EE的开发人员相对比较容易上手,适合php框架初学者。ThinkPHP的宗旨是简化开发、提高效率、易于扩展,其在对数据库的支持方面已经包括MySQL、MSSQL、Sqlite、PgSQL、 Oracle,以及PDO的支持。ThinkPHP有着丰富的文档和示例,框架的兼容性较强,但是其功能有限,因此更适合用于中小项目的开发。

Easyswoole框架:
EasySwoole是一款常驻内存型的分布式swoole框架,专为API而生,支持同时混合监听HTTP、WebSocket、自定义TCP、UDP协议,且拥有丰富的组件,例如协程 连接池、TP风格的协程ORM、协程微信SDK、协程支付宝SDK、协程Kafka客户端、协程ElasticSearch客户端、协程Consul客户端、协程Redis客户端、协程Apollo客户端、协程NSQ客户端、协程自定义队列、 协程Memcached客户端、协程视图引擎、JWT、协程RPC、协程SMTP客户端、协程HTTP客户端、协程Actor、Crontab定时器等诸多组件。让开发者以最低的学习成本和精力编写出多进程,可异步,高可用的应用服务。

9.什么是CSRF攻击,XSS攻击?如何防范

CSRF(Cross-site request forgery)跨站请求伪造,黑客建立一个伪造网站或发送邮箱带了一个正常URL链接来让正常用户访问,来让正常用户让自己浏览器里的COOKIE权限来执行一些非法请求,
如转账,提权等操作,
防范方法有,验证 HTTP Referer 字段;在请求地址中添加 token 并验证;
XSS攻击
主要将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。
防范方法:通过过滤是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数

10.你了解RESTful API吗?说说干什么用的。

RESTful API是REST风格的API,是一套用来规范多种形式的前端和同一个后台的交互方式的协议。RESTful API由后台也就是SERVER来提供前端来调用;前端调用API向后台发起HTTP请求,后台响应请求将处理结果反馈给前端。

11.设计的原则

一般认为遵从以下六大原则的代码是可扩展易维护高复用的代码:
(1)、单一职责原则
不要多管闲事。
(2)、开放封闭原则
对扩展开放,对修改封闭
(3)、里氏代换原则
子类可以实现父类的抽象方法,但不能覆盖父类的非抽象方法。
子类中可以增加自己特有的方法。
当子类的方法重载父类的方法时,方法的前置条件(即方法的形参)要比父类方法的输入参数更宽松。
当子类的方法实现父类的抽象方法时,方法的后置条件(即方法的返回值)要比父类更严格。
引自大话设计模式一书 p41
“里氏代换原则是Barbara Liskov 女士 在1988 年发表的【ASD】,具体的数学定义比较复杂,你可以查相关资料,它的白话翻译就是一个软件实体如果使用的是一个父类的话,那么一定适用于其子类,而且它观察不出父类对象和子类对象的区别,也就是说,在软件里面,把父类都替换成它的子类,程序的行为没有变化,简单地说,子类型必须能够替换掉它们的父类型【ASD】” .
里氏代换原则(LSP):子类型必须能替换掉它们的父类型。【ASD】
“这好像是学继承时就要理解的概念,子类继承了父类,所以子类就可以以父类的身份出现。”
“是的,我问你个问题,如果在面向对象设计时,一个鸟类,一个是企鹅类,如果鸟是可以飞的,企业是不会飞,那么企业是鸟吗?企鹅可以继承鸟这个类吗?”
“企鹅是一种特殊的鸟,尽管不能飞,但它也是鸟,当然可以继承。”
“哈,你上当了,我说的是在面象对象设计时,那又意味什么那?子类拥有父类所有非private的行为和属性。鸟会飞,而企鹅不会飞,尽管在生物学分类上,企鹅是一种鸟,但在编程世界里,企鹅不能以父类–鸟的身份出现,因为前提说所有鸟都能飞,企鹅飞不了,所以,企鹅不能继承鸟类。”
(4)、接口隔离原则

(5)、依赖倒转原则
(6)、迪米特法则–最少知道原则
这六大原则任何面向对象的语言都应该遵守,好的代码不一定是严格按照设计模式写的代码,如果你的代码符合这六大原则,那么你的代码就是好代码,所以这六大原则还是很重要的。

12.如何实现自动加载?不用composer如何实现?PSR-4是什么?

自动加载就是当我们在当前文件中实例化一个不存在的类时,调用自动加载机制引入相应的类文件。
注:自动加载有两种方式(都是php内置的),一种是通过__autoload(),另一种是通过spl_autoload_register()。

PSR是PHP Standards Recommendation的简称,制定的代码规范,简称PSR,是代码开发的事实标准。
PSR-4使代码更加规范,能够满足面向package的自动加载,它规范了如何从文件路径自动加载类,同时规范了自动加载文件的位置。

二、数据库方面

1.你知道nosql吗?你用的nosql都有哪些?

NoSQL 即非关系型数据库的统称
NoSQL其实就是关系型数据库的补充,就目前而言我们是不可能离开关系型数据库的,所以NoSQL就来弥补关系型数据库在某些情况下的不足。这里把常见的NoSQL分为4类:K-V类、文档型、列式存储型、全文搜索型。
我常用nosql主要有Redis、MongoDB、MemcacheDB;
为什么要用NOSQL? 为了处理超大量的数据。

2.mysql索引优化

索引其实是一种数据结构,其功能是帮助我们快速匹配查找到需要的数据行,是数据库性能优化最常用的工具之一。其作用相当于超市里的导购员、书本里的目录。
索引的类型:主键索引、唯一索引、普通索引、组合索引、全文索引;
索引一经创建不能修改,如果要修改索引,只能删除重建。
索引设计的原则
(1)适合索引的列是出现在where子句中的列,或者连接子句中指定的列;
(2)基数较小的类,索引效果较差,没有必要在此列建立索引;
(3)使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间;
(4)不要过度索引。索引需要额外的磁盘空间,并降低写操作的性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,这个时间就会越长。所以只保持需要的索引有利于查询即可。
注意事项:
a. 更新十分频繁的字段上不宜建立索引:因为更新操作会变更B+树,重建索引。这个过程是十分消耗数据库性能的。
b. 区分度不大的字段上不宜建立索引:类似于性别这种区分度不大的字段,建立索引的意义不大。因为不能有效过滤数据,性能和全表扫描相当。另外返回数据的比例在30%以外的情况下,优化器不会选择使用索引。
c. 业务上具有唯一特性的字段,即使是多个字段的组合,也必须建成唯一索引。虽然唯一索引会影响insert速度,但是对于查询的速度提升是非常明显的。另外,即使在应用层做了非常完善的校验控制,只要没有唯一索引,在并发的情况下,依然有脏数据产生。
d. 多表关联时,要保证关联字段上一定有索引。
e. 创建索引时避免以下错误观念:索引越多越好,认为一个查询就需要建一个索引;宁缺勿滥,认为索引会消耗空间、严重拖慢更新和新增速度;抵制唯一索引,认为业务的唯一性一律需要在应用层通过“先查后插”方式解决;过早优化,在不了解系统的情况下就开始优化。

3.mysql的优化方案

MYSQL 八大优化方案
(1)、选取最适用的字段属性
(2)、使用(JOIN)连接来代替子查询(Sub-Queries)
(3)、使用联合(UNION)来代替手动创建的临时表
(4)、事务
(5)、锁定表
(6)、使用外键
(7)、使用索引
(8)、优化的查询语句

4.mysql的事务

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句
一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。
原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

5.mysql的读写分离

数据量增多,单机的数据库不足以支撑业务,需要用到数据库集群。而读写分离,就是将数据库的读和写分离,对应到数据库一般就是主从数据库,一主一从或者一主多从;业务服务器把数据写到主数据库中,读操作都去从库读;主库会同步数据到从库,保证数据的一致性。
读写分离理解和实现相对简单,但是只能减少访问的压力,不能分担存储的压力,当数据增多是,查询的速度还是会很慢。这时候就需要用到分库分表了。
正常情况下,单机不能支撑业务时,才会用数据库集群,软件设计越简单的设计越好。
一般数据库的优化是,先优化一些查询操作,然后优化业务的逻辑,或者加入缓存,最后不行再用集群,最后再分库分表。

6.消息队列如何实现

从本质上说消息对列就是一个队列结构的中间件,也就是说消息放入这个中间件之后就可以直接返回,并不需要系统立即处理,而另外会有一个程序读取这些数据,并按顺序进行逐次处理。
也就是说当你遇到一个并发特别大并且耗时特别长同时还不需要立即返回处理结果,使用消息队列可以解决这类问题。

7.查询优化

一个查询的生命周期大致可以按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端。其中在“执行”阶段包含了大量为了检索数据到存储引擎的调用以及调用后的数据处理,包括排序、分组。
查询速度慢的原因在于:某些不必要的额外操作,某些操作被额外地重复很多次,某些操作执行得太慢。
优化查询的目的就是减少和消除这些操作所花费的时间。

8.msyql的存储引擎,以及各自的区别

InnoDB 是事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL5.5.5之后,InnoDB 作为默认的存储引擎,InnoDB 主要特性有:
支持事务
灾难恢复性好
为处理巨大数据量的最大性能设计
实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取
支持外键完整性约束。存储表中的数据时,每张表的存储都按逐渐顺序存放,如果没有显示在表定义时指定主键,InnoDB会为每一行生成一个6B的ROWID,并以此作为主键。
被用在众多需要高性能的大型数据库站点上
MyISAM 基于 ISAM 的存储引擎,并对其进行扩展。它是在Web、数据存储和其他应用环境下最常使用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事务。在 MySQL5.5.5 之前的版本中,MyISAM 是默认的存储引擎。MyISAM 主要特性有:
不支持事务
使用表级锁,并发性差
主机宕机后,MyISAM表易损坏,灾难恢复性不佳
可以配合锁,实现操作系统下的复制备份、迁移
只缓存索引,数据的缓存是利用操作系统缓冲区来实现的。可能引发过多的系统调用且效率不佳
数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能
可以把数据文件和索引文件放在不同目录
使用 MyISAM 引擎创建数据库,将产生3个文件。文件的名字以表的名字开始,扩展名指出文件类型:frm 文件存储表定义,数据文件的扩展名为 .MYD(MYData),索引文件的扩展名是 .MYI(MYIndex)。

9.redis和memcache有什么区别?redis使用场景有哪些?

Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储;
Redis支持数据的备份,即master-slave模式的数据备份;
Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用;
应用场景:
List:关注列表,粉丝列表,消息队列;
Set:Sets 集合的概念就是一堆不重复值的组合。利用Redis提供的Sets数据结构,可以存储一些集合性的数据,比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。

10.索引有哪些,你是如何做索引的?

从数据结构角度
(1)、B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理
(2)、hash索引:
a. 仅仅能满足"=",“IN"和”<=>"查询,不能使用范围查询
b. 其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引
c. 只有Memory存储引擎显示支持hash索引
(3)、FULLTEXT索引(现在MyISAM和InnoDB引擎都支持了)
(4)、R-Tree索引(用于对GIS数据类型创建SPATIAL索引)
从物理存储角度
(1)、聚集索引(clustered index)
(2)、非聚集索引(non-clustered index)
聚集索引和非聚集索引的区别如下:
  a) 聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致,聚集索引表记录的排列顺序与索引的排列顺序一致,优点是查询速度快,因为一旦
具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后。
  b) 聚集索引的缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索
引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,
降低了执行速度。非聚集索引指定了表中记录的逻辑顺序,但记录的物理顺序和索引的顺序不一致,聚集索引和非聚集索引都采用了B+树的结构,但非聚集索引的叶子层并不与实际的
从逻辑角度
(1)、主键索引:主键索引是一种特殊的唯一索引,不允许有空值
(2)、普通索引或者单列索引
(3)、多列索引(复合索引):复合索引指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用。使用复合索引时遵循最左前缀集合
(4)、唯一索引或者非唯一索引
(5)、空间索引:空间索引是对空间数据类型的字段建立的索引,MYSQL中的空间数据类型有4种,分别是GEOMETRY、POINT、LINESTRING、POLYGON。MYSQL使用SPATIAL关键字进行扩展,使得能够用于创建正规索引类型的语法创建空间索引。创建空间索引的列,必须将其声明为NOT NULL,空间索引只能在存储引擎为MYISAM的表中创建
CREATE TABLE table_name[col_name data type]
[unique|fulltext|spatial][index|key]index_name[asc|desc]
unique|fulltext|spatial为可选参数,分别表示唯一索引、全文索引和空间索引;
index和key为同义词,两者作用相同,用来指定创建索引
col_name为需要创建索引的字段列,该列必须从数据表中该定义的多个列中选择;
index_name指定索引的名称,为可选参数,如果不指定,MYSQL默认col_name为索引值;
length为可选参数,表示索引的长度,只有字符串类型的字段才能指定索引长度;
asc或desc指定升序或降序的索引值存储

11.如何分表

先说一下为什么要分表
当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,我想有可能会死在那儿了。分表的目的就在于此,减小数据库的负担,缩短查询时间。

(1)、做mysql集群,例如:利用mysql cluster ,mysql proxy,mysql replication,drdb等等
有人会问mysql集群,根分表有什么关系吗?虽然它不是实际意义上的分表,但是它启到了分表的作用,做集群的意义是什么呢?为一个数据库减轻负担,说白了就是减少sql排队队列中的sql的数量,举个例子:有10个sql请求,如果放在一个数据库服务器的排队队列中,他要等很长时间,如果把这10个sql请求,分配到5个数据库服务器的排队队列中,一个数据库服务器的队列中只有2个,这样等待时间是不是大大的缩短了呢?这已经很明显了。所以我把它列到了分表的范围以内,我做过一些mysql的集群:
linux mysql proxy 的安装,配置,以及读写分离
mysql replication 互为主从的安装及配置,以及数据同步
优点:扩展性好,没有多个分表后的复杂操作(php代码)
缺点:单个表的数据量还是没有变,一次操作所花的时间还是那么多,硬件开销大。

(2)、预先估计会出现大数据量并且访问频繁的表,将其分为若干个表
这种预估大差不差的,论坛里面发表帖子的表,时间长了这张表肯定很大,几十万,几百万都有可能。 聊天室里面信息表,几十个人在一起一聊一个晚上,时间长了,这张表的数据肯定很大。像这样的情况很多。所以这种能预估出来的大数据量表,我们就事先分出个N个表,这个N是多少,根据实际情况而定。以聊天信息表为例:

我事先建100个这样的表,message_00,message_01,message_02…message_98,message_99.然后根据用户的ID来判断这个用户的聊天信息放到哪张表里面,你可以用hash的方式来获得,可以用求余的方式来获得,方法很多,各人想各人的吧。下面用hash的方法来获得表名:

    <?php  
    function get_hash_table($table,$userid) {  
     $str = crc32($userid);  
     if($str<0){  
     $hash = "0".substr(abs($str), 0, 1);  
     }else{  
     $hash = substr($str, 0, 2);  
     }  
     return $table."_".$hash;  
    }  
    echo get_hash_table('message','user18991');     //结果为message_10  
    echo get_hash_table('message','user34523');    //结果为message_13  
    ?>  

说明一下,上面的这个方法,告诉我们user18991这个用户的消息都记录在message_10这张表里,user34523这个用户的消息都记录在message_13这张表里,读取的时候,只要从各自的表中读取就行了。
优点:避免一张表出现几百万条数据,缩短了一条sql的执行时间
缺点:当一种规则确定时,打破这条规则会很麻烦,上面的例子中我用的hash算法是crc32,如果我现在不想用这个算法了,改用md5后,会使同一个用户的消息被存储到不同的表中,这样数据乱套了。扩展性很差。

(3)、利用merge存储引擎来实现分表
我觉得这种方法比较适合,那些没有事先考虑,而已经出现了得,数据查询慢的情况。这个时候如果要把已有的大数据量表分开比较痛苦,最痛苦的事就是改代码,因为程序里面的sql语句已经写好了,现在一张表要分成几十张表,甚至上百张表,这样sql语句是不是要重写呢?
mysql>show engines;的时候你会发现mrg_myisam其实就是merge。
这样我就成功的将一张user表,分成了二个表,这个时候有一个问题,代码中的sql语句怎么办,以前是一张表,现在变成二张表了,代码改动很大,这样给程序员带来了很大的工作量,有没有好的办法解决这一点呢?办法是把以前的user表备份一下,然后删除掉,上面的操作中我建立了一个alluser表,只把这个alluser表的表名改成user就行了。但是,不是所有的mysql操作都能用的

三、服务器方面

1.说下一些你常用的linux命令

Linux常用命令大全

2.Linux如何搭建LAMP环境

(1)、检查系统环境
(2)、安装Apache、PHP、Mysql
(3)、安装基本常用扩展包
(4)、配置Apache、mysql开机启动
(5)、配置Mysql
(6)、测试环境

LAMP环境安装教程

3.你们平常工作的系统环境是在哪里?

Linux

4.你了解Docker吗?

严格来说,docker是一个容器引擎,用来管理和运行容器。除此之外还有其它类似软件,但是都没docker名气大,所以现在docker基本上等同于容器技术。

5.你说下常用的服务端口号

常用端口号:
IIS(HTTP):80
Https :443
SOCKS :1080
SQLServer:1433
Oracle:1521
MySQL:3306
FTP:21
SSH:22
Tomcat:8080
Telnet :23
SMTP :25
Redis:6379

四、前端知识

1.说下都有哪些跨域。

跨域指的是浏览器不能执行其他网站的脚本。它是由浏览器的同源策略造成的,是浏览器对javascript施加的安全限制。
同源就是指,域名,协议,端口均相同。

八种方式实现跨域请求

2.事件冒泡

事件冒泡 :当一个元素接收到事件的时候 会把他接收到的事件传给自己的父级,一直到window 。(注意这里传递的仅仅是事件 并不传递所绑定的事件函数。所以如果父级没有绑定事件函数,就算传递了事件 也不会有什么表现 但事件确实传递了。)

3.DOM事件流

事件流又称为事件传播,DOM2级事件规定的事件流包括三个阶段:事件捕获阶段(capture phase)、处于目标阶段(target phase)和事件冒泡阶段(bubbling phase)

首先发生的是事件捕获,为截获事件提供了机会。然后是实际的目标接收到事件,最后一个阶段是冒泡阶段,可以在这个阶段对事件做出响应

4.JS是如何实现继承的

JavaScript实现继承的方式是用原型链来实现的。由于每个构造函数都一个属性,指向一个原型对象,所以我们将原型对象等于另一个类型的实例,显然这时这个实例中有一个指向另一个原型的指针。如果这样一层一层的嵌套下去,就构成一个原型链。

5.正则表达式

邮箱正则表达式:

/^[A-Za-z\d]+([-_.][A-Za-z\d]+)*@([A-Za-z\d]+[-.])+[A-Za-z\d]{2,5}$/

手机号正则表达式

/^1[3456789]d{9}$/

五、算法和其它方面

1.最常用的排序算法

PHP排序算法

2.做一个微信抢红包的功能

<?php
/** * 
代码名称:简单的抢红包 示例 
*/ 
header("Content-Type: text/html;charset=utf-8");//防止中文乱码,你懂的 
$total=10;//总额 
$num=8;// 分成8个红包,支持8人随机领取 
$min=0.01;//每个人最少能收到0.01元 
for ($i=1;$i<$num;$i++) { 
    $safe_total=($total-($num-$i)*$min)/($num-$i);//随机安全上限 
    $money=mt_rand($min*100,$safe_total*100)/100; 
    $total=$total-$money; 
    echo '第'.$i.'个红包:'.$money.' 元,余额:'.$total.' 元 <br/>'; 
  } 
  echo '第'.$num.'个红包:'.$total.' 元,余额:0 元'; 
  // 输出结果如下 
  // 第1个红包:0.06 元,余额:9.94 元 
  // 第2个红包:1.55 元,余额:8.39 元 
  // 第3个红包:0.25 元,余额:8.14 元 
  // 第4个红包:0.98 元,余额:7.16 元 
  // 第5个红包:1.88 元,余额:5.28 元 
  // 第6个红包:1.92 元,余额:3.36 元 
  // 第7个红包:2.98 元,余额:0.38 元 
  // 第8个红包:0.38 元,余额:0 元

3.如何防止高并发

优化方案一:数据表的number字段类型设置为unsigned
优化方案二:使用mysql事务
优化方案三:使用非文件的排他锁
优化方案四:redis队列,因为pop操作是原子的

4.你用哪种版本控制?如何避免代码冲突

svn、git 每次代码提交时首先要更新本地代码

5.在浏览中输入网址后都发生了什么

点击查看

6.你了解socket吗?

点击查看

7.如果打开网页的时候白屏10秒才显示出页面,如果进行排查。

利用调试工具

六、其它,必问知识

1.说下你在项目中碰到的问题

这个问题是个坑,你回答不回答都不行,最好是从自己的实际工作中挑一到二个问题,说下是怎么解决的。

2.你是如何解决的问题的

遇到问题冷静对待,查询错误信息,针对性解决问题。

3.你未来的规划是什么?

慢慢丰富自己的专业知识,期望在一个公司里长期稳定的发展。

4.你为什么离职

主动离职,原因无非就是钱少、活多、离家远、晋升遇到瓶颈、行业发展慢、工作环境差、领导同事不好相处,等
被动离职,原因无非就是公司倒闭、裁员、末位淘汰等

5.你觉得你的领导会如何评价你

我虽然未必能做到八面玲珑,但是与人真诚相处是我一向的原则。和朋友相处我会比较随性自由,不计较一些得失,因此朋友们认为我是个有义气的人;同事间经常在工作上有合作,发生分歧时我会冷静处理,因此同事们说我是个理性的人;对于工作我始终都认真专注,能够让领导放心把工作交给我,因此领导评价我是一个负责的员工。我认为无论是朋友、同事还是领导,秉着真诚、和善的态度交流、沟通是基本原则。

6.说下你做得你公司最不错的项目,都用了哪些技术,对你带来了哪些成长

针对之前做过的项目进行描述

7.说下TCP的三次握手,为什么三次,两次不行吗?为什么挥手不是四次

采用三次握手是为了防止失效的连接请求报文段突然又传送到主机B,因而产生错误。失效的连接请求报文段是指:主机A发出的连接请求没有收到主机B的确认,于是经过一段时间后,主机A又重新向主机B发送连接请求,且建立成功,顺序完成数据传输。考虑这样一种特殊情况,主机A第一次发送的连接请求并没有丢失,而是因为网络节点导致延迟达到主机B,主机B以为是主机A又发起的新连接,于是主机B同意连接,并向主机A发回确认,但是此时主机A根本不会理会,主机B就一直在等待主机A发送数据,导致主机B的资源浪费。
TCP关闭链接四次握手原因在于tcp链接是全双工通道,需要双向关闭。client向server发送关闭请求,表示client不再发送数据,server响应。此时server端仍然可以向client发送数据,待server端发送数据结束后,就向client发送关闭请求,然后client确认。

php高级工程师面试题

  • 4
    点赞
  • 0
    评论
  • 33
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值