2021年最新PHP 面试、笔试题汇总(二)

2021年11月23日 阅读数:3
这篇文章主要向大家介绍2021年最新PHP 面试、笔试题汇总(二),主要内容包括基础应用、实用技巧、原理机制等方面,希望对大家有所帮助。

二11、语句include和require的区别php

require是无条件包含,也就是若是一个流程里加入require,不管条件成立与否都会先执行require,当文件不存在或者没法打开的时候,会提示错误,而且会终止程序执行mysql

include有返回值,而require没有(可能由于如此require的速度比include快),若是被包含的文件不存在的化,那么会提示一个错误,可是程序会继续执行下去linux

注意:包含文件不存在或者语法错误的时候require是致命的,而include不是nginx

require_once,include_once表示了只包含一次,避免了重复包含面试

 

二12、php中传值与传引用的区别,并说明传值何时传引用redis

变量默认老是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另一个变量时,改变其中一个变量的值,将不会影响到另一个变量算法

php也提供了另一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,成为了其别名或者指向)了原始变量。改动的新的变量将影响到原始变量,反之亦然。sql

使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)数据库

对象默认是传引用apache

对于较大的数据,能够考虑传引用,这样能够节省内存的开销

 

二十3、PHP 不使用第三个变量实现交换两个变量的值

 

  •  
//方法一$a.=$b;$b=str_replace($b,"",$a);$a=str_replace($b,"",$a); //方法二list($b,$a)=array($a,$b);var_dump($a,$b);

 

 

 

 

二十4、mysql优化

MySQL查询SQL优化

 

二十5、redis 和 memache 缓存的区别

1.数据类型

redis支持多种数据类型(5种):hash string list set zset

memcache 只支持key-value

2.持久性

redis 支持两种持久化方式 RDB、AOF

memcache 不支持持久化

3.分布式存储

redis支持master-slave复制模式

memcache可使用一致性hash作分布式

4.value大小不一样

memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用

5.线程模型

memcache是master+worker的线程模型,其中master完成网络监听后投递到worker线程,由worker线程处理

redis是单进程单线程模型,即单个线程完成全部的事情

这两种实现形成下面的差别,即redis更容易实现多种数据结构,相似列表,集合,hash,有序集合等,因为是单线程的,若是单实例部署redis,不能全面用到服务器多核的优点,一般部署时,都会经过多实例的方式去部署

6.内存管理

redis:redis没有本身得内存池,而是直接使用时分配,即何时须要何时分配,内存管理的事交给内核,本身只负责取和释放,直接malloc和free便可。内存管理没有什么特殊的算法,经过使用google的jmalloc库来作内存管理(申请,释放)

memcache:memcached是有本身得内存池的,即预先分配一大块内存,而后接下来分配内存就从内存池中分配,这样能够减小内存分配的次数,提升效率,这也是大部分网络服务器的实现方式,只不过各个内存池的管理方式根据具体状况而不一样。使用了相似linux的内存管理,即slab内存管理方式。

7.其余

redis支持事务,频道(发布-订阅),集群;memcache不支持

 

二十6、apche 和 nginx 的优缺

nginx轻量级,比apache占用更少的内存及资源,抗并发

nginx处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能。

apache 相对于nginx 的优势:

rewrite比nginx 的rewrite 强大,少bug,稳定。(须要性能用nginx,求稳定就apache)。

 

二十7、一个函数的参数不能是对变量的引用,除非在php.ini中把 allow_call_time_pass_reference 设为on。

在PHP函数调用的时候,基本数据类型默认会使用值传递,而不是引用传递。allow_call_time_pass_reference 选项的做用为是否启用在函数调用时强制参数被按照引用传递。若是把allow_call_time_pass_reference 配置为on,那么在函数调用的时候会默认使用引用传值。可是不推荐使用这种方法,缘由是该方法在将来的版本中极可能再也不支持。若是想使用引用传递,那么推荐在函数调用的时候显式地使用&进行引用传递。

 

二十8、什么是内存管理?

内存管理主要是指程序运行时对计算机内存资源的分配、使用和释放等技术,内存管理的目标是高效、快速地分配内存同时及时地释放和回收内存资源。内存管理主要包括是否有足够的内存供程序使用,从内存池中获取可用内存,使用后及时销毁并从新分配给其余程序使用。

在PHP开发过程当中,若是遇到大数组等操做,那么可能会形成内存溢出等问题。一些常见的处理方法以下:

1)经过ini_set(‘memory_limit’,‘64M’)方法重置php可使用的内存大小,通常在远程主机上是不能修改php.ini文件的,只能经过程序设置。注:在safe_mode(安全模式)下,ini_set会失效。

2)另外一方面能够对数组进行分批处理,及时销毁无用的变量,尽可能减小静态变量的使用,在须要数据重用时,能够考虑使用引用(&)。同时对于数据库、文件操做完要及时关闭,对象使用完要及时调用析构函数等。

3)及时使用unset()函数释放变量,使用时须要注意如下两点:

① unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。

② 只有当指向该变量的全部变量都销毁后,才能成功释放内存。

 

二十9、Memcache的特征和特性

1)协议简单。

2)基于libevent的事件处理。

3)内置内存存储方式。

4)Memcached不互相通讯的分布式。

(1)单个item 最大的数据为1MB。

(2)单进程最大的使用内存为2GB,须要更多内存时可开多个端口。

(3)Memcached是多线程,非阻塞io复用的网络模型,Redis是单线程。

(4)键长最大为250字节。

 

 

 

三10、共享Session的方式

1)基于NFS的Session共享。NFS(Network File System)最先由Sun公司为解决Unix网络主机间的目录共享而研发。仅需将共享目录服务器mount到其余服务器的本地session目录便可。

2)基于数据库的Session共享。

3)基于Cookie的Session共享。原理是将全站用户的Session信息加密、序列化后以Cookie的方式,统一种植在根域名下(如:.host.com),利用浏览器访问该根域名下的全部二级域名站点时,会传递与之域名对应的全部Cookie内容的特性,从而实现用户的Cookie化Session 在多服务间的共享访问。

4)基于缓存(Memcache)的Session共享。Memcache是一款基于Libevent多路异步I/O技术的内存共享系统,简单的key + value数据存储模式使得代码逻辑小巧高效,所以在并发处理能力上占据了绝对优点,目前能达到2000/s平均查询,而且服务器CPU消耗依然不到10%。

 

三11、memcache或redis雪崩如何解决?

形成缘由:一般,在一个网站里,mysql数据库处理的请求比较少(20%),负载80%,缓存技术处理大多数请求(80%)

若是memcache或redis挂掉,全部请求都会在mysql处理,数据库的处理能力不足会直接宕机。这时候就算重启缓存和mysql也是无济于事的,由于缓存重启后,数据已经丢失,数据请求仍是会走mysql,mysql仍是会死掉(死循环)

解决方法:

缓存预热

1:先启动缓存,再启动数据库。(可是此时不提供对外服务)

2:经过一个PHP脚本把经常使用的key写入缓存中

3:开放对外服务【热点数据已经缓存,请求会被缓存处理,减轻mysql压力】

 

三12、Redis持久化的方式?

1.Aof(append only file)

redis执行命令时,会把咱们执行的命令经过日志形式进行追加。安全性高,可是影响性能。

2.Rdb

按照制定规则进行持久化

save 900 1 (900s内1次redis操做 会作一次持久化)

save 300 10 (300s内10次redis操做 会作一次持久化)

save 60 10000 (60s内10000次redis操做 会作一次持久化)

可是可能会存在数据丢失,好比:12:00作过一次持久化,正常的话,12:15会再作持久化,若是12:14缓存死掉,那么14分钟的数据会丢失。不大安全,可是性能比aof好不少

 

三十3、Linux系统中,进程间通讯的方式。

管道:

管道分为有名管道和无名管道

无名管道是一种半双工的通讯方式,数据只能单向流动,并且只能在具备亲缘关系的进程间使用.进程的亲缘关系通常指的是父子关系。无明管道通常用于两个不一样进程之间的通讯。当一个进程建立了一个管道,并调用fork建立本身的一个子进程后,父进程关闭读管道端,子进程关闭写管道端,这样提供了两个进程之间数据流动的一种方式。

有名管道也是一种半双工的通讯方式,可是它容许无亲缘关系进程间的通讯。

消息队列:

消息队列是消息的链表,存放在内核中并由消息队列标识符标识.消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等特色.消息队列是UNIX下不一样进程之间可实现共享资源的一种机制,UNIX容许不一样进程将格式化的数据流以消息队列形式发送给任意进程.对消息队列具备操做权限的进程均可以使用msget完成对消息队列的操做控制.经过使用消息类型,进程能够按任何顺序读信息,或为消息安排优先级顺序.

信号:

信号是一种比较复杂的通讯方式,用于通知接收进程某个事件已经发生.

信号量:

信号量是一个计数器,能够用来控制多个线程对共享资源的访问.,它不是用于交换大批数据,而用于多线程之间的同步.它常做为一种锁机制,防止某进程在访问资源时其它进程也访问该资源.所以,主要做为进程间以及同一个进程内不一样线程之间的同步手段.

共享内存:

共享内存就是映射一段能被其余进程所访问的内存,这段共享内存由一个进程建立,但多个进程均可以访问.共享内存是最快的IPC(进程间通讯)方式,它是针对其它进程间通讯方式运行效率低而专门设计的.它每每与其余通讯机制,如信号量,配合使用,来实现进程间的同步与通讯.

socket:

可用于不一样及其间的进程通讯

文件,互斥量等,不过我在swoole源码中看到了经过eventfd这种方式作进程通讯的

 

 

三十4、海量数据处理相关总结

一、海量日志数据,提取出某日访问百度次数最多的那个IP。

算法思想:分而治之+Hash

IP地址最多有2^32=4G种取值状况,因此不能彻底加载到内存中处理

能够考虑采用“分而治之”的思想,按照IP地址的Hash(IP)%1024值,把海量IP日志分别存储到1024个小文件中。这样,每一个小文件最多包含4MB个IP地址

对于每个小文件,能够构建一个IP为key,出现次数为value的Hash map,同时记录当前出现次数最多的那个IP地址

能够获得1024个小文件中的出现次数最多的IP,再依据常规的排序算法获得整体上出现次数最多的IP

 

三十5、两台mysql服务器,其中一台挂了,怎么让业务端无感切换,并保证正常状况下讲台服务器的数据是一致的

不是核心业务的话,先停写,把备机拉起来,查看两台机器的日志,进行数据补偿,开写。

若是是核心业务的话,如今全部的写操做都在正常的状态机器上。把好的这台机器的备机拉起来,当主机。

备机的数据不一致怎么办?

你要勇敢怼回去,大家每秒多少写入操做。按照百万级表,每秒1000的写入效率,正常的设计是,分布在2台机器上每台500。这个级别的数据同步,出现差别的几率 能够忽略不计的。有一台出现问题,另外一台也能够抗住。

 

2021年最新PHP 面试、笔试题汇总(二)_经验分享

 

三十6、redis是如何进行同步的,同步的方式,同步回滚怎么办,数据异常怎么办

redis 集群主从同步的简单原理

Redis的复制功能是基于内存快照的持久化策略基础上的,也就是说不管你的持久化策略选择的是什么,只要用到了Redis的复制功能,就必定会有内存快照发生

当Slave启动并链接到Master以后,它将主动发送一个SYNC命令( 首先Master会启动一个后台进程,将数据快照保存到文件中[rdb文件] Master 会给Slave 发送一个

Ping命令来判断Slave的存活状态 当存活时 Master会将数据文件发送给Slave 并将全部写命令发送到Slave )。Slave首先会将数据文件保存到本地以后再将数据加载到内存中。

当第一次连接或者是故障后,从新链接都会先判断Slave的存活状态再作所有数据的同步,以后只会同步Master的写操做(将命令发送给Slave)

问题:

当 Master 同步数据时 若数据量较大 而Master自己只会启用一个后台进程 来对多个Slave进行同步 , 这样Master就会压力过大 , 并且Slave 恢复的时间也会很慢!

redis 主从复制的优势:

(1)在一个Redis集群中,master负责写请求,slave负责读请求,这么作一方面经过将读请求分散到其余机器从而大大减小了master服务器的压力,另外一方面slave专一于提供

读服务从而提升了响应和读取速度。

(2)在一个Redis集群中,若是master宕机,slave能够介入并取代master的位置,所以对于整个Redis服务来讲不至于提供不了服务,这样使得整个Redis服务足够安全。

(3)水平增长Slave机器能够提升性能

 

三十7、如何解决跨域

JSONP

添加响应头,容许跨域

代理的方式

 

三十8、写出如下输出

 

  •  
Q: "aa" == 1, "aa" == 0, 1 == "1", 1==="1", "12asdsad" + 1, "asdjkfgj12"+1A: false, true, true, false, 13, 1

why:

php中 字符串==0 恒成立

php中 字符串和数字相加,若是字符串开头是数字,则等于字符串开头的数字(字符串第一个位置开始,到第一个非数字和.的位置截止)+数字

 

三十9、什么是服务容器、控制反转(IoC)、依赖注入(DI)

服务容器是用来管理类依赖与运行依赖注入的工具。Laravel框架中就是使用服务容器来实现 控制反转 和 依赖注入 。

控制反转(IoC) 就是说把建立对象的 控制权 进行转移,之前建立对象的主动权和建立时机是由本身把控的,而如今这种权力转移到第三方,也就是 Laravel 中的容器。

依赖注入(DI)则是帮助容器实如今运行中动态的为对象提供提依赖的资源。

 

四10、Composer自动加载原理

composer加载核心思想是经过composer的配置文件在引用入口文件(autoload.php)时,将类和路径的对应关系加载到内存中,最后将具体加载的实现注册到spl_autoload_register函数中.最后将须要的文件包含进来.

 

四11、一个请求到PHP,Nginx的主要过程。完整描述整个网络请求过程,原理。

1)、FastCGI进程管理器php-fpm自身初始化,启动主进程php-fpm和启动start_servers个CGI 子进程。主进程php-fpm主要是管理fastcgi子进程,监听9000端口。fastcgi子进程等待来自Web Server的链接。

2)、当客户端请求到达Web Server Nginx是时,Nginx经过location指令,将全部以php为后缀的文件都交给127.0.0.1:9000来处理,即Nginx经过location指令,将全部以php为后缀的文件都交给127.0.0.1:9000来处理。

3)FastCGI进程管理器PHP-FPM选择并链接到一个子进程CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程。

4)、FastCGI子进程完成处理后将标准输出和错误信息从同一链接返回Web Server。当FastCGI子进程关闭链接时,请求便告处理完成。

5)、FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个链接。

 

四12、PHP的魔术方法

__set() // 在给不可访问属性赋值时,__set()会被调用

__get() // 读取不可访问属性的值时,__get()会被调用

__isset() //当对不可访问属性调用isset()或empty(),__isset()会被调用

__unset() // 当对不可访问属性调用unset()时,__unset()会被调用

__call() // 在对象中调用一个不可访问方法时,__call()会被调用

__callStatic() // 在静态上下文中调用一个不可访问的方法时,__callStatic会被调用

__construct() // 构造函数的类会在每次建立新对象时先调用此方法,因此很是适合在使用对象以前作一些初始化工做。

__destruct() // 析构函数会在到某个对象的全部引用都被删除或者当对象被显式销毁时执行。

__sleep() // serialize()函数会检查类中是否存在一个魔术方法__sleep(),若是存在,该方法会先被调用,而后再执行序列化操做。此功能能够用于清理对象,并返回一个包含对象中全部应被序列化的变量名称的数组。若是该方法未返回任何内容,则 NULL 被序列化,并产生一个 E_NOTICE 级别的错误。

__wakeup() // unserialize()函数会检查是否存在一个__wakeup()方法,若是存在,则会先调用该方法,而后再执行反序列化操做。__wakeup() 常常用在反序列化操做中,例如从新创建数据库链接,或执行其它初始化操做。

 

四十3、字符编码UTF八、GBK、GB2312的区别。

utf8是国际编码。通用性较好。

gbk是国内编码。通用型较utf8差,可是占用数据库比utf8小。

gb2312是一个简体中文字符集的中国国家标准,共收录6763个汉字。

 

四十4、MySQL默认的排序方式是什么

MyIsam存储引擎:在没有任何删除,修改的操做下,执行select不带order by那么会按照插入的顺序下进行排序。

InnDB存储引擎:在相同的状况下,select不带order by会根据主键来排序,从小到大。

 

四十5、OSI七层网络模型

物理层:创建、维护、断开物理链接

数据链路层:创建逻辑连接、进行硬件地址寻址、差错校验等功能(SDLC、HDLC、PPP、STP)

网络层:进行逻辑地址寻址,实现不一样网络之间的路径选择(IP、IPX、OSPF)

传输层:定义传输数据的协议端口号,以及流程和差错校验(TCP,UDP)数据包一旦离开网卡即进入网络传输层

会话层:创建、管理、终止会话

表示层:数据的表示、安全、压缩

应用层:网络服务与最终用户的一个接口;协议有:HTTP、FTP、TFTP、SMTP、DNS、TELNET、HTTPS、POP三、DHCP