程序员专业知识

PHP面试要点总结

2019-03-12  本文已影响43人  半亩房顶

1、引用变量

写时复制机制
$a = range(0, 1000);
var_dump(memory_get_usage());

COW Copy On Write
$b = $a;
//$b = &$a;//此时就算后续$a $b改变,也不会重新拷贝
var_dump(memory_get_usage());

对a修改之后,将会复制
$a = range(0, 1000);
var_dump(memory_get_usage());

// zval变量容器
// refcount 引用计数
// is_ref 是否有引用
// unset 只会取消引用,不会销毁空间
// 对象本身就是引用传递

2、常量和数据类型

三大数据类型 标量、复合、特殊

3、运算符考点

4、流程控制考察点

5、变量的作用域和静态变量

6、正则表达式

$str = '<b>abc<\/b>';
//后向引用
preg_replace('/<b>(.*)<\/b>/', '\\1', $str);

$str = '<b>abc</b><b>bcd</b>';
//贪婪模式
$pattern = '/<b>.*?<\/b>/';//?用于取消贪婪模式
$pattern = '/<b>.*<\/b>/U';// 或者U取消贪婪模式
preg_replace($pattern, '\\1', $str)'
$result = preg_split('/[;\r\n]+/s', $value);   // 返回数据保存在$result数组中
$pattern = '/[\x{4e00}-\x{9fa5}]+/u';

7、文件目录处理

php遍历目录

function loopDir($dir){
  $handle = opendir($dir);
  while(false !== ($file = readdir($handle))){
    if($file != '.' && $file != '..'){
      echo $file . '\n';
      if(filetype($dir . '/' . $file) == 'dir'){
        loopDir($dir. '/' . $file);
      }
    }
  }
}

8、会话控制技术

用户跟踪、用户状态保持

cookie

存储在客户端(浏览器)

session

存储在服务器,基于cookie
操作
$_SESSION
session_destory()
配置
session.auto_start
session.cookie_domain
session.cookie_lifetime
session.cookie_path
session.name
session.save_path
session.use_cookies
session.use_trans_sid
//垃圾回收,每100次session_start,有1次机会清理1440秒之前的session
session.gc_probability = 1
session.gc_divisor = 100
session.gc_maxlifetime = 1440

session传递

session_name(). '=' . session_id();

session存储

session_set_save_handler()


9、PHP类权限控制修饰符

权限控制修饰符

public 外部亦可
protected 类内部和子类
private 类内部

封装、继承、多态

10、 魔术方法

1、__get() __set()
2、__call() __callStatic()别忘了staic声明
3、__toString() php对象当做字符串使用时候调用eg. echo $obj;
4、__invoke() php对象当做函数使用时候调用eg. echo $obj();
__construct() __destruct() __isset()

11、 设计模式

12、面向对象编程的基本原则

1、单一职责。一个类只需要做好一件事情
2、开放封闭。一个类应该是可以扩展的而不可修改的
3、依赖倒置。一个类不应该强依赖另外一个类,每个类对另外的类都是可替换的。
4、配置化。尽可能使用配置而不是硬编码。
5、面向接口编程。只关心接口,而不需要关心实现。

13、php7 新特性

14、网络协议

HTTP1.1中常见状态码

1XX信息类,2XX成功类,3XX重定向,4XX客户端错误,5XX服务器错误
204 成功但没有返回数据
301 永久重定向,302临时重定向,304客户端带条件的GET,但文档内容未改变not modified
400 请求中有错误,401 需要认证
501服务器错误 ,503 服务器超负荷或停机维护中

OSI七层模型

第四层传输层 TCP/UDP
第七层应用层 HTTP/HTTPS/FTP

HTTP协议的工作特点和工作原理

工作特点:基于B/S模式;通信开销小;使用灵活,可以用超文本传输协议;节省传输时间;无状态
工作原理:客户端发送请求创建一个TCP连接,指定端口号,连接到服务器,服务器浏览器请求,收到请求,分析请求类型后,返回状态和数据

HTTP协议常见请求/响应头和请求方法

HTTPS协议的工作原理

在HTTP基础上添加了SSL/TLS握手以及数据加密传输

常见网络协议含义及端口

FTP 21 文件传输
Telnet 23 远程连接
SMTP 25 简单邮件传输协议
POP3 110 接受邮件
HTTP 80 超文本传输协议
DNS 53 域名解析服务

15、开发环境及配置

版本控制软件

集中式:SVN
分布式:Git

PHP运行原理

nginx + php-fpm(fastcgi process manager)
可以参考此文章 https://www.jianshu.com/p/648abc5a883a

PHP配置项

register_globals 注册全局变量 建议关闭
allow_url_fopen 允许远程打开文件
allow_url_include 允许远程包含文件
date.timezone 设置时区
display_errors 是否展示errors
error_reporting 错误级别设置
safe_mode 是否开启安全模式
post_max_size 提交数据最大大小

16、js和jq知识点

js基本语法

变量 字母 $ _ 开头 var声明 默认undefined

var a=1;
var a; //a值不会丢失

变量均为对象
创建对象 new Object(); 对象构造器;json对象{}
函数外变量为全局,内为局部

js内置对象

Number、String、Boolean、Array、Date、Math、RegExp
window 对象 Window、Navigator、Screen、History、Location

js html dom对象

Document、Element、Attr、Event

jq基础知识

jq选择器
jq事件
jq效果 show hide
jq dom操作 属性、值、css、尺寸

AJAX

基于XMLHttpRequest对象

17、linux知识点

常用命令

sudo 使用管理员权限执行命令
su 切换用户
chmod 修改文件权限
man 显示命令介绍
w 显示哪些用户在使用
top 持续监视进程和Linux整体性能
ps 显示进程瞬间信息
kill 杀死进程
pkill 是ps命令和kill命令的结合,按照进程名来杀死指定进程
killall 杀死所有同名进程
网络应用 curl、mail
网络测试 ping、netstat、host
网络配置 hostname、ifconfig
常用工具 ssh、screen、clear、who、date
软件包管理 yum、rpm、apt-get
文件查找和比较 locate、find
文件内容查看 head、tail、less、more
文件处理 touch、unlink、rename、ln、cat
目录操作 cd、mv、rm、pwd、tree、cp、ls
压缩 zip、unzip、tar

系统定时任务

1、crontab -e

vi/vim

shell 基础

开头: #!/bin/sh

18、MySQL知识点

MySQL 数据类型

MySQL 存储引擎

MySQL 锁机制

写锁、读锁

  • 悲观锁
    总是假设最坏的情况,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会阻塞直到它拿到锁(共享资源每次只给一个线程使用,其它线程阻塞,用完后再把资源转让给其它线程)。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。
  • 乐观锁
    总是假设最好的情况,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号机制和CAS算法实现。乐观锁适用于多读的应用类型,这样可以提高吞吐量,像数据库提供的类似于write_condition机制,其实都是提供的乐观锁。

表锁、行锁

  • 1,Record Lock:单个行记录上的锁。
  • 2,Gap Lock:间隙锁,锁定一个范围,但不包括记录本身。GAP锁的目的,是为了防止同一事务的两次当前读,出现幻读的情况。
  • 3,Next-Key Lock:1+2,锁定一个范围,并且锁定记录本身。对于行的查询,都是采用该方法,主要目的是解决幻读的问题。

MySQL 事务处理、存储过程、触发器

mysql索引的基础和类型

流程:
先找索引,根据索引找对应行
对性能影响:

mysql语句编写

题目1
UPDATE A,B set A.c1 = B.c1,A.c2=B.c2 where A.id=B.id and B.age > 50;
//OR
update A inner join B on A.id = B.id set A.c1=B.c1,A.c2=B.c2 where B.age>50;
select * from A,B
select * from A cross join B

笛卡尔积,结果集会很大没有意义

select * from A,B where A.id = B.id
select * from A (inner) join B on A.id = B.id

内连接分三类:等值连接,不等值连接和自连接

题干1
题干2
//答案
select
t1.teamName,m.matchResult,t2.teamName,m.matchTime
from 
match as m left join team as t1 on m.hostTeamID = t1.teamID,
left join team as t2 on m.guestTeamID = t2.teamID
where
m.matchTime between "2006-6-1" and "2006-7-1";

mysql查询优化

mysql高可扩展和高可用

1、分区表原理
物理底层将分区表划分为多个物理子表

mysql安全性

1、SQL查询安全方案
(1)预处理语句防止SQL注入(prepare语句)
(2)写入数据库的数据要进行特殊字符的转义
(3)查询错误信息不要返回给用户,将错误记录到日志
(4)尽量使用PDO对数据库进行相关操作,PDO拥有对预处理语句很好的支持的方法,MySQLi也有,但是可扩展性不如PDO。MySQL不支持预处理
2、mysql安全设置
(1)定期做数据备份
(2)不给查询用户root权限,合理分配权限
(3)关闭远程访问数据库权限
(4)修改root密码
(5)删除多余的用户
(6)改变root用户名称
(7)限制一般用户浏览其他库
(8)限制用户对数据文件的访问权限

框架基础知识

MVC框架工作原理

深入理解MVC
1、单一入口
(1)工作原理:用一个处理程序文件处理所有的HTTP请求,根据参数的不同区分不同的模块和操作的请求
(2)优势:

常见框架特性

1、Yaf
(1)特性:C语言编写PHP拓展形式的框架
(2)优点:执行效率高、轻量级框架、可扩展性强
(3)缺点:高版本兼容性差、底层代码可读性差、需要安装扩展、功能单一、开发需要编写大量的插件
2、Yii2
(1)特性:通用Web后端框架
(2)优点:结构简单优雅、实用功能丰富、扩展性强、性能高
(3)缺点:学习成本高,量级较重

高并发解决方案

基础概念

压力测试

测试能承受的最大并发,测试最大承受的QPS
性能测试工具:ab

优化策略

QPS=100
数据库缓存层、数据库的负载均衡
QPS=800
带宽吃紧,CDN加速,负载均衡
QPS=1000
静态HTML缓存
QPS=2000
业务分离,分布式存储
(1)流量优化
防盗链处理
(2)前端优化
减少HTTP请求、添加异步请求、启用浏览器缓存和文件压缩、CDN加速、建立独立图片服务器
(3)服务端优化
页面静态化、并发处理、队列处理
(4)数据库优化
数据库缓存、分库分表、分区操作、读写分离、负载均衡
(5)服务器优化
负载均衡(7层nginx,4层lvs)

防盗链处理

通过referer或者签名,网站可以检测目标网页访问的来源网页,一旦检测到来源不是本站即进行阻止或者返回指定的页面
nginx ngx_http_referer_module用于阻挡来源非法的域名请求
nginx指令 valid_referers,全局变量$invalid_referer


valid_referers
nginx配置

动态语言层的动态处理

进程、线程、协程

(1)进程:执行中的程序
三态模型:运行、就绪、阻塞
五态模型:新建态、终止态、活跃就绪、静止就绪、活跃阻塞、静止阻塞
(2)线程:进程中的实体
三种状态:运行、就绪、阻塞
(3)协程:用户态的轻量级线程
调度由用户控制,有自己的寄存器上下文和栈,切换时需要转移寄存器内容


线程与协程的区别
多进程、多线程
同步阻塞模型

(1)多进程
最早的服务端程序都是多进程多线程来解决并发IO的,一个请求创建一个进程,然后子进程进入循环同步堵塞地与客户端连接进行交互,收发处理数据
(2)多线程
线程可以直接与客户端联系,阻塞等待客户端连接
(3)缺点

异步非阻塞模型

很多高并发异步IO服务器程序都是基于epoll实现的
IO复用异步非阻塞程序使用经典的Reactor模型,本身不处理任何数据收发。只是可以监视一个socket句柄的事件变化


Reactor模型
PHP并发编程实践

(1)Swoole扩展


Swoole1
Swoole2

(2)消息队列

(3)接口的并发请求
curl_multi_init

数据库缓存

什么是数据库缓存

解决数据库服务器的压力
提高应用数据的响应速度
常见形式:内存缓存、文件缓存

为什么要使用缓存

为了让客户端少访问甚至不访问数据库而进行数据查询,最大程度的降低对数据库服务器的访问压力

使用MySQL查询缓存
使用Memcache缓存

中间缓存层;分布式高速缓存系统


工作原理
工作流程
使用方法
通用缓存机制
使用Redis缓存

redis和memcached的区别
1、Redis和Memcache都是将数据存放在内存中,都是内存数据库。不过memcache还可用于缓存其他东西,例如图片、视频等等;
2、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储;
3、虚拟内存--Redis当物理内存用完时,可以将一些很久没用到的value 交换到磁盘;
4、过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10;
5、分布式--设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从;
6、存储数据安全--memcache挂掉后,数据没了;redis可以定期保存到磁盘(持久化);
7、灾难恢复--memcache挂掉后,数据不可恢复; redis数据丢失后可以通过aof恢复;
8、Redis支持数据的备份,即master-slave模式的数据备份;
9、应用场景不一样:Redis出来作为NoSQL数据库使用外,还能用做消息队列、数据堆栈和数据缓存等;Memcached适合于缓存SQL语句、数据集、用户临时性数据、延迟查询数据和session等。
Memcached和Redis作为两种Inmemory的key-value数据库,在设计和思想方面有着很多共通的地方,功能和应用方面在很多场合下(作为分布式缓存服务器使用等) 也很相似,在这里把两者放在一起做一下对比的介绍

数据库优化

(1)数据类型优化
decimal
char定长,varchar变长
enum,特定固定分类
IP存储,转化为整型存储

(2)索引优化
高区分度,低查询量
复合索引前缀原则
like查询 % 问题
全表扫描优化
or条件索引使用情况,前条件有索引,后条件没索引则用不上索引了
字符串类型索引失效问题

(3)语句优化
优化查询过程中的数据访问,使用limit限制,不用select *
优化长难句,变复杂为简单,切分查询,分解关联查询
优化特定类型语句,优化count(),优化关联查询,优化子查询,优化group by 和distinct ,优化limit 和 union

(4)引擎优化
优先InnoDB

(5)表结构设计优化
分区
分库分表

(6)服务器架构优化
主从复制
二进制文件实现主从复制
读写分离
双主热备
负载均衡

负载均衡

七层负载均衡
基于URL等应用层信息的负载均衡,nginx proxy


优点
策略
配置

四层负载均衡
软件 LVS 和 硬件 F5


欢迎大家关注我的公众号

半亩房顶
上一篇 下一篇

猜你喜欢

热点阅读