PHP面试经常被问到的知识点汇总(转载,已有链接)

 

如果你现在处于以下几种状态,本资料非常适合你:

  • 准备换工作,不知道从哪开始准备

  • 技术遇到瓶颈,不知道该学什么

  • 准备学 PHP,但不知道领域有多深

基础篇

  • 了解大部分数组处理函数

  • 字符串处理函数 区别 mb_ 系列函数    

    带mb的函数并不是PHP内置函数,需要修改php.ini,开启 php_mbstring

    mb是Multibyte的简写,用来处理多字节的,一般汉语,韩语,日语中用替换的话,一般用mb_replace,然后指定字符集;

  • & 引用,结合案例分析

  • == 与 === 区别

  • isset 与 empty 区别

  • 全部魔术函数理解

  • static、$this、self 区别

  • private、protected、public、final 区别

  • OOP 思想

  • 抽象类、接口 分别使用场景

  • Trait 是什么东西

  • echo、print、print_r 区别(区分出表达式与语句的区别)

  • __construct 与 __destruct 区别

  • static 作用(区分类与函数内)手册 、SOF

  • __toString() 作用

  • 单引号'与双引号"区别

  • 常见 HTTP 状态码,分别代表什么含义

  • 301 什么意思 404 呢?

进阶篇

  • Autoload、Composer 原理 PSR-4 、原理

  • Session 共享、存活时间

  • 异常处理

  • 如何 foreach 迭代对象

  • 如何数组化操作对象 $obj[key];

  • 如何函数化对象 $obj(123);

  • yield 是什么,说个使用场景 yield

  • PSR 是什么,PSR-1, 2, 4, 7

  • 如何获取客户端 IP 和服务端 IP 地址

    • 客户端 IP

    • 服务端 IP

    • 了解代理透传 实际IP 的概念

  • 如何开启 PHP 异常提示

    • php.ini 开启 display_errors 设置 error_reporting 等级

    • 运行时,使用 ini_set(k, v); 动态设置

  • 如何返回一个301重定向

    • [WARNING] 一定当心设置 301 后脚本会继续执行,不要认为下面不会执行,必要时使用 die or exit

  • 如何获取扩展安装路径

    • phpinfo(); 页面查找 extension_dir

    • 命令行 php -i |grep extension_dir

    • 运行时 echo ini_get('extension_dir');

  • 字符串、数字比较大小的原理,注意 0 开头的8进制、0x 开头16进制

    • 字符串比较大小,从左(高位)至右,逐个字符 ASCII 比较

  • BOM 头是什么,怎么除去

    • 0xEF,0xBB,0xBF

    • 检测、去除

  • 什么是 MVC

  • 依赖注入实现原理

  • 如何异步执行命令

  • 模板引擎是什么,解决什么问题、实现原理(Smarty、Twig、Blade)

  • 如何实现链式操作 $obj->w()->m()->d();

  • Xhprof 、Xdebug 性能调试工具使用

  • 索引数组 [1, 2] 与关联数组 ['k1'=>1, 'k2'=>2] 有什么区别

  • 缓存的使用方式、场景

实践篇

  • 给定二维数组,根据某个字段排序

  • 如何判断上传文件类型,如:仅允许 jpg 上传

  • 不使用临时变量交换两个变量的值 $a=1; $b=2; => $a=2; $b=1;

  • strtoupper 在转换中文时存在乱码,你如何解决?php echo strtoupper('ab你好c');

  • Websocket、Long-Polling、Server-Sent Events(SSE) 区别

  • "Headers already sent" 错误是什么意思,如何避免

算法篇

  • 快速排序(手写)

  • 冒泡排序(手写)

  • 二分查找(了解)

  • 查找算法 KMP(了解)

  • 深度、广度优先搜索(了解)

  • LRU 缓存淘汰算法(了解,Memcached 采用该算法)

数据结构篇(了解)

  • 堆、栈特性

  • 队列

  • 哈希表

  • 链表

对比篇

  • Cookie 与 Session 区别

  • GET 与 POST 区别

  • include 与 require 区别

  • include_once 与 require_once 区别

  • Memcached 与 Redis 区别

  • MySQL 各个存储引擎、及区别(一定会问 MyISAM 与 Innodb 区别)

  • HTTP 与 HTTPS 区别

  • Apache 与 Nginx 区别

  • define() 与 const 区别

  • traits 与 interfaces 区别 及 traits 解决了什么痛点?

  • Git 与 SVN 区别

数据库篇

  • MySQL

    • 索引、联合索引(命中条件)

    • 分库分表(水平分表垂直分表

    • 分区

    • 会使用 explain 分析 SQL 性能问题,了解各参数含义

    • Slow Log(有什么用,什么时候需要)

    • 重点理解 typerowskey

    • CRUD

    • JOIN、LEFT JOIN 、RIGHT JOIN、INNER JOIN

    • UNION

    • GROUP BY + COUNT + WHERE 组合案例

    • 常用 MySQL 函数,如:now()、md5()、concat()、uuid()等

    • 1:11:nn:n 各自适用场景

    • 了解触发器是什么,说个使用场景

    • 数据库优化手段

  • MSSQL(了解)

    • 查询最新5条数据

  • NOSQL

    • 持久化

    • 支持多钟数据类型

    • 可利用 CPU 多核心

    • 内存淘汰机制

    • 集群 Cluster

    • 支持 SQL

    • 性能对比

    • 支持事务

    • 应用场景

    • Redis、Memcached、MongoDB

    • 对比、适用场景(可从以下维度进行对比)

    • 你之前为了解决什么问题使用的什么,为什么选它?

服务器篇

  • 查看 CPU、内存、时间、系统版本等信息

  • find 、grep 查找文件

  • awk 处理文本

  • 查看命令所在目录

  • 自己编译过 PHP 吗?如何打开 readline 功能

  • 如何查看 PHP 进程的内存、CPU 占用

  • 如何给 PHP 增加一个扩展

  • 修改 PHP Session 存储位置、修改 INI 配置参数

  • 负载均衡有哪几种,挑一种你熟悉的说明其原理

  • 数据库主从复制 M-S 是怎么同步的?是推还是拉?会不会不同步?怎么办

  • 如何保障数据的可用性,即使被删库了也能恢复到分钟级别。你会怎么做。

  • 数据库连接过多,超过最大值,如何优化架构。从哪些方便处理?

  • 502 大概什么什么原因?如何排查 504呢?

架构篇

  • 偏运维(了解):

    • 负载均衡(Nginx、HAProxy、DNS)

    • 主从复制(MySQL、Redis)

    • 数据冗余、备份(MySQL增量、全量 原理)

    • 监控检查(分存活、服务可用两个维度)

    • MySQL、Redis、Memcached Proxy 、Cluster 目的、原理

    • 分片

    • 高可用集群

    • RAID

    • 源代码编译、内存调优

  • 缓存

    • 工作中遇到哪里需要缓存,分别简述为什么

  • 搜索解决方案

  • 性能调优

  • 各维度监控方案

  • 日志收集集中处理方案

  • 国际化

  • 数据库设计

  • 静态化方案

  • 画出常见 PHP 应用架构图

框架篇

  • ThinkPHP(TP)、CodeIgniter(CI)、Zend(非 OOP 系列)

  • Yaf、Phalcon(C 扩展系)

  • Yii、Laravel、Symfony(纯 OOP 系列)

  • Swoole、Workerman (网络编程框架)

  • 对比框架区别几个方向点

    • 是否纯 OOP

    • 类库加载方式(自己写 autoload 对比 composer 标准)

    • 易用性方向(CI 基础框架,Laravel 这种就是高开发效率框架以及基础组件多少)

    • 黑盒(相比 C 扩展系)

    • 运行速度(如:Laravel 加载一大堆东西)

    • 内存占用

设计模式

  • 单例模式(重点)

  • 工厂模式(重点)

  • 观察者模式(重点)

  • 依赖注入(重点)

  • 装饰器模式

  • 代理模式

  • 组合模式

安全篇

  • SQL 注入

  • XSS 与 CSRF

  • 输入过滤

  • Cookie 安全

  • 禁用 mysql_ 系函数

  • 数据库存储用户密码时,应该是怎么做才安全

  • 验证码 Session 问题

  • 安全的 Session ID (让即使拦截后,也无法模拟使用)

  • 目录权限安全

  • 包含本地与远程文件

  • 文件上传 PHP 脚本

  • eval 函数执行脚本

  • disable_functions 关闭高危函数

  • FPM 独立用户与组,给每个目录特定权限

  • 了解 Hash 与 Encrypt 区别

高阶篇

  • PHP 数组底层实现 (HashTable + Linked list)

  • Copy on write 原理,何时 GC

  • PHP 进程模型,进程通讯方式,进程线程区别

  • yield 核心原理是什么

  • PDO prepare 原理

  • PHP 7 与 PHP 5 有什么区别

  • Swoole 适用场景,协程实现方式

前端篇

  • 原生获取 DOM 节点,属性

  • 盒子模型

  • CSS 文件、style 标签、行内 style 属性优先级

  • HTML 与 JS 运行顺序(页面 JS 从上到下)

  • JS 数组操作

  • 类型判断

  • this 作用域

  • .map() 与 this 具体使用场景分析

  • Cookie 读写

  • JQuery 操作

  • Ajax 请求(同步、异步区别)随机数禁止缓存

  • Bootstrap 有什么好处

  • 跨域请求 N 种解决方案

  • 新技术(了解)

    • ES6

    • 模块化

    • 打包

    • 构建工具

    • vue、react、webpack、

    • 前端 mvc

  • 优化

    • 浏览器单域名并发数限制

    • 静态资源缓存 304 (If-Modified-Since 以及 Etag 原理)

    • 多个小图标合并使用 position 定位技术 减少请求

    • 静态资源合为单次请求 并压缩

    • CDN

    • 静态资源延迟加载技术、预加载技术

    • keep-alive

    • CSS 在头部,JS 在尾部的优化(原理)

网络篇

  • IP 地址转 INT

  • 192.168.0.1/16 是什么意思

  • DNS 主要作用是什么?

  • IPv4 与 v6 区别

网络编程篇

  • TCP 三次握手流程

  • TCP、UDP 区别,分别适用场景

  • 有什么办法能保证 UDP 高可用性(了解)

  • TCP 粘包如何解决?

  • 为什么需要心跳?

  • 什么是长连接?

  • HTTPS 是怎么保证安全的?

  • 流与数据报的区别

  • 进程间通信几种方式,最快的是哪种?

  • fork() 会发生什么?

API 篇

  • RESTful 是什么

  • 如何在不支持 DELETE 请求的浏览器上兼容 DELETE 请求

  • 常见 API 的 APP_ID APP_SECRET 主要作用是什么?阐述下流程

  • API 请求如何保证数据不被篡改?

  • JSON 和 JSONP 的区别

  • 数据加密和验签的区别

  • RSA 是什么

  • API 版本兼容怎么处理

  • 限流(木桶、令牌桶)

  • OAuth 2 主要用在哪些场景下

  • JWT

  • PHP 中 json_encode(['key'=>123]); 与 return json_encode([]); 区别,会产生什么问题?如何解决

链接

 

忙忙碌碌,新的一年又要来了,先提前祝大家新春愉快,大吉大利,技能更上一层楼!

 

谈了好多年的php过时了,现在一年又过去了,php还是那样稳稳的,相反,如果你技能没提升,那就真的黄了。。。

 

所以不管怎样,你已经入门很久了,那就抓紧学好来,学好的同时,多学一门语言,比如现在互补的Go语言。它和swoole一样可以弥补php的不足。还有更多的技术栈是你在走向高级阶段必须要学的,有丰富的知识与语言扩展,再加上你有丰富的实战经验,那才算是有过硬的技术能力。

 

很多人都会问提升自己的技能该学些什么?其实有时候你已经无形的在接触着各种各样的提升技能的知识了。我在这里给你先总结一下:

 

PHP学到极致势必涉及到设计模式,Swoole协程编程、微服务、多线程、Laravel核心架构等不一而足;

 

一:常见模式与框架

学习PHP技术体系,设计模式,流行的框架

常见的设计模式,编码必备

Laravel、TP开发必不可少的最新框架

YII、Symfony4.1可以扩展

 

二:微服务架构与性能优化

大型网站,业务体系越来越复杂,Swoole协程编程,PHP并发编程、MySQL底层优化是架构升级的必经之路,PHP性能优化和微服务架构相关的技术有哪些呢?

Tars分布式RPC框架

Swoft微服务框架

服务器性能优化

算法与数据结构

 

三:工程化与分布式架构

任何脱离细节的PPT架构师都是耍流氓,向上能运筹帷幄,向下能解决一线开发问题,PHP架构师需深入工程化、高并发,高可用,海量数据,没有分布式的架构知识肯定是玩不转的:

Linux操作/shell脚本编程

docker容器/自动化部署

分布式缓存/消息中间件

分布式架构原理/高并发分流

 

能掌握以上技术这些人必然具备在技术上有独当一面的能力,然而,除了你必备技能外,你还需要必备哪些条件呢?以下给大家讲讲

一、平静的心态

和大多数程序员一样,要敲一手好的代码,当然没有好的心态是不行的。遇事不可急躁,不可轻言放弃。

在开发过程中,尤其是初中级,写出的程序或架构会遇到很多问题,其中一些问题比较弱智,而有些问题根本没有碰到过,这时候不可太过急躁,应该逐个排查问题的最初源泉,将其干掉。急躁的心态去开发系统是对项目的一种不负责。急躁会让人学会将就,让人学会逃避。

为什么将心态列入其中,我是想说明:PHP开发不同于销售的职能,不需要很大激情澎湃,而是需要静静的思考。

 

二、一套烂熟于心的问题解决思路

每解决一个bug,就给自己一个提升。的确,没有真正解决过无数的bug或问题的程序员,谈不上专家,谈不上高级程序员。而一个高级程序员正是从这种解决问题的过程中不断的历练自己,形成一套烂熟于心的问题解决思路,要自己强大的。

这里简单说一下PHP程序员成长过程中经常遇到的一些问题,如果你一个也没遇到或很少遇到,那么您就是两个极端的人:要么初级入门,要么高级了。

1、编码问题

2、PHP和SQL数据库执行效率问题

3、Session和Cookie域和加密解析问题

4、程序的执行顺序问题

5、程序编写的多环境适用问题

6、分类的构建和结构设计问题

7、字符串处理问题:正则表达式处理或简单PHP字符串处理函数来处理

8、各种模板引擎的编写局限性问题

9、PHP和web端数据交互问题(如ajax,接口调用等)

 

三、过硬的PHP基础知识

没有过硬的PHP基础知识,哪怕心态再好,问题解决的能力再强,也只能纸上谈兵。过硬的基础知识会让你在项目开发过程中游刃有余。

我也简单说说哪些属于PHP工程师所应具备的基础知识(其实这些在招聘需求中很常见):

1、语法规则,这个不说了,这个不会,就没入门。

2、MYSQL各种sql语句的写法,增删改查基本的不说了,in(),union,left(),leftjoin,as,replace,altertable,where的字段排序,各种索引建立的方法要特别熟悉。

3、会自己搭建LAMP环境和WAMP环境,用集成软件一键式安装的不算。开发程序,对于自己开发的环境构建结构都不清楚,怎么排查问题?所以至少要会用对立的msi文件来安装自己需要的开发环境。安装3-5遍成功,这个算还行,还得会安装各种扩展,配置apache服务,知道各种参数设置的地方以及知道怎么设置各种参数;会linux操作系统的基本命令。

4、熟悉Web方面的其他程序,因为PHP不是一个完全独立的东西,他是一个和其他语言和要素配合来完成一个项目的,如果对其他语言和要素不太熟悉,在团队协作过程中会非常吃力。这些其他要素包括:html,javascript,jquery,xml,http协议,正则表达式等

 

四、综合的互联网应用及项目管理知识和素养

1、见识广博,擅于学习

只顾自己专研,不看看、学学人家的做法,会像井底之蛙,难以看到广阔的天空的。所以,不要只顾着天天编程,学会抽点时间去看看一些大型开源系统的架构思路,以及大型商务网站的构建方式。向他们学习,补充自己的不足。

2、项目解决方案选型

不同需求,用不同的机构和选型。也就是常说的"水来土掩,兵来将挡",有些架构固然强大,但是用于小型项目也会很吃力,就是杀机不用牛刀。根据需求来选型很重要。

选型不是随口就能定的,需要一个PHP程序员用于良好的储备,个人觉得至少需要以下储备,才具备选型能力。熟练应用至少一个PHP框架,两三个PHP开源系统;拥有自己的一套应用系统。

3、良好的项目管理素养

项目不是一直开发过程中,项目也会进入运营期,维护期,这样,具备良好的项目管理素养会使项目更加稳定,可控。

良好的项目管理素养包括:

良好的项目开发及维护习惯,记住:千万别为了一时的省力,造成后面多次的重复劳动。时时提醒自己将工作流程化,流程规划化,规范简单化。

良好的多人合作管理意识:项目不是一个人的,是多人协作的产物,也是服务于大众的,因而,要提升协作意识,让相关人员一同来完善项目。

4、丰富的项目开发应用经验

学理论,去考试或考核是学校里面的事儿,没有项目经验,就像满肚子经文,吐也难吐出。这就需要实际的项目将自己的知识去学会转化为需求实现。

5、良好的开发规范

代码可读性强:对象,方法,函数的注释,一套成熟的命名规范

代码冗余度底:程序和文件的重用性大,高内聚,低耦合

执行效率高:用最简单的程序流程实现应用需求,勿扰大弯子

代码安全性好:做一名警惕的程序员,任何有用户输入和上传文件的地方都得额外谨慎,也许一个程序员一时的疏忽就会导致一个系统顷刻间崩溃。

链接

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值