PHP面试手册
PHP面试手册
薪资7~15k
岗位职责:
- 在现有源码的基础上二次开发和维护 PHP 项目,保证代码质量和稳定性;
- 设计和实现数据模型,并编写相应的 SQL 语句进行操作;
- 优化服务器资源并处理高并发访问;
- 参与前端技术选型、接口开发和数据传输等工作;
岗位要求
- 专科及以上学历,计算机、信息科学及相关专业毕业;
- 熟练掌握 PHP 开发语言及其框架(如 Laravel/Yii/ThinkPHP等);
- 熟悉 MySQL 数据库及其优化技巧,了解 Redis/MongoDB 等 NoSQL 数据库;
- 熟悉 HTML/CSS/JavaScript/jQuery 等前端技术,了解Vue/React/Angular 等前端框架;
- 了解Inmp环境部署.维护.了解rabbitmq队列优先.
- 具备良好的编码习惯和团队协作能力,具有高度责任心和自我驱动力。
- 基础
- 什么事面向对象?主要特征是什么?
面向对象是程序的一种设计方式,它利于提高程序的重用性,使程序结构更加清晰。主要特征:封装、继承、多态。
- SESSION 与 COOKIE的区别是什么,请从协议,产生的原因与作用说明?
http无状态协议,不能区分用户是否是从同一个网站上来的,同一个用户请求不同的页面不能看做是同一个用户;SESSION存储在服务器端,COOKIE保存在客户端。Session比较安全,cookie用某些手段可以修改,不安全;Session依赖于cookie进行传递。禁用cookie后,session不能正常使用。Session的缺点:保存在服务器端,每次读取都从服务器进行读取,对服务器有资源消耗。Session保存在服务器端的文件或数据库中,默认保存在文件中,文件路径由php配置文件的session.save_path指定。Session文件是公有的
- HTTP 状态中302、403、 500代码含义?
一二三四五原则:(即一:消息系列;二:成功系列;三:重定向系列;四:请求错误系列;五:服务器端错误系列。)302:临时转移成功,请求的内容已转移到新位置403:禁止访问 500:服务器内部错误 401:代表未授权
-
MyISAM和 InnoDB 的基本区别?索引结构如何实现?
- MyISAM类型不支持事务,表锁,易产生碎片,要经常优化,读写速度较快,适合用于频繁查询的应用;
- InnoDB类型支持事务,行锁,有崩溃恢复能力,读写速度比MyISAM慢,适合于插入和更新操作比较多的应用,空间占用大,不支持全文索引等。创建索引:alert table tablename add index 索引名 (`字段名`)
- 请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用?
按值传递:函数范围内对值的任何改变在函数外部都会被忽略按引用传递:函数范围内对值的任何改变在函数外部也能反映出这些修改优缺点:按值传递时,php必须复制值。特别是对于大型的字符串和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。
- 说说你对缓存技术的了解?
缓存技术是将动态内容缓存到文件中,在一定时间内访问动态页面直接调用缓存文件,而不必重新访问数据库。
- 现在编程中经常采取MVC三层结构,请问MVC分别指哪三层,有什么优点?
MVC三层分别指:业务模型、视图、控制器,由控制器层调用模型处理数据,然后将数据映射到视图层进行显示,优点是:①可以实现代码的重用性,避免产生代码冗余;②M和V的实现代码分离,从而使同一个程序可以使用不同的表现形式
- AJAX的优势是什么?
ajax是异步传输技术,可以通过javascript实现,也可以通过JQuery框架实现,实现局部刷新,减轻了服务器的压力,也提高了用户体验。
-
在程序的开发中,如何提高程序的运行效率?
- 优化SQL语句,查询语句中尽量不使用select *,用哪个字段查哪个字段;
- 少用子查询可用表连接代替;少用模糊查询;
- 数据表中创建索引;
- 对程序中经常用到的数据生成缓存。
-
对于大流量的网站,您采用什么样的方法来解决访问量问题?
- 有效使用缓存,增加缓存命中率;
- 使用负载均衡;
- 对静态文件使用cdn进行存储和加速;
- 想法减少数据库的使用
- 查看出现统计的瓶颈在哪里
- 反向代理
- include和require的区别? 为避免多次包含同一文件,可用什么语句代替它们?
区别:在失败的时候:include产生一个warning,而require产生直接产生错误中断require在运行前载入include在运行时载入代替:require_onceinclude_once;
- 简述php的垃圾收集机制?
php中的变量存储在变量容器zval中,zval中除了存储变量类型和值外,还有is_ref和refcount字段。refcount表示指向变量的元素个数,is_ref表示变量是否有别名。如果refcount为0时,就回收该变量容器。如果一个zval的refcount减1之后大于0,它就会进入垃圾缓冲区。当缓冲区达到最大值后,回收算法会循环遍历zval,判断其是否为垃圾,并进行释放处理
- 如何实现PHP的安全最大化?怎样避免SQL注入漏洞和XSS跨站脚本攻击漏洞?
基本原则:不对外界展示服务器或程序设计细节(屏蔽错误),不相信任何用户提交的数据(过滤用户提交)。
- 什么是 CSRF 攻击 ?XSS 攻击?如何防范?
CSRF,跨站请求伪造,攻击方伪装用户身份发送请求从而窃取信息或者破坏系统。讲述基本原理:用户访问A网站登陆并生成了cookie,再访问B网站,如果A网站存在CSRF漏洞,此时B网站给A网站的请求(此时相当于是用户访问),A网站会认为是用户发的请求,从而B网站就成功伪装了你的身份,因此叫跨站脚本攻击。
CSRF防范:A、合理规范api请求方式,GET,POSTB、对POST请求加token令牌验证,生成一个随机码并存入session,表单中带上这个随机码,提交的时候服务端进行验证随机码是否相同。
XSS,跨站脚本攻击。
防范:不相信任何输入,过滤输入
-
安全对一套程序来说至关重要,请说说在开发中应该注意哪些安全机制?
- 防远程提交;
- 防SQL注入,对特殊代码进行过滤;
- 防止注册机灌水,使用验证码。
- 什么是事务?及其特性?
事务:是一系列的数据库操作,是数据库应用的基本逻辑单位。
事务特性:A、原子性:即不可分割性,事务要么全部被执行,要么就全部不被执行。B、一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态C、隔离性。在事务正确提交之前,不允许把该事务对数据的任何改变提供给任何其他事务,D、持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。
- 索引的作用?和它的优点缺点是什么?
索引就一种特殊的查询表,数据库的搜索引擎可以利用它加速对数据的检索。它很类似与现实生活中书的目录,不需要查询整本书内容就可以找到想要的数据。索引可以是唯一的,创建索引允许指定单个列或者是多个列。缺点是它减慢了数据录入的速度,同时也增加了数据库的尺寸大小。
- 主键、外键和索引的区别?
定义:主键--唯一标识一条记录,不能有重复的,不允许为空外键--表的外键是另一表的主键, 外键可以有重复的, 可以是空值索引--该字段没有重复值,但可以有一个空值;
作用:主键--用来保证数据完整性外键--用来和其他表建立联系用的索引--是提高查询排序的速度;
个数:主键--主键只能有一个外键--一个表可以有多个外键索引--一个表可以有多个唯一索引
-
堆和栈的区别?
- 堆是程序运行期间动态分配的内存空间,你可以根据程序的运行情况确定要分配的堆内存的大小;
- 栈是编译期间就分配好的内存空间,因此你的代码中必须就栈的大小有明确的定义。
- 常用的魔术方法有哪些?举例说明
php规定以两个下划线(__)开头的方法都保留为魔术方法,所以建议大家函数名最好不用__开头,除非是为了重载已有的魔术方法。
-
- __construct() 实例化类时自动调用;
- __destruct() 类对象使用结束时自动调用;
- __set() 在给未定义的属性赋值的时候调用;
- __get() 调用未定义的属性时候调用;
- __isset() 使用isset()或empty()函数时候会调用;
- __unset() 使用unset()时候会调用;
- __sleep() 使用serialize序列化时候调用;
- __wakeup() 使用unserialize反序列化的时候调用;
- __call() 调用一个不存在的方法的时候调用;
- __callStatic()调用一个不存在的静态方法是调用;
- __toString() 把对象转换成字符串的时候会调用。
-
简述高并发网站解决方案。
- 前端优化(CND加速、建立独立图片服务器);
- 服务端优化(页面静态化、并发处理[异步|多线程]、队列处理);
- 数据库优化(数据库缓存[Memcachaed|Redis]、读写分离、分库分表、分区);
- Web服务器优化(负载均衡、反向代理)。
- PHP中的默认会话时间是什么?
php中的默认会话时间是直到浏览器关闭为止。
- TCP 和 UDP 的特点和区别?
都是属于传输层协议
-
- TCP面向连接,所以只能一对一;面向字节流传输;数据可靠,不丢失;全双工通信;
- UDP(根据TCP特点反记);无连接,支持一对一,一对多,多对多;面向保温传输;首部开销小,数据不一定可靠但是速度更快。
-
502 的原因及解决方法?
- fastcgi 缓冲区设置过小;
- php-cgi的进程数设置过少;
- max_requests(内存溢出或频繁重启);
- php执行时间超过nginx等待时间;
- fastcgi执行时间;
- nginx 负载均衡。
三种方式:DNS轮询、IP负债均衡、CDN。
- 限流机制。
方式:ip限流、接口令牌限流、用户限流、header动态token(前端加密,后端解密)。