PHP面试问题总结整理

本文详细总结了PHP面试中常见的问题,涵盖主从复制、MySQL优化、事务特性、索引、PHP扩展安装、Web服务器原理、Linux命令、框架及支付接口等知识点,帮助读者全面了解PHP开发所需技能。
摘要由CSDN通过智能技术生成

  1. 主从复制的原理是什么?主从复制中断了怎么办?主从复制出现延迟怎么处理?主库崩溃了怎么办?

  原理:

原理:主从复制一共有三个进程,从库生成两个线程,一个I/O线程,一个SQL线程;

i/o线程去请求主库 的binlog,并将得到的binlog日志写到relay log(中继日志) 文件中;

主库会生成一个 log dump 线程,用来给从库 i/o线程传binlog;

SQL 线程,会读取relay log文件中的日志,并解析成具体操作,来实现主从的操作一致,而最终数据一致;

  主从复制出现错误?

 错误一:

错误原因:从库用来连接主库的用户权限或者密码不对

解决方法:首先在主库上检查用来主从复制的用户权限,如果没有问题在检查从库使用的密码是否正确。

错误二:

错误原因:这个可能是从库的master.info文件有损坏。

解决方法:reset slave

错误三:

错误原因:可能是从库的约束比主库更多写造成的。

解决方法:

Mysql > stop slave;

Mysql > set global sql_slave_skip_counter =1 ;

Mysql > start slave;

错误四:

错误原因:slave上缺少错误中的表。

解决方法:在slave上添加上对应的表,然后start slave。

错误五:

错误原因:从库上对应的表上缺少字段。

解决方法:根据主库上表结构,在从库对应表上添加缺少的字段,然后start slave。

错误六:

错误原因:主库删除的表在从库中不存在,导致从库在遇到删除不存在表的错误时无法继续同步。

解决方法:利用slave-skip-errors参数,跳过对于的1146错误(这个参数是一个只读的,需要在配置文件中修改,并重启从库)

1、在my.cnf的[mysqld]下面添加slave_skip_errors=1146

2、重启从库 service mysq   jhl restart

3、在从库上启动同步

4、去掉my.cnf中的slave_skip_errors=1146

5、重启从库

6、启动从库复制`1

中断

Show slave status\G;查看错误原因

1.show slave status\G,提示中继日志损坏,按以往的做法,根据提示重新指定合适的日志文件以及pos点。

2.  从MySQL5.5.X版本开始,增加了relay_log_recovery参数,这个参数的作用是:当slave从库宕机后,假如relay-log损坏了,导致一部分中继日志没有处理,则自动放弃所有未执行的relay-log,并且

重新从master上获取日志,这个参数是默认关闭的。做主从的时候没有开启这项参数。修改my.cnf,添加这两项。(skip-slave-start ,mysql服务启动跳过自动启动主从复制,以免产生新的问题),relay_log_recovery不支持动态修改。所以修改配置文件,重启MySQL服务,启动主从复制线程

a、主从同步延迟与系统时间的关系,查看主从两台机器间系统 时间差   

c、主从同步延迟与lock锁的关系(myisam表读时会堵塞写),尽量避免使用myisam表。一个实例里面尽量减少数据库的数量。

d、主从复制发生异常而中断,过很久之后才发现复制异常。可通过查看master与slave的status估算相差的日志。如果相差太大,则可以考虑重做从库。

产生的原因:当主库的并发量比较大的时候,产生的DDL数量,超过线程所承受的范围,延时就产生了,还有可能是与slave的大型query语句产生了锁等待;

解决办法:在架构上做优化,尽量让主库的DDL快速执行,因为从库只是读取数据,不需要那么高的安全性,所以可以将sync_binlog设置为0,或者关闭binlog日志,或者是使用比主库更好的硬件设备作为slave

可以暂时存缓存里

从库不能执行大量写入(5.6是支持库的并发,5.7支持了一个库多个表的并发执行)

https://www.cnblogs.com/gomysql/p/3675429.html

MHA :原理

(1)从宕机崩溃的master保存二进制日志事件(binlog events);

(2)识别含有最新更新的slave;

(3)应用差异的中继日志(relay log)到其他的slave;

(4)应用从master保存的二进制日志事件(binlog events);

(5)提升一个slave为新的master;

(6)使其他的slave连接新的master进行复制;

  1. Redis有哪些数据类型?

String hash,set,zset, list

  1. Redis和memcache的区别是什么?

从存储大小 Memcached单个key-value大小有限,一个value最大只支持1MB,key 最大250个字符,而Redis最大支持512MB

从可靠性 Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高

区别:

1:memcache和redis都是将数据存储到内存中,都是内存数据库,不过memcache还可以缓存其他东西,图片视频等。

2:存储类型不同,memcache只支持k-v结构,redis支持五种数据类似,字符串,链表,哈希,集合,有序集合。

3:虚拟内存,当redis物理内存使用完后,可以将一些很久没有使用过的value交换到磁盘

4:分布式设定memcache集群,利用magenta做一主多从,redis可以做一主多从,也可以一主一从。

5:存储数据redis持久化,memcache关机后数据消失

6:数据恢复,memcache挂掉后,数据不可恢复,redis数据丢失后可以通过AOF日志恢复

7:应用场景不同,redis除啦作为数据库使用之外,还能做消息队列,数据堆栈和数据缓存等,memcache适用于缓存sql语句,数据集,用户临时性数据,延迟查询数据 session等

  1. Redis在项目中怎么用的?

查询数据多的页面做缓存比如页面缓存首页

  1. Mysql数据库优化做过哪些工作

 1:建表时选择适合字段的数据类型,合适的长度

2:查询多的字段加索引 sql语句优化

3:分页优化

4:分区分表

5:主从复制,读写分离

  1. Myisam和innodb的区别是什么?

innodb写操作快、支持事务、数据行锁、 支持外键, InnoDB的主键范围更大,最大是MyISAM的2倍。

MyISAM不支持事务和外键,读操作快、 支持数据锁表、 GIS数据 、全文索引(因为它不支持中文分词,所以 MyISAM的全文索引其实没啥用)。

   

  1. 你了解哪些算法?

冒泡快速二分,归并

  1. 负载均衡怎么搭建的?nginx属于第几层负载均衡?nginx对于请求的分配有哪些策略模式?

反向代理  第7层

轮询加权轮询IP负载均衡cdn负载均衡

  1. 网络七层协议有哪些?

物理层数据链路层网络层传输层会话层表示层应用层

 PHP

  1. 请说出10个字符串函数和10个数组函数

Substr(截取),strlen(长度),str_replace替换strpos查找并返回首个匹配项的位置),substr_count(出现次数),explode(字符串分割数组)

Rtrim(去除右面空格)ltrim(去除左边空格)trim(去除两边)str_split 函数把字符串分割到数组中。

In_array(),  is_array(),  implode(),  array_merge(), array_keys(),  array_values(),  sort(),  array_pop(删除数组最后一个元素), array_shift(删除数组第一个元素并返回值)  array_push(插入数组末尾)

你了解哪些设计模式?

单例模式,工厂模式,简单工厂模式,策略模式,观察者模式

  1. 请说一下get和post的区别

 get和post区别,唯一区别一个是用过url实现,另外一个是通过数据包;本质是http的原因,

关于GET/POST大小说法,这个是关于浏览器(发送http请求)和服务器(接收http请求)的关系,

(大多数浏览器url限制2K个字节,大多数服务器只处理64k之内的url)

Get不是特别安全post安全性更高

  1. 请描述一下session和cookie的区别,session信息的存储方式,如何进行遍历?

1:session存储在服务器端,cookie存储在客户端

2:session默认存储在服务器的一个文件里(不是内存)

3:session的运行依赖session id ,而session id是存在cookie中的,也就是说如果浏览器禁用了cookie,同时session也会失效,(但是可以通过其他方式实现session ,比如在url中传递session id)

4:session 可以放在文件,数据库,或者是内存中,默认是存储在文件中,都可以

5:用户验证一般都会用session

  1. 请说一下你对mvc的理解

M model是应用程序中用于处理应用程序数据逻辑的部分。

模型层主要于数据库进行交互

V view是应用程序中处理数据显示的部分。

视图层展示给用户看的页面

C是应用程序中处理用户交互的部分。

通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。

  1. 请描述一下php-fpm的工作原理

FastCGI进程管理器   

请求到nginx通过fastcgi协议,fastcgi会找php-fpm解析php文件,php-fpm有两个进程,master进程和worker进程,worker进程会解析php代码最后将结果返回给nginx

 Mysql

  1. varchar和char的区别

char 长度固定,varchar长度是变化的。

比如:  char (10) 表示存储的字节就是占10字节

但是varchar(10) ,10是最大值,字节按照存储字节算

  1. 什么是数据库索引?mysql有哪些索引?主键索引和唯一索引有什么区别?

 索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息数据库索引好比是一本书前面的目录,能加快数据库的查询速度。

普通索引

主键索引,(要求主键中的每个值都唯一。

唯一索引,(唯一索引是不允许其中任何两行具有相同索引值的索引。

复合索引,

全文索引

  区别:http://blog.csdn.net/tanga842428/article/details/52790651

  1. Myisam和innodb的区别是什么?为什么innodb比myisam写入快?

innodb写操作快、支持事务、数据行锁、 支持外键 InnoDB的主键范围更大,最大是MyISAM的2倍。

MyISAM不支持事务和外键,读操作快、 支持数据锁表、 GIS数据 、

在高并发的情况下,因为innodb支持行锁可以多行操作,而myisam只支持表锁只能一个一个操作所以慢

  1. 请列举出你所了解的会引起索引失效的情况

 1.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因)

    注意:要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

  2.对于多列索引,不是使用的第一部分,则不会使用索引(最左原则)

  3.like查询是以%开头      

  4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

  5.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

  6对索引列运算,运算包括(+、-、*、/、!、<>、%、like'%_'(%放在前面)、in、exist等),导致索引失效。

  7.在JOIN、UNION操作中,主键和外键的数据类型不相同,MYSQL将无法使用索引

  8.is null 索引失效,is not null Betree索引生效。导致的原因:mysql没有在null写进索引           

  9.对索引应用内部函数,这种情况下应该建立基于函数的索引                 

 explain select * from demo_range t where round(t.title)=1

  1. 在mysql中值为空和值为null有什么区别?

空值('')是不占用空间的    NULL其实是占用空间的

在进行count()统计某列的记录数的时候,如果采用的NULL值,会别系统自动忽略掉,但是空值是会进行统计到其中的。

  1. left join、right join、inner join的区别是什么?

left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录
right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录
inner join(等值连接) 只返回两个表中联结字段相等的行

  1. 请描述一下sql语句的执行顺序  

https://www.cnblogs.com/spring-hailong/p/6182227.html

 (11)limit

  1. 请描述一下你对mysql连接池的理解

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个

1. 最小连接数

是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费。

2. 最大连接数

是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

  1.  事物的四大特性和事物的隔离级别

   原子性(Atomicity)

 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,

一致性(Consistency)

 一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。

隔离性(Isolation)

 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

持久性(Durability)

 持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

不考虑事务的隔离性,会发生的几种问题:

   脏读

 脏读是指在一个事务处理过程里读取了另一个未提交的事务中的数据。

不可重复读

 不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了

虚读(幻读)

幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。

    现在来看看MySQL数据库为我们提供的四种隔离级别:

① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。

② Repeatable read (可重复读):可避免脏读、不可重复读的发生。

③ Read committed (读已提交):可避免脏读的发生。

④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。

Linux

PHP的所有应用程序都是通过WEB服务器(如IIS或Apache)和PHP引擎程序解释执行完成的,工作过程:

(1)当用户在浏览器地址中输入要访问的PHP页面文件名,然后回车就会触发这个PHP请求,并将请求传送化支持PHP的WEB服务器。

(2)WEB服务器接受这个请求,并根据其后缀进行判断如果是一个PHP请求,WEB服务器从硬盘或内存中取出用户要访问的PHP应用程序,并将其发送给PHP引擎程序。

(3)PHP引擎程序将会对WEB服务器传送过来的文件从头到尾进行扫描并根据命令从后台读取,处理数据,并动态地生成相应的HTML页面。

(4)PHP引擎将生成HTML页面返回给WEB服务器。WEB服务器再将HTML页面返回给客户端浏览器。

简言之:apache是WEB服务器,它可以解析php语言。

  1. 请描述PHP-FPM的工作原理

PHP-FPM是一个PHP FastCGI进程管理器,是只用于PHP的

PHP-FPM提供了更好的PHP进程管理方式,可以有效控制内存和进程、可以平滑重载PHP配置

请求到nginx通过fastcgi协议,fastcgi会找php-fpm解析php文件,php-fpm有两个进程,master进程和worker进程,worker进程会解析php代码最后将结果返回给nginx

  1. 如何安装php扩展?

1:使用apt或者yum命令安装(如果PHP是通过 apt 或者 yum 命令安装的,则扩展也可以通过 apt 或者 yum 安装)

2:使用pecl安装

3:源码编译安装(一般是安装PHP自带的扩展,以安装pcntl扩展为例)

4:phpize安装(要安装的扩展在php源码ext目录中没有,那么这个扩展需要到http://pecl.php.net 搜索下载)

  1. nginx和Apache的区别是什么?

1:nginx是轻量级,比apache占用更少的内存以及资源

2:apache比nginx的rewrite强大,模块多,bug少,稳定性强,

3:apache对php支持比较简单,nginx需要配合其他后端用,apache组件比nginx多,现在nginx是web服务器的首选

4:最核心的区别是apache是同步多进程模型,一个连接对应一个进程,多个连接(千万级别)可以对应一个进程

5:nginx:配置文件写的很简洁,正则配置让很多事情变得简单运行效率高,占用资源少,代理功能强大,很适合做前端响应服务器 

6:Apache在处理动态有优势,Nginx并发性比较好,CPU内存占用低,如果rewrite频繁,那还是Apache吧

7:动态请求要apache去做,nginx只适合静态和反向

  1. 请说出常用的10个Linux操作命令(ll ls cd除外)

top 查看内存

df-lh 查看磁盘     ps -a 查看所有进程

修改权限     chomd

修改所有者  chown    压缩  tar -zcvf

解压  tar -zxv     查看日志   tail -f

查找   find locate  复制    dd    删除   rm

杀死进程    kill    创建文件夹    mkdir

移动:mv  报告现行正在工作的或当前目录    pwd

Tail    末端打开文件

  1. 如何查看一个进程是否在运行

Ps aux |grep 查看的那个  |  ps -ef | grep xxx

  1. 如何查看服务器当前CPU使用情况

CPU占用率 top

  1. 什么是fast_cgi,什么是cgi.什么是php-fpmcgi, php cgi,他们之间的区别

Cgi 看做是一个面向过程        php_cgi(php里的面向过程)  

fast_cgi 就是一个面向对象(mvc)        php_fpm (各种框架)

  1. session 于cookie的 原理及token 的作用?

Cookie概念

      在浏览某些 网站 时,这些网站会把 一些数据存在 客户端 , 用于使用网站 等跟踪用户,实现用户自定义 功能.

Session的概念

   Session 是存放在服务器端的类似于HashTable结构来存放用户数据;

   作用:实现网页之间数据传递,是一个存储在服务器端的对象集合。

   原理当用户请求一个Asp.net页面时,系统将自动创建一个Session;退出应用程序或关闭服务器时,该Session撤销。系统在创建Session时将为其分配一个长长的字符串标识,以实现对Session进行管理与跟踪。

Token

1</

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值