Skip to content

rucblake/php-be-interview

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 

Repository files navigation

php面试相关

tip

这个文档只是一个提纲,以及一些可能的考点或者demo代码。列出了大概的技术栈,每一个点都需要花更多的时间去深入钻研,万不能只看一点点皮毛就去面试。而应该在广泛学习的基础上,通过文档里的每一个点引出无数个思维方向,从而在大脑里形成一个自己的知识树,明白自己的欠缺,不断学习,丰富自己的技术栈。

redis

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

redis包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hashs(哈希类型)。这些数据类型都 支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。

php中reids的操作

// from 菜鸟runoob
// 从代码中以点带面,在什么样的场景中会运用到

// 配置连接的IP、端口、以及相应的数据库
$server = array(
‘host’     => ’127.0.0.1′,
‘port’     => 6379,
‘database’ => 15
);
$redis = new Client($server);

// 普通set/get操作
$redis->set(‘library’, ‘predis’);
$retval = $redis->get(‘library’);
echo $retval; //显示 ‘predis’

$redis->exists(‘foo’);//true

// del 删除
$redis->del(‘foo’);//true

// hset/hget 存取hash表的数据
$redis->hset(‘hash1′,’key1′,’v1′); //将key为’key1′ value为’v1′的元素存入hash1表
$redis->hset(‘hash1′,’key2′,’v2′);
$redis->hget(‘hash1′,’key1′);  //取出表’hash1′中的key ‘key1′的值,返回’v1′

// 同步保存服务器数据到磁盘
$redis->save();

mysql

mysql优化怎么做的?

  1. 设计角度:存储引擎的选择,字段类型选择,范式

  2. 功能角度:可以利用mysql自身的特性,如索引,查询缓存,碎片整理,分区、分表等

  3. sql语句的优化方面:尽量简化查询语句,能查询字段少就尽量少查询字段,优化分页语句、分组语句等。

  4. 部署大负载架构体系:数据库服务器单独出来,负载大时可以采用主从复制,读写分离机制进行设计

  5. 从硬件上升级数据库服务器。

sql注入是什么及如何预防sql注入?

SQL注入攻击指的是用户或者黑客通过构建特殊的输入作为参数传入我们的Web应用程序端,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序员没有细致地过滤用户输入的数据,致使非法数据侵入系统而造成的。因此我们在做开发过程中一定要预防sql注入,主要从两方面着手:

1、占位符的方式,就是对sql语句进行预处理,然后执行sql语句

2、通过addslashes或者mysql_real_escape_string这两个函数对用户输入的值进行转义处理,把一些特殊的字符转义掉。

预处理

预处理语句用于执行多个相同的 SQL 语句,并且执行效率更高。

预处理语句的工作原理如下

  1. 预处理:创建 SQL 语句模板并发送到数据库。预留的值使用参数 "?" 标记 。例如: INSERT INTO MyGuests (firstname, lastname, email) VALUES(?, ?, ?) 数据库解析,编译,对SQL语句模板执行查询优化,并存储结果不输出。

  2. 执行:最后,将应用绑定的值传递给参数("?" 标记),数据库执行语句。应用可以多次执行语句,如果参数的值不一样。

相比于直接执行SQL语句,预处理语句有两个主要优点:

  1. 预处理语句大大减少了分析时间,只做了一次查询(虽然语句多次执行)。

  2. 绑定参数减少了服务器带宽,你只需要发送查询的参数,而不是整个语句。

预处理语句针对SQL注入是非常有用的,因为参数值发送后使用不同的协议,保证了数据的合法性。

$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// 设置参数并执行
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$stmt->close();

mysql索引

  • 非常重要!

了解InnoDB和Myisam,B+tree,聚簇索引等等 InnoDB索引原理详解

MongoDB

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键
<?php
// from runoob
$m = new MongoClient(); // 连接默认主机和端口为:mongodb://localhost:27017
$db = $m->test; // 获取名称为 "test" 的数据库

$collection = $db->createCollection("runoob"); // 创建集合

$collection = $db->runoob; // 选择集合
$document = array( 
    "title" => "MongoDB", 
    "description" => "database", 
    "likes" => 100,
    "url" => "http://www.runoob.com/mongodb/",
    "by", "菜鸟教程"
);

// 插入文档
$collection->insert($document);

// 查找文档
$cursor = $collection->find();

// 更新文档
$collection->update(array("title"=>"MongoDB"), array('$set'=>array("title"=>"MongoDB 教程")));

// 删除文档
$collection->remove(array("title"=>"MongoDB 教程"), array("justOne" => true));
?>

composer

Composer 是 PHP5.3以上 的一个依赖管理工具。它允许你声明项目所依赖的代码库,它会在你的项目中为你安装他们。

创建一个 composer.json 文件

{
    "require": {
        "monolog/monolog": "1.2.*"
    }
}

php web相关

cookie与session的区别

  1. cookie数据存放在客户的浏览器上,session数据放在服务器上。

  2. cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session。

  3. session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用COOKIE。

  4. 单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。

get和post的区别

  1. get是从服务器上获取数据,post是向服务器传送数据。
  2. get是把参数数据队列加到提交表单的ACTION属性所指的URL中,值和表单内各个字段一一对应,在URL中可以看到。post是通过HTTP post机制,将表单内各个字段与其内容放置在HTML HEADER内一起传送到ACTION属性所指的URL地址。用户看不到这个过程。
  3. get传送的数据量较小,不能大于2KB。post传送的数据量较大,一般被默认为不受限制。4.. get安全性非常低,post安全性较高。但是执行效率却比Post方法好。

php在储存session以什么形式存在

PHP为session的存储提供了三种方式: 文件/ 内存/ 自定义存储,默认是使用文件存储.在访问量大的网站上采用这种方式就不大合 适,因为这样会导致大量的输入输出的冗余.我们可以在php.ini更改配置文件或者php脚本中通过相应的函数来设置session文件的存储类型来改变session文件的存储形式

xss攻击怎么防止

XSS又称CSS,全称Cross SiteScript(跨站脚本攻击), XSS攻击类似于SQL注入攻击,是Web程序中常见的漏洞,XSS属于被动式且用于客户端的攻击方式,所以容易被忽略其危害性。其原理是攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie信息、破坏页面结

常见的恶意字符XSS输入:

  1. XSS 输入通常包含 JavaScript 脚本,如弹出恶意警告框: <script>alert("XSS");</script>

  2. XSS 输入也可能是 HTML 代码段,譬如:

    (1) 网页不停地刷新 <meta http-equiv="refresh" content="0;">

    (2) 嵌入其它网站的链接,重定向到其它网站等。

方法:利用php htmlentities()函数

php防止XSS跨站脚本攻击的方法:是针对非法的HTML代码包括单双引号等,使用htmlspecialchars()函数。

这里要说的静态化指的是页面静态化,也即生成实实在在的静态文件,也即不需要查询数据库就可以直接从文件中获取数据,指的是真静态。它的实现方式主要有两种:

  • 一种是我们在添加信息入库的时候就生成的静态文件,也称为模板替换技术,这种主要用在后台,用于一些基本上很少变化的信息上,在添加信息的时候使用添加的信息来替换制定好的模板中的内容,达到生成静态文件的目的,这样在前台访问该信息时,可以直接从生成好的静态文件中获取信息,如一些CMS系统。

  • 另外一种是用户在访问我们的页面时先判断是否有对应的缓存文件存在,如果存在就读缓存,不存在就读数据库,同时生成缓存文件。这种实现的主要原理是基于PHP中的ob缓冲技术来实现的,当没有静态文件时,从数据库中读取,读取的数据使用OB缓存,使用相关的函数从OB缓冲中读取数据,写入到文件中,形成静态文件。当然这个过程中要考虑静态文件的缓存周期问题,我们可以根据文件的最后修改时间和当前时间及设定的缓存时间来定时更新缓存文件。

如何处理负载、高并发

从低成本、高性能和高扩张性的角度来说有如下处理方案:

  1. HTML静态化 其实大家都知道,效率最高、消耗最小的就是纯静态化的html页面,所以我们尽可能使我们的 网站上的页面采用静态页面来实现,这个最简单的方法其实也是最有效的方法。

  2. 图片服务器分离 把图片单独存储,尽量减少图片等大流量的开销,可以放在一些相关的平台上,如骑牛等

  3. 数据库集群和库表散列及缓存 数据库的并发连接为100,一台数据库远远不够,可以从读写分离、主从复制,数据库集群方面来着手。另外尽量减少数据库的访问,可以使用缓存数据库如memcache、redis。

  4. 镜像: 尽量减少下载,可以把不同的请求分发到多个镜像端。

  5. 负载均衡: Apache的最大并发连接为1500,只能增加服务器,可以从硬件上着手,如F5服务器。当然硬件的成本比较高,我们往往从软件方面着手。 负载均衡建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力,同时能够提高网络的灵活性和可用性。目前使用最为广泛的负载均衡软件是Nginx、LVS、HAProxy。

服务器

心中有概念,然后足够的实际操作。

Apache

百度百科介绍

Nginx

百度百科介绍

php特性

PHP 的垃圾收集机制是怎样的

php作为脚本语言是页面结束即释放变量所占内存的。 当一个 PHP线程结束时,当前占用的所有内存空间都会被销毁,当前程序中所有对象同时被销毁。GC进程一般都跟着每起一个SESSION而开始运行的.gc目的是为了在session文件过期以后自动销毁删除这些文件.在PHP中,没有任何变量指向这个对象时,这个对象就成为垃圾。PHP会将其在内存中销毁;这是PHP的GC垃圾处理机制,防止内存溢出。 执行这些函数也可以起到回收作用__destruct /unset/mysql_close /fclose php对session有明确的gc处理时间设定session.gc_maxlifetime 如果说有垃圾,那就是整体的程序在框架使用中,会多次调用同一文件等等造成的非单件模式等。所以在出来的时候,必要的用_once引用,在声明类的时候使用单件模式。还有简化逻辑等等。

zval

内存管理

垃圾回收机制

cgi、fastcgi、php-fpm

  • cgi 早期的web server只可以处理简单的静态web文件,但是随着技术的发展出现动态语言如PHP,Python。PHP语言交给PHP解析器进行处理,但是处理之后如何和web server进行通信呢? 为了解决不同的语言处理器与web server之间的通讯,出现了CGI协议。只要按照CGI协议编写程序,就可以实现与语言解析器与web server之间的通讯。 CGI协议虽然解决了语言解析器和seb server之间通讯的问题,但是它的效率很低。因为web server每收到一个请求都会创建一个CGI进程,PHP解析器都会解析php.ini文件,初始化环境,请求结束的时候再关闭进程。对于每一个创建的CGI进程都会执行这些操作。所以效率很低。

  • FastCGI FastCGI是用来提高CGI性能的,FastCGI每次处理完请求之后不会关闭掉进程。而是保留这个进程,使这个进程可以处理多个请求。这样的话每个请求都不用再重新创建一个进程了。大大提升了处理效率。

  • PHP-FPM PHP-FPM(FastCGI Process Manager:FastCGI进程管理器)是一个实现了Fastcgi的程序,并且提供进程管理的功能。进程包括master进程和worker进程。master进程只有一个,负责监听端口,接受来自web server的请求。worker进程一般会有多个,每个进程中会嵌入一个PHP解析器,进程PHP代码的处理。

php.ini中的safe_mode 影响

Warning 本特性已自 PHP 5.3.0 起废弃并将自 PHP 5.4.0 起移除。

1)用户输入输出函数(fopen()file()require(),只能用于调用这些函数有相同脚本的拥有者)

2)创建新文件(限制用户只在该用户拥有目录下创建文件)

3)用户调用popen()systen()exec()等脚本,只有脚本处在safe_mode_exec_dir配置指令指定的目录中才可能

4)加强HTTP认证,认证脚本拥有者的UID的划入认证领域范围内,此外启用安全模式下,不会设置PHP_AUTH

5)mysql服务器所用的用户名必须与调用mysql_connect()的文件的拥有者用户名相同6)

受影响的函数变量以及配置命令达到40个

php的设计模式

  1. 单例模式 一个类在整个应用中,只有一个对象实例的设计模式 类必须自行创建这个实例 必须自行向整个系统提供这个实例 三私:私有静态成员变量、构造函数、克隆函数 一公:公共的静态方法

  2. 工厂模式 可以根据输入的参数或者应用程序配置的不同,创建一种专门用来实例化并返回其它类的实例的类

  3. 观察者模式 观察者模式提供了组件之间紧密耦合的另一种方法。 该模式:一个对象通过添加一个方法(该方法允许另一个对象,即观察者注册自己)全本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。

  4. 命令链模式: 以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求,如果可以,该请求被处理,进程停止。

  5. 策略模式: 此算法是从复杂类提取的,因而可以方便地替换。

php语法

Include和require的区别

require函数通常放在PHP程序的最前面,在PHP程序执行之前,就会先读取require指定引入的文件,使它变成PHP程序网页的一部分。

include函数一般是放在流程控制的处理部分中。PHP程序在读到include的文件时,才将它读进来,这种方式可以把程序执行时的流程简单化。

他们两个的用途是一样的,不一定非要哪个放在最前面哪个放在中间,他们最根本的区别在于错误处理的方式不一样。

require一个文件存在错误的话,那么程序就会中断执行,并显示致命错误

而include一个文件存在错误的话,那么程序不会中断,会继续执行,并显示一个警告的错误

其它区别:include有返回值,而require没有。

PHP的变量类型

四种标量类型

  1. boolean (布尔型):这是最简单的类型,只有两种取值,可以为 TRUE/true 或 FALSE/false ,不区分大小写。详细请查看:PHP布尔类型(boolean)

  2. integer (整型):在32 位操作系统中它的有效范围是:-2 147 483 648~+2 147 483 647。整型值可以使用十进制,十六进制或八进制表示,前面可以加上可选的符号(- 或者 +)。八进制表示数字前必须加上 0(零),十六进制表示数字前必须加上 0x。

  3. float (浮点型, 也称作 double)

  4. string (字符串):字符型变量不同于其他编程语言有字符与字符串之分,在PHP 中,统一使用字符型变量来定义字符或者字符串。

两种复合类型

  1. array (数组):数组型变量是一种比较特殊的变量类型,将在后续章节中详细说明。

  2. object (对象):对象也是一种特殊的数据类型。要创建object变量,请使用 new 关键字。详细请查看:PHP对象类型(object)

两种特殊类型

  1. resource(资源):源是一种特殊变量,保存了到外部资源的一个引用。资源是通过专门的函数来建立和使用的。详情请查看:PHP资源类型(resource)

  2. NULL(NULL):表示一个变量没有值。NULL 类型唯一可能的值就是 NULL。

单引号与双引号的区别

  1. 单引号内部的变量不会执行, 双引号会执行

  2. 单引号解析速度比双引号快。

  3. 单引号只能解析部分特殊字符,双引号可以解析所有特殊字符。

php扩展

GD库

图像处理扩展 GD 和图像处理 函数

yaf

Yet Another Framework

curl

Client URL

mysqli

mysql增强版

php7

php7新特性

  • ??运算符(NULL 合并运算符)

由于日常使用中存在大量同时使用三元表达式和 isset()的情况,NULL 合并运算符使得变量存在且值不为NULL, 它就会返回自身的值,否则返回它的第二个操作数。

<?php
// 如果 $_GET['user'] 不存在返回 'nobody',否则返回 $_GET['user'] 的值
$username = $_GET['user'] ?? 'nobody';
// 类似的三元运算符
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';
?>
  • <=> 太空船操作符(组合比较符)

太空船操作符用于比较两个表达式。当a大于、等于或小于b时它分别返回-1、0或1。

<?php
// 整型
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// 浮点型
echo 1.5 <=> 1.5; // 0
echo 1.5 <=> 2.5; // -1
echo 2.5 <=> 1.5; // 1
 
// 字符串
echo "a" <=> "a"; // 0
echo "a" <=> "b"; // -1
echo "b" <=> "a"; // 1
?>
  • 通过 define() 定义常量数组
<?php
define('ANIMALS', [
    'dog',
    'cat',
    'bird'
]);

echo ANIMALS[1]; // 输出 "cat"
?>
  • 整除

新增了整除函数 intdiv()

<?php
var_dump(intdiv(10, 3));
// 输出结果: int(3)
?>

php优化

48条高效率的PHP优化写法

操作系统相关

操作系统是本科计算机中可以说是非常重要的课程,一定要认真复习。

linux常用命令及工具

ps aux 查看进程pid等常用 grep 过滤,-E支持表达式 curl 发起一次请求 kill -9 pid 杀死进程 top linux版任务管理器,查看当前进程占用内存CPU wc -l 计算行数 tail -f file 实时查看文件变化 contab 定时任务工具 ……

进程各个状态

进程的状态和转换详解

网络相关

TCP/IP - 百度百科

HTTP协议详解

http状态码

12345法则

  • 1** 消息 100 客户端应当继续发送请求。
  • 2** 成功 200 成功
  • 3** 重定向 301 永久重定向,例如http定向到https 302 临时重定向,例如js跳转
  • 4** 请求错误 403 forbidden 拒绝请求。 404 not found 找不到请求的网页。
  • 5** 服务器错误 500 Internal Server Error 服务器内部错误,例如php代码错误

http版本

1.0
  • 无状态、无连接。 HTTP1.0规定浏览器和服务器保持短暂的连接,浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态)。

  • 队头阻塞 HTTP1.0规定下一个请求必须在前一个请求响应到达之前才能发送。假设前一个请求响应一直不到达,那么下一个请求就不发送,同样的后面的请求也给阻塞了。

1.1
  • 长连接 HTTP1.1增加了一个Connection字段,通过设置Keep-Alive可以保持HTTP连接不断开,避免了每次客户端与服务器请求都要重复建立释放建立TCP连接,提高了网络的利用率。如果客户端想关闭HTTP连接,可以在请求头中携带Connection: false来告知服务器关闭请求。

  • 管道化 基于HTTP1.1的长连接,使得请求管线化成为可能。管线化使得请求能够“并行”传输。

  • 新的字段 如cache-control,支持断点传输,以及增加了Host字段(使得一个服务器能够用来创建多个Web站点)。

2.0
  • 二进制分帧 HTTP2.0通过在应用层和传输层之间增加一个二进制分帧层,突破了HTTP1.1的性能限制、改进传输性能。

  • 多路复用(连接共享) HTTP2.0实现了真正的并行传输,它能够在一个TCP上进行任意数量HTTP请求。而这个强大的功能则是基于“二进制分帧”的特性。

  • 头部压缩 HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。高效的压缩算法可以很大的压缩header,减少发送包的数量从而降低延迟。

  • 服务器推送 服务器除了对最初请求的响应外,服务器还可以额外的向客户端推送资源,而无需客户端明确的请求。

http和https的区别

http https
端口 80 443
内容 明文传输 加密传输
安全 无状态 需要安全证书

HTTPS 约等于 HTTP+SSL

  • 优点 相对安全/SEO排名更高
  • 缺点 证书需要申请,服务器资源占用更高,连接建立需要传送证书,速度更慢.

TCP/IP

四层模型及OSI七层参考模型

三次握手四次挥手

简略快速回忆版:

  • 三次握手 客户端:我要和你通信(syn-sent) 服务端:你的请求已收到,发送确认(syn-rcvd) 客户端:你的确认已收到,连接建立(est)

  • 四次挥手 客户端:我没有东西了,准备关闭(fin-wait) 服务端:你的关闭我收到了,但我还有点东西没传完(close-wait) ……一段时间后…… 服务端:我的东西传完了,可以关闭了(last-ack) 客户端:收到关闭通知,你也可以关闭了(time-wait)

算法相关

各种数据结构,栈图树;各种算法,动态规划balabala

中等难度算法题在解答基础上提高速度,高级算法题能够有思路,不求ac,至少通过一部分。

About

php后端面试题

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published