PHP 面试详解之技术篇

技术篇详情

Linux常用命令

怎么查看端口?【Netstat -ntlp | grep 端口】
查看负载?查看磁盘?【Top 、df -h】

基本命令

	pwd:查看工作目录
	ls :查看指定目录的内容
	-l :列表显示
	-a:显示所有,包括隐藏文件
	-h:人性化的显示
	-d:只显示目录,不查看内容
	cd:切换工作目录
	.   :当前目录
	..  :上一级目录	
	yy 复制光标所在行
	p 粘贴
	nyy 复制光标开始的n行
	dd 删除光标所在行
	ndd 删除光标开始的n行
	u 撤销操作
	ctrl + r 反撤销操作 
	:w 保存
	:q 退出
	:wq 保存退出,等价于 shift + zz
	:x 保存退出,等价于:wq
	:q! 强制退出
	:set nu 显示行号
	:set nonu 隐藏行号

文件及文件夹

	touch	:创建普通文件
	rm	:删除文件,-f表示强制删除,-r表示递归删除
	cp	:拷贝文件,若目标目录写上文件名可以顺便把名字改了,-r可以操作目录
	mv	:移动文件,若目标目录写上文件名可以顺便把名字改了
	mkdir	:创建文件夹,-p创建中间目录
	rmdir	:删除文件夹,只能删除空目录
	find	:文件查找

软硬链接文件

	说明:ls -l 结果的第一列就是文件类型

类型:

	-:普通文件
	d:目录文件
	l:软链接

文件权限管理

说明:在linux下,文件的权限有:所有者、所属组、其它的区分
权限:权限有:读(r)、写(w)、执行(x),ls -l即可查看
	rwxr-xr--
	修改:使用chmod命令修改文件的权限
	格式:chmod [身份] [修改] [权限] 文件

身份:

	u:用户
	g:组
	o:其它
	a:所有身份

修改:

	+:添加
	-:去掉
	=:设置

权限:

	r:读
	w:写
	x:执行
	chmod  修改权限

php常用函数

字符串函数

 strlen		字符串长度
substr_count	出现的次数
substr		截取字符串
strrchr		获取文件后缀
strrev		字符串反转
trim 		去掉函数俩边的空白字符

时间日期函数

time		时间戳
date		时间序列化函数

数组函数

abs		绝对值
floor		向下取整
ceil		向上取整
round		四舍五入
rand		随机整数
array_shift:	从数组的前面弹出元素,得到元素的值
array_pop:	从数组的后面弹出元素,获得元素的值
array_unshift:	从数组的前面压入元素,得到当前数组元素的个数
array_push:	从数组的后面压入元素,得到当前数组元素的个数
count() 		 非数组返回1
key:		获取当前数组当前指针所指向的元素的下标
current:		获取的当前指针指向元素的数值
next:		获取下一个元素的值,并且将指针下移
prev:		获取上一个元素的值,并且将指针上移
end :		将指针移到数组的最后一个元素,并返回最终指针位置的值
reset:		将指针移到数组的第一个元素,返回最终指针位置的值
array_keys:	获取一个数组的所有键名,返回一个索引数组
array_values:	获取一个数组的所有值,返回一个索引数组
explode:		字符串转换数组
split 		类似 explode  explode('.', 'abc.txt')等于split('\.','abc.txt')
implode:		粘合,将一个数组内部的所有元素按照某个指定的规则(特殊字符),将所有的元素拼接成一个字符串
join() 		 把数组元素组合为一个字符串
array_merge:	合并数组。
array_reverse  	反转数组
array_flip 		— 交换数组中的键和值

序列化

serialize
unserialize
json_encode 	对变量进行 JSON 编码 
json_decode  	对JSON 格式的字符串进行编码

排序

rsort() 		函数用于对数组单元从高到低进行排序。
asort() 		函数用于对数组单元从低到高进行排序并保持索引关系。
arsort() 		函数用于对数组单元从高到低进行排序并保持索引关系。
ksort() 		函数用于对数组单元按照键名从低到高进行排序。	
krsort()		函数用于对数组单元按照键名从高到低进行排序。

判断变量

is_bool:		判断是否是布尔类型
is_float:		判断浮点型
is_integer:	判断整型
is_object:	判断对象
is_array:		判断数组
is_string:		判断字符串
is_resource:	判断资源
is_scalar:		scalar是标量的,判断是基本数据类型:整型,浮点型,布尔型和字符串型
is_null 		检测变量是否为NULL 是返回TRUE 否则返回false。1.被赋值为NULL;2.变量没被赋值;3.被unset()

问题

订单、库存两个表 如何保证数据的一致性?

在一个电子商务系统中,正常的应该是订单生成成功后,相应的库存进行减少。必须要保证两者的一致性,但有时候因为某些原因,比如程序逻辑问题,并发等问题,导致下单成功而库存没有减少的情况。这种情况我们是不允许发生的,MySQL 中的事务刚好可以解决这一问题,首先得选择数据库的存储引擎为 innoDB,事务规定了只有下订单完成了,并且相应的库存减少了才允许提交事务,否则就事务回滚,确保数据一致性。


接口安全:

1、加密
	对数据进行加密,请求被人拦截到,看到的数据页数密文的,
	这样的话数据就是安全的。
2、签名

作用:
防止在传输的过程中被人篡改

队列知道吗?项目中用到过吗?推送了哪些消息?

在我们的项目中,使用消息队列来实现短信的服务化,任何需要发送短信的模块,都可
以直接调用短信服务来完成短信的发送。比如用户系统登录注册短信,订单系统的下单
成功的短信等


直播是如何实现的?如何进行推流?

可以用swoole实现
通过网线将EFP系统中的切换台、网络编码器、笔记本按顺序连接,连接完成后确保笔
记本电脑的IP地址和网络编码器的地址在同一网段,然后在电脑页面上对编码器的各
种“推流参数”进行调整,为保证正常“推流”,还需设置网络推流地址,输入推流地址、
直播地址、视频模式、分辨率、码率、播放域名、播放地址等内容。设置完毕后确
认IP地址,再进行网络测速,并确保网络与网络编码器连接正常


项目上线流程是什么?遇到问题如何处理?

1.目的 规范公司项目和产品的上线流程,建立和完善产品的版本控制,保证软件产品质量。
2.范围 适用于公司所有项目和产品
3.发布人员 开发环境由开发人员内部负责(包括维护和管理开发分支和 git 代码库) 测试环境由测试人员负责
预热环境由运维人员负责 正式环境由运维人员负责 *数据库操作均…
4.发布流程 在已开发完毕的各系统正式部署生产环境前要严格按照以下流程进行上线前检查


分装框架

MVC思想、命名空间、composter、单一入口、自动加载、psr(代码规范)


Tinkphp和laravel 共同与区别

  • 共同:

      1.在框架来看都是MVC模式的框架
      2.都是使用DB操作数据的方式
      3.都可以使用 Artsian命令和composer
    
  • 区别:
    提交数据的方式
    Laravel在提交表单时需要在表单中加入{csrf_field}来防止跨域,而TP不会。
    路由
    Laravel必须先定义,再使用,路由文件为routes.php,TP在配置文件中开启路由后,路由格式是:‘路由表达式’ => ‘路由地址和参数’(使用路由的前提是URL支持phthinfo并且开启路由),路由可以使URL更符合SEO。
    中间件
    Laravel的中间件,中间件就是HTTP请求到达之前经过的层,通过中间件我们可以验证用户是否登录等一些通用操作。

在模板方面,
tp是smarty【是吗特】 laravel是Blade 【布雷特】
thinkphp使用if/foreach/volist 标签的方式 laravel使用的@if @foreach 的方式
php版本:
laravel的版本
PHP版本 >= 5.5.9,
PHP扩展:OpenSSL,PDO,Mbstring,Tokenizer
Laravel需要依赖 Composer管理,必须首先安装Composer。
Tp
PHP5.3以上版本
模型类:
在ThinkPHP中基础的模型类就是Think\Model类
基础模型类的设计非常灵活,甚至可以无需进行任何模型定义,就可以进行相关数据表的ORM和CURD操作,只有在需要封装单独的业务逻辑的时候,模型类才是必须被定义的。

输入数据安全:
Tp:
使用系统内置的I函数是避免输入数据出现安全隐患的重要手段,I函数默认的过滤方法是htmlspecialchars,如果我们需要采用其他的方法进行安全过滤,有两种方式:
strip_tags,stripslashes
如果没有使用l函数过滤的话使用还可以在模型的写入操作之前调用filter方法对数据进行安全过滤,
$ this->data($data)->filter(‘strip_tags’)->add();
代码目录
Tp:mvc层放在application中
公共配置文件(默认位于Application/Common/Conf/config.php)
Laravel:app目录包含了应用的核心代码;
模型在app下
config目录包含了应用所有的配置文件
vendor目录是laravel的核心代码库,包含Composer依赖;
.env中的所有配置及其值被载入到 PHP 超全局变量 $_ENV 中


熟练使用 PHP 语言对网站进行开发,具备良好oop,mvc思想,熟悉面向对象编程;

  • 面向对象的三大特征 : 分装、继承、多态

  • 面向对象的5大特征:

      单一职责原则【SRP】:一个接口,一个功能
      开放封闭原则【OCP】:
      里式替换原则【LSP】:
      依赖倒置原则【DIP】:
      接口隔离原则【ISP】:
    
  • 核心:高内聚,低耦合

      高内聚:一个模块内个元素彼此结合的紧密程度
      低耦合:一个软件结构内不同模块之间互连程度的度量
    
  • MVC 好处 将界面和业务逻辑分离

      MVC 的核心是 M 数据模型  V 视图页面  C控制器 
      使用MVC的目的是将M和V的实现代码分离,从而同一个程序可以使用
      不同的表现形式。  
      一种软件设计典范,用一种业务逻辑、数据、界面显示分离的方法组织代码,
      将业务逻辑聚集到一个部件里面,在改进和个性化定制界面及用户交互的同时,
      不需要重新编写业务逻辑。MVC被独特的发展起来用于映射传统的输入、
      处理和输出功能在一个逻辑的图形化用户界面的结构中。
    
  • MVCS

      MVC的思想上加上server服务器server负责数据的操作实际就是
      controller把业务进行拆分 controller只需要业务逻辑即可,
      需要做数据的操作
      所以对应到MVCS,它在一开始拆分就是
      controller,因为controller做了数据
      存储的事情,就会变得非常庞大,那么就把数
      据存储的部分抽离出来,交给store去做。
    

一个项目的优化思路

优化方面

思路: 硬件 + 软件

1、WEB网站优化:

前端优化: 静态资源(图片、css、js)做CDN
后端优化
使用集群
Nginx优化
开启Gzip

防盗链

防盗链详情

PHP优化
开启Opcache【线上一定开启】
页面静态化 (使用ob系列函数【输出缓冲区】)
FPM进程优化
( 进程管理方式有哪些【静态、动态、按需】)
按需:没有请求的时候就没有进程、有的时候就启动
代码优化
MySQL优化【表设计、字段 、索引、看慢查询日志 、分表 】
Redis【缓存区】
硬件优化

》接口优化:

》数据库优化:

页面redis缓存

	redis五中数据类型
		string	字符串(可以为整形、浮点型和字符串,统称为元素) 
		list 	列表(实现队列,元素不唯一,先入先出原则) 
		set 	集合(各不相同的元素) 
		hash 	哈希(hash的key必须是唯一的) 
		sort set 	有序集合

redis

业务场景

redis中文官方网站
字符串 视频点赞
列表 1、消息队列 2、邮件队列

哈希			1、安全加密 2、唯一标识 3、数据校验 
			4、散列函数 5、负载均衡 6、分布式缓存
			
集合			1、去重、2、抽奖  3、黑名单 4、白名单

有序集合       排行榜

dash (哈希)数据存储的形式 
在一定范围之内 均匀存放
计算机主要解决:
存
取

哈希碰撞
问题:
$a=10-30 $b=20 $c=30
echo $a=10 还是=30

解决:
	time33(算法)【上千个变量不会重复】【映射】
	在用 拉链发(用一个链表 )

哈希的业务场景


队列异步的缺点

优点、缺点详情


如何使用Redis做异步队列?

1.使用List作为队列,RPUSH生产消息,LPOP消费消息
缺点:在生产者/消费者模式里,当LPOP没有消息的时候即证明消息暂时被消费完毕,并且				
生产者还没有来得及生成数据,LPOP没有等待队列里有值就直接消费。
弥补:可以通过在应用层引入Sleep机制去调用LPOP重试,进而实现简单的异步队列。

2.BLPOP在没有消息的时候阻塞直到消息到来或者超时
测试流程:我们在一个消费者客户端中输入blpop testlist 30,意思是在30秒内会
一直等待testlist的消息,如果超过30秒没有数据则返回nil。 同时在另一个客户端即生
产者执行rpush testlist aaa去放入数据,回车执行后会发现,原来的消费者客户端
中blpop指令就能获取并返回testlist aaa数据,也就证明了BLPOP能替代队列做
更精准的阻塞控制。
缺点:只能供一个消费者消费

3.pub/sub主题订阅者模式
发送者pub发送消息,订阅者sub接收消息,订阅者可以订阅任意数量的频道
(Topic即消费者订阅的主题)。
缺点:消息的发布是无状态的,无法保证可到达
测试流程:
当有新的消息通过publisher频道topic时,这个消息会被发送给订阅它的三个客户端。
两个客户端订阅myTopic频道:subscribe myTopic
一个客户端订阅anotherTopic:subscribe anotherTopic
用于发送消息客户端发送消息:publish myTopic “Hello”
两个订阅myTopic的客户端接收到了"Hello"
用于发送消息客户端发送消息:publish anotherTopic “Hi”
一个订阅anotherTopic的客户端接收到了"Hi"

Redis宕机

redis一般在企业中做分布式缓存,可以大大的减小高并发的开销

企业中一定不是单机版的 因为如果是单机版的有可能会引起宕机

redis集群:两台为一组,一台主机一台备机 ,平时主机工作,备机不工作 ,备机每隔几秒就会给主机发送一个ping ,主机在正常工作的时候会发送一个peng 给备机 ,如果不返回pang,可能会连续ping三次,都不返回那么备机就会上,备机里有主机的全部内容,这个叫做心跳检测机制(高可用的作用),主从热备

redis中的slot槽值得范围是0-16383,一共是16384个槽值,可以将这些槽值分配给每组机器(目前在国内没有达到这么大集群的)

我们在存入redis数据的时候,使用key,value的键值对存值,那么存储前会将key使用crc16算法进行计算,会得出一个纯数字的值,使用这个数字除以16384取余数,余数落到那个slot槽值得范围内就将这个key,value存到对应的机器上,获取数据的时候也是如此。起到了一个负载均衡的作用,集群数越多越均匀,整体的容量要比单机版的容量要大,也就是扩容。

注:宕机就是redis节点挂掉

redis为什么在线上部署的时候一般不设置密码:
在这里插入图片描述
图中可以看出客户在访问网址的时候是先进入域名解析器,域名解析器将网址解析成静态的ip,这个静态的ip其实就是负载均衡器(注:负载均衡器是即可以访问内网也可以访问外网),负载均衡器会根据需求来找到对应的项目模块服务器,再由项目模块的服务器找到对应的mysql集群或者是redis集群,tomcat和集群一般都在内网当中,所以不用将redis设置密码。

redis宕机如何解决?如果是项目上线的宕机呢?
宕机: 服务器停止服务

如果只有一台redis
肯定会造成数据丢失。

多台reids或者是Redis集群
从的redis宕机:
配置主从复制的时候才配置从的redis, 从的redis会从主的redis中读取主的redis的操作日志,来达到主从复制。

1.只要把从的redis重新启动,再和主的进行连接就可以
2.如果从redis上面做数据的持久化,可以直接连接到主的上面,只要实现增量备份。


服务器宕机

服务器宕机可以分为两种:假死机和死机

假死机(非蓝屏死机)是由于硬件资源暂时性地被消耗殆尽,因而无法对外部指令进行响应的现象, 通常是网站处于访问高峰期,带宽等资源跑满,这时只需要等待一定的时间,待服务器腾出更多的硬件资源即可恢复正常,

而死机,如果通过ping测试服务器,键盘切换数字锁定键(NumLock)或大写锁定键(Caps Lock)功能, 显示器无画面输出,或者鼠标光标没有任何反应则表明服务器硬件故障

服务器出现宕机的常见原因

1.在运行环境的问题中,最普遍的问题时磁盘空间耗尽。

2…在性能问题中,最普通的服务器宕机原因确实是运行很糟糕的SQL, 但也不一定都是这个原因,比如也有很多问题时由于服务器Bug或错误的行为导致的。

3…糟糕的Schema和索引设计是第二大影响性能的问题。

4…复制问题通常由于主备数据不一致导致。

5.数据丢失问题通常由于drop table的错误操作导致,并总是便随着缺少可用备份的问题。

如何查看服务器宕机的原因

a、是否是应用程序导致内存溢出或者泄露,out of memory导致

b、是否是进程过多或者不断创建,耗尽资源导致

c、是否是数据库程序死锁,连接数过多导致

d、是否是应用程序异常导致

e、是否是流量负载过大导致

f、 是否是遭受黑客入侵攻击导致

g、是否是误操作导致

服务器出现宕机该如何解决

a.要即时发现服务器宕机的问题。时间就是金钱,这是不变的真理。我们要第一时间, 发现宕机的问题。如果他服务器宕机时,为了避免造成不必要的损失,要尽早通知服务商解决相关问题。

b.最好准备2个网站空间,他们存放的内容相同,而ip不同,并且机房的地理位置不同。这样2个主机, 同时宕机的可能性就大大降低了。第一时间发现宕机问题后,可以迅速的通过修改dnspod.com中的域名记录,指向目前正常的网站空间。Dnspod解析生效的时间是实时的, 而一般的dns服务器,刷新时间较长,对外声称24小时内生效,按照实际经验看来,差不多30分钟内生效,否则就要检查域名绑定是否正确了。


nginx & apache区别[lamp]

1.nginx体积小,apache体积大
2.nginx扩展性好  apache扩展性差
3.nginx抗并发能力强   apache

myisam和innodb的区别

1、myisam不支持事务处理 innodb支持事物处理
2、myisam 不支持外键 innodb支持外键
3、myisam 读取速度快 innodb写数据快
4、myisam 是我们的行级结构
innodb是我们的二叉树结构


Nginx的负载均衡方式有哪些?

官宣
①、轮询(RR)
②、权重轮询(WRR)
③、IP哈希(IP-HASH)
④、热备 Least-Con:最少连接数


进程间如何通信?

socket
管道
共享内存
消息


Mysql的索引类型?

主键索引、唯一索引、普通索引、全文索引、组合索引
主键,普通,唯一,组合
.普通索引 最基本的索引,它没有任何限制,用于加速查询。
a. 建表的时候一起创建 …
.唯一索引 索引列的值必须唯一,但允许有空值。
如果是组合索引,则列值的组合必须唯一。 a…
.主键索引 是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值。
一般是在建表的时候…
.组合索引 指多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段, 索引才会…
.全文索引 主要用来查找文本中的关键字,而不是直接与索引中的值相比较。 fulltext…


索引(为什么加快?)

物理文件【没有加索引】一行一行去比对

索引文件【加索引】生成一个 唯一的id    (二分法查找)左边永远比右边的小
	回表 (根据字段的对应id)

MySQL基本优化

优化详情

分析sql语句的执行过程
explain 或者 desc 都可以实现 查询是否加索引
当一个表数量增多时 我们将 采用 水平分表 和 垂直分表
水平分表 将 重要的数据 放到一张表里 不重要的放在另一张表里

垂直分表 将 重要的字段 放到一张表里 不重要的放在另一张表里


系统架构

什么是消息队列?消息队列能解决那些问题?常用的消息队列中间件有哪些?

消息队列是分布式系统的重要组成部分,主要解决应用耦合、异步消息、流量削锋等问题。实现高性能、高可用、可伸缩和最终一致性架构。是大型分布式系统不可缺少的中间件。
常见消息中间件: RabbitMQ 、Kafka、ActiveMQ、Redis

设计一个可以应付高负载高并发的架构(说思路)

高负载

1、 做横向扩展(多态服务器或集群)
2、 负载均衡


高并发

1、 异步
2、 多线程、协程


如何实现高可用?

Nginx高可用 keepalive
MySQL高可用 主从复制
Redis高可用 Redis集群


Session如何共享?

Redis或memcache保存session
共享目录保存session
数据库保存session

session共享解决的问题 :反向代理 中一个用户多个服务器


》说说MongoDB有什么特点?
》什么是容器?
》Docker的原理是什么?
》K8S了解多少?
》LVS的工作模式?
》什么是七层负载均衡?什么是四层负载均衡?

缓存穿透、击穿、雪崩

1、缓存穿透、击穿、雪崩描述
2、缓存穿透、击穿、雪崩描述
3、缓存穿透、击穿、雪崩描述


综合性问题

上家公司的项目上线流程是什么?

团队开发使用git,参考git-flow(git工作流)。
个人分支 + develop分支 + master分支
本地测试,线上测试,线上发布


用户反映网站慢,如何定位问题?

日志 + 服务器监控


如何提升网站的访问速度?

优化HTTP路线
浏览器端
负责均衡
Nginx
PHP-FPM
MySQL
分布式


》关系型数据库与非关系型数据库有什么区别?

说说浏览器的工作过程?

-> 用户输入URL
-> DNS查询IP
-> 建立TCP连接
-> 发送HTTP报文(请求)
-> 收到响应(html代码)
-> 解析HTML(下载资源,解析js css 渲染页面)


接口安全:

鉴权

token
jwt


签名:

key签名 两端使用同一个key字符串实现签名与验签


私钥签名+公钥验签(如支付宝支付)

加密

对称加密 : 两端共用一个key


非对称加密 :公钥加密+私钥解密 or 私钥加密+公钥解密


防刷

Redis
Openresty + Redis


跨域处理

1、Nginx:

add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,
Keep-Alive,User-Agent,
X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,
access-control-allow-origin,Authorization';

2、PHP header()函数

header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods:
 POST, GET, OPTIONS, PUT, DELETE");
header('Access-Control-Allow-Headers:
x-requested-with,content-type');

3、jsonp

jsonp的原理: < script >标签不受跨域的限制。


4、请求本域名,在本域名后台实现跨域请求


高并发场景下如何保证生成的订单号是唯一的?

提前生成好订单号(比如存在Redis中),需要的时候去Redis中取。


事务的四大特征

事务的机制通常被概括为“ACID”原则即原子性(A)、稳定性(C)、隔离性(I)和持久性(D)。

1、原子性:构成事务的的所有操作必须是一个逻辑单元,要么全部执行,要么全部不执行。

2、一致性:数据库在事务执行前后状态都必须是稳定的。

3、隔离性:事务之间不会相互影响。

4、持久性:事务一旦提交,其结果是永久的。

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

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

抵扣说明:

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

余额充值