PHP面试题

  • mysql 存储引擎mysam和innodb 的区别?

    1.myisam 存储引擎的特点 表级锁不支持事务和全文索引。
    2.innodb 存储引擎的特点 行级锁支持事务,支持外键,不支持fulltext类型索引。
    3.mysql 表级锁有两种模式;表共享读锁 和表独占写锁。什么意思呢,就是说对myisam表进行读操作时,它不会阻塞其他用户对同一表的读请求,但会则阻塞对同一表的写操作;而对myisam表的写操作,则会阻塞其他用户对同一表的读和写操作。
    4.innodb行锁是通过给索引项加锁来实现的,即只有通过索引条件检索数据,innodb才使用行级锁。否则将使用表锁。行级锁在每次获取锁和释放锁的操作小消耗比表锁更多的资源。在innodb两个事务发生思索的时候,innodb是检测不到的。只能依靠锁定超时来解决。innodb中不保存表的具体行数,也就是说,执行select count() from table 时,innodb 要扫描一遍整个表来计算有多少行,但是myisam只要简单的读出保存好的行数即可。注意的是,当count()语句包含where条件时,两种表的操作是一样的。
    5.myisam适合:
    (1)做很多count的计算。
    (2)插入不频繁,查询非常频繁,如果执行大量的select,myisam 是更好的选择。
    (3)没有事务。
    6.innodb适合:
    (1)可靠性要求比较高,或者要求事务;
    (2)表更新和查询都相当的频繁,并且表锁定的机会会比较大的情况指定数据引擎的创建;
    (3)如果你的数据执行大量的insert或update,出于性能的考虑,应该使用innodb表;
    (4)delete from table 时,innodb不会重新建立表,而是一行行的删除
    (5)load table from mysster 操作对innodb 是不起作用的,解决方法是首先把innodb表改成myisam表
    导入数据后再改成innodb表,但是对于使用的额外的innodb特性(例如外键)的表不适用。
    要注意,创建每个表格的代码是相同的,除了最后的type参数,这一参数用来指定数据引擎。
    7.其他区别:
    (1)对于auto_increment类型的字段,innodb中必须包含只有该字段的索引,但是在myisam表中,可以和其他字段一起建立联合索引。
    (2)delete from table 时,innodb不会重新建立表,而是一行一行的删除。
    (3)innodb存储引擎被完全与mysql服务器整合,innodb 存储引擎为主内存中缓存数据和索引而维持它自己的缓冲池。
    (4)对于自增长的字段,innodb 中必须包含只有该字段的索引,但是在myisam表中可以和其他字段一起建立联合索引。
    (5)清空整个表时,innodb是一行一行的删除,效率非常慢。myisam则会重新建表。

  • php魔术变量(8个)

    1.LINE 文件中的当前行号。
    2.FILE 文件的完整路径和文件名。如果用在被包含文件中,则返回被包含的文件名。
    3.DIR 文件所在的目录。如果用在被包括文件中,则返回被包括的文件所在的目录。
    4.FUNCTION 常量返回函数被定义时的名字
    5.CLASS 常量返回该类被定义时的名字(区分大小写)。
    6.METHOD 类的方法名 (PHP5.0.0新加)。返回该方法被定义时的名字(区分大小写)。
    7.NAMESPACE 当前命名空间的名称(区分大小写)。此常量是在编译时定义的(PHP5.3.0新增)

  • php 魔术函数

    1._construct() 实例化对象时被调用,当_construct和以类名为函数名的函数同时存在时,_construct将被调用,另一个不被调用。
    2._destruct() 当删除一个对象或对象操作终止时被调用。
    3._call() 对象调用某个方法,若方法存在,则直接调用;若不存在,则会去调用_call 函数。
    4._get() 读取一个对象的属性时,若属性存在,则直接返回属性值; 若不存在,则会调用_get函数。
    5._set() 设置一个对象的属性时,若属性存在,则直接赋值; 若不存在,则会调用_set()函数。
    6._tostring() 打印一个对象的时候被调用。如echo $obj; 或print $obj;
    7._clone() 克隆对象时被调用。如:$t = new Test(); $t1= clone $t;
    8._sleep() serialize之前被调用。若对象比较大,想删减一点东东载序列化,可考虑一下此函数。
    9._wakeup() unserialize时被调用,做些对象的初始化工作。
    10._isset() 检测一个对象的属性是否存在时被调用。如 isset($c->name);
    11._unset() unset一个对象的属性时被调用
    12._set_state() 调用var_export时,被调用。用__set_state的返回值作为var_export的返回值
    13.__autoload() 实例化一个对象时,如果对应的类不存在,则该方法被调用。

  • 三次握手建立连接

    1.客户端向服务端发送一个寻求地址的请求码:seq = 100 服务端返回 ask = 101。
    2.客户端向服务端发送一个确认请求码 seq = 101 服务端返回 ask = 300。
    3.客户端向服务端发送一个链接请求码 ack = 300 服务端返回 ask = 800。

  • 四次挥手断开连接

    1.c->s 发送一个数据验证请求编码 seq= 1000 ,s->c 返回一个应答ack = 10002
    2.c->s 发送一个传输结束标记 seq=10002 s->c 返回一个应答ack :10003
    3.c->s 发送一个确认结束标记 seq=10003 , s->c 返回一个应答 ack:10004
    4.c->s 发送连接断开标记 seq=10004;s->c 返回断开连接应答ack=10005

  • 进程和线程的区别

    1.进程是资源分配的最小单位,线程是程序执行的最小单位(资源调度的最小单位)
    2.进程有自己的独立地址空间,每启动一个进程,系统就会为他分配地址空间,建立数据表来维护代码段、堆栈段,这种操作非常昂贵。而线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费比进程要小很多,同时创建一个线程的开销也比进程要小很多。
    3.线程之间的通信更方便,同一进程下的线程共享全局变量,静态变量等数据,而进程之间的通信需要通信需要以通信方式进行。不过如何处理好同步与互斥是编写多线程程序的难点。
    4.但是多进程程序更健壮,多线程程序只要一个线程死掉,整个进程也死掉了,而一个进程死掉并不会影响另外一个进程造成影响,因为进程有自己独立的地址空间。

  • 堆与栈

    堆:是大家共有的空间,分全局堆和局部堆。全局堆就是所有没有分配的空间,局部堆就是用户分配的空间。堆在操作系统对进程初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了还给操作系统,要不然就是内存泄露。
    栈:是个线程独有的,保存其运行状态和局部自动变量的。栈在线进程开始的时候初始化,每个线程的栈互相独立,因此,栈是thread safe的。操作系统在切换线程的时候会自动的切换栈,就是切换ss/esp寄存器。栈空间不需要在高级语言里面显示的分配和释放。

  • PHP的运行模式

    一、CGI(通用网关接口)
    1、CGI把网页和Web服务器中的执行程序连接起来,它把HTML接收的指令传递给服务器的执行程序,再把服务器执行程序的结果返还给HTML页。CGI 的跨平台性能极佳,几乎可以在任何操作系统上实现。CGI已经是比较老的模式了,这几年都很少用了。
    2、每有一个用户请求,都会先要创建CGI的子进程,然后处理请求,处理完后结束这个子进程,这就是Fork-And-Execute模式。 当用户请求数量非常多时,会大量挤占系统的资源如内存,CPU时间等,造成效能低下。所以用CGI方式的服务器有多少连接请求就会有多少CGI子进程,子进程反复加载是CGI性能低下的主要原因。

    二、FastCGI(常驻型)
    1、FastCGI是CGI的升级版本,FastCGI像是一个常驻型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去请求一次 。
    2、FastCGI是一个可伸缩地、高速地在HTTP server和动态脚本语言间通信的接口。多数流行的HTTP server都支持FastCGI,包括Apache、Nginx等,同时,FastCGI也被许多脚本语言所支持,其中就有PHP。
    3、FastCGI接口方式采用C/S结构,可以将HTTP服务器和脚本解析服务器分开,同时在脚本解析服务器上启动一个或者多个脚本解析守护进程。当HTTP服务器每次遇到动态程序时,可以将其直接交付给FastCGI进程来执行,然后将得到的结果返回给浏览器。这种方式可以让HTTP服务器专一地处理静态请求或者将动态脚本服务器的结果返回给客户端,这在很大程度上提高了整个应用系统的性能。

    三、CLI(命令行运行)
    PHP在命令行运行的接口,区别于在Web服务器上运行的PHP环境(PHP-CGI,ISAPI等)。 也就是说,PHP不单可以写前台网页,它还可以用来写后台的程序。 PHP的CLI Shell脚本适用于所有的PHP优势,使创建要么支持脚本或系统甚至与GUI应用程序的服务端,在Windows和Linux下都是支持PHP-CLI模式的。
    【优点】
    (1)使用多进程,子进程结束以后,内核会负责回收资源;
    (2)使用多进程,子进程异常退出不会导致整个进程Thread退出,父进程还有机会重建流程;
    (3)一个常驻主进程,只负责任务分发,逻辑更清楚。

    四、模块模式
    2、模块模式mod_php5模块的形式集成,此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求,然后将处理后的结果返回给Apache。如果我们在Apache启动前在其配置文件中配置好了PHP模块,(mod_php5), PHP模块通过注册apache2的ap_hook_post_config挂钩,在Apache启动的时候启动此模块以接受PHP文件的请求。
    1、除了这种启动时的加载方式,Apache的模块可以在运行的时候动态装载,这意味着对服务器可以进行功能扩展而不需要重新对源代码进行编译,甚至根本不需要停止服务器。我们所需要做的仅仅是给服务器发送信号HUP或者AP_SIG_GRACEFUL通知服务器重新载入模块。但是在动态加载之前,我们需要将模块编译成为动态链接库。此时的动态加载就是加载动态链接库。 Apache中对动态链接库的处理是通过模块mod_so来完成的,因此mod_so模块不能被动态加载,它只能被静态编译进Apache的核心。这意味着它是随着Apache一起启动的。

    五、ISAPI模式
    1、ISAPI是微软提供的一套面向Internet服务的API接口,一个ISAPI的DLL,可以在被用户请求激活后长驻内存,等待用户的另一个请求,还可以在一个DLL里设置多个用户请求处理函数,此外,ISAPI的DLL应用程序和WWW服务器处于同一个进程中,效率要显著高于CGI。(由于微软的排他性,只能运行于windows环境)
    ————————————————
    版权声明:本文为CSDN博主「FOUNG1992」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_18991813/article/details/99961138

  • 死锁产生的四个条件

    1互斥条件 2 占有和等待 3 不可剥夺 4 循环等待

  • 数据库事务

    访问并且可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的所有数据库操作组成。

  • mysql事务特性及隔离级别;事务并发一般会产生那些问题,应该如何解决?

    特性:原子性,一致性,隔离性,持久性
    隔离级别:读未提交,读已提交,可重复读,串行化
    事务产生的问题:
    1.更新丢失(lost update):当两个或多个事务选择一行,然后基于最初选定的值更新改行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题,最后的更新覆盖了由其他事务所做的更新
    2.脏读(dirty reads):一个事务正在对一条记录做修改,在这个事务没有提交前,这条记录的数据就一直处于不确定状态;这时,另一个事务也读取同一条记录,如果不加控制,第二个事务读取了这些脏数据,并据此做进一步的处理,就会产生未提交的数据依赖关系,这种现象被形象地叫做脏读
    3.不可重复读:一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变,或某些记录已经被删除了!这种现象就是不可重复读
    4.幻读:一个事务按照想同的查询条件的新数据,这种现象就称为幻读。
    解决方案:
    以上问题都是数据库读一致性导致的,因此必须有数据库提供一定的事务隔离机制来解决。枷锁:在读取数据前,对其他加锁组织其他事务,对数据进行修改。例如,读的时候加共享锁,此时其他事务法务修改相应数据;写的时候加排他锁,禁止其他事务读写操作,这种做法性能较差。多版本并发控制(mvcc):不用加任何锁,通过一定机制生成一个数据请求时间点的一致性数据快照,并用这个快照提供一定级别的一致性读取,从用户角度来看,好像是数据库可以提供同一数据的多个版本。

  • 长连接的优缺点

    优点:
    1.减少CPU及内存的使用,因为不需要经常的建立及关闭连接,当然高峰并发时CPU及内存也是比较多的;
    2.允许http pipelinngning 的请求及响应模式;
    3.减少网络的堵塞,因为减少了TCP请求;根据RFC 2616的标准定义,单个客户端不允许开2个以上的长连接,这个标准的目的是减少http响应的时候,减少网络堵塞
    4.减少后续请求的响应时间,因为此时不需要建立TCP,也不需要tcp握手等过程;
    5.当发生错误时,可以在不关闭连接的情况下进行提示;
    缺点:可能会损害服务器的整体性能,如Apache的长连接时间长短,直接影响到服务器的并发数。

  • php垃圾回收机制

    1.以php的引用计数机制为基础(PHP5.3以前只有该机制)
    2.PHP5.3版本之后引入根缓冲机制,即PHP启动时默认设置指定zval数量的根缓冲区(默认是10000),当PHP发现有存在循环引用的zval时,就会把其投入到跟缓冲区达到配置文件中的指定数量(默认是10000)后,就会进行垃圾回收,以此解决循环引用导致的内存泄露问题。

  • 确认为准垃圾的准则

    1.如果引用计数减少到零,所在变量容器将被清除(free),不属于垃圾。
    2.如果一个zval的引用计数减少后还大于0,那么它会进入垃圾周期。其次,在一个垃圾周期中,通过检查引用计数是否减1,并且检查哪些变容器的引用次数是0,来发现哪部分是垃圾。

  • 什么是缓存穿透?

    正常情况下,我们去查询数据库都是存在。那么请求去查询一条压根儿数据库中根本就不存在的数据,也就是缓存和数据库都查不到这条数据,但是请求每次都会打到数据库上面去。这种查询不存在数据的现象我们称为缓存穿透。

  • 缓存穿透带来的问题及解决方案

    可能会有黑客攻击,拿一个不存在的id区查询数据,会产生大量的请求到数据库去查询,可能会导致你的数据库由于压力过大而宕机。我们可以用布隆过滤器来解决这个问题,布隆过滤器就是在缓存之间加上一层bloomfilter,在查询的时候先去bloomfilter,在查询的时候先去bloomfilte查询key是否存在,如果不存在就直接返回,存在再走缓存查DB。

  • 什么是布隆过滤器?

    本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构,特点是高效的插入和查询,可以用来告诉你“某样东西一定不存在或者可能存在”。相比于传统的list,set,map等数据结构,它更高效,占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

  • 缓存雪崩及解决方案

    缓存同一时间大面积失效,这个时候来了一波请求,导致所有的请求都到数据库上。给缓存的失效时间一个随机值,避免集体失效。

  • 缓存击穿及解决方案

    热点数据在缓存中查不到,在同一时刻被超高并发的请求,导致所有的请求都到了数据库上。设置分布式互斥锁,只允许一个线程重建缓存,其他线程等待重建缓存的线程执行完,重新从缓存获取数据即可;设置永不过期缓存

  • redis 是单线程还是多线程?

    Redis 是单线程模型,执行Redis命令的核心模块是单线程的,但Redis其他模块是有各自线程的。Redis基于reactor 模式开发了网络时间处理器,这个处理器被称为文件事件处理器,由四部分组成:多个套接字 ,io多路复用,文件事件分派器,事件处理器。因为文件事件分派器的消费是单线程的,因此Redis才叫单线程模型。Redis的瓶颈并不在cpu,而在内存和网络。内存不够的话,可以加内存或者做数据结构优化和其他优化等,但网络的性能优化才是大头,网络io的读写在Redis整个执行期间占用了大部分的CPU时间,如果把网络处理这部分做成多线程处理方式,那对整个Redis的性能会有很大提升。

  • redis为什么这么快?

    1.数据存储在内存中,绝大部分请求是纯粹的内存操作,非常快速。
    2.数据结构简单,对数据的操作也简单,redis中的数据结构是专门进行设计的。
    3.redis是单线程模型,避免不了布标的上下文切换,也不存在多进程或者多线程导致的切换而对CPU进行消耗,不用考虑各种锁的问题,不存在加锁释放等操作,不会出现因为可能出现思索而导致的性能消耗。
    4.使用多路io复用模型,非阻塞io
    5.redis 自己构建了vm机制,在进行系统调用系统函数的时候,节约了一定的时间去移动和请求。

  • redis有哪几种数据类型,分别有哪些运用场景

    1.字符串(string):简单键值对缓存,例如计数器等
    2.哈希(hash):结构化的数据,例如用户信息等
    3.列表(list):列表型的数据结构,例如粉丝列表,文章评论列表等
    4.集合(set):交集,并集,差集的操作,例如两个人的粉丝交集列表等
    5.有序集合(zset):去重并排序,例如排行榜列表等

  • redis持久化

    RDB快照:将某个时间点上redis中的数据保存到一个RDB文件中,该文件是一个经过压缩的二进制文件,通过该文件可以还原生成RDB文件时redis中的数据。载入规则:只有在AOF持久化功能处于关闭状态时,服务器才会使用RDB文件来还原数据,如果服务器开启了AOF持久化功能,那么服务器会有限使用AOF文件来还原数据。
    AOF日志:通过保存redis 服务器所执行的写命令来记录数据库数据。还原步骤:创建一个不带网络连接的伪客户端;从AOF文件中分析并读取出一条命令;使用伪客户端执行被读取出的写命令;一直执行以上两步操作,直到AOF文件中的所有写命令全部执行完

  • mysql优化方案

    建表规范,索引优化,sql优化,开启慢查询等

  • MySQL索引优化原理;有哪几种数据结构;有几种索引;为什么主键索引查询效率更快

    1.索引是帮助MySQL高效获取数据的排好序的数据结构:

    • 二叉树:树的深度会越来越深而造成io次数变多
    • hash:等值查询效率较高,但是不支持范围和模糊查询
    • b-tree :所有键值和具体的数据分布在整棵树中,数据越来越多之后,效率也会变低
    • b+tree:数据只存储在叶子结点中,非叶子结点可存放更多索引。叶子结点也包含索引字段,且用指针连接,能更好的处理范围查询。

    2.mysql主要有普通索引,唯一索引,主键索引,组合索引,全文索引。
    3.主键索引是整型,排序性能好,自增的插入效率高。

  • docker的优点和应用场景

    1.资源隔离:比如限制应用最大内存使用量,或者资源加载隔离等。
    2.低消耗:虚拟化本身带来的损耗尽量的低。
    3.docker很好的权衡了两者,即拥有不错的资源隔离能力,又有很低的虚拟化开销

  • 高并发解决方案

    1.数据库层面:数据库缓存,分表分库,读写分离,负载均衡
    2.服务端层面:消息队列
    3.web服务层面:Nginx反向代理,lvs负载均衡等

posted @   鹏飞天下  阅读(73)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示