php个人面试总结(如有问题请留言指正)

静下心慢慢看,我想一定会对你有一点点的帮助

什么是面向对象:我们将繁琐的步骤,通过行为、功能,模块化,这就是面向对象(面向对象是把整个需求按照特点、功能划分,将这些存在共性的部分封装成对象)

单引号和双引号的区别:单引号变量不会被执行
json_decode带true和不带的区别

  1. json_decode($data)=>返回对象
  2. json_decode($data,true) =>返回数组

解耦:最好的解耦使用容器(降低代码维护,变量声明等)

RESTful

  1. 简介:是一种常见的REST应用,是遵循REST风格的web服务,REST式的web服务是一种ROA(面向资源的架构)。
  2. 举例:
    2.1正常路由:user/getUserInfo?uid=1
    2.2REST后路由:user/m?uid

网络协议http/tcp机制及请求情况

  1. 四层模型:应用层、传输层、网络层、数据链路层 应用层、表示层、会话层、传输层、网络层、数据链路层、物理层 应用层:向用户提供应用服务的活动,预存了各种通用的协议(ftp、文本传输协议、DNS、http协议也处于这一层)
  2. 传输层:提供两台机器之间的数据传输,tcp:传输控制协议,udp:用户数据协议
  3. 网络层:处理网上流动的数据包,传输就是通过怎样的路径达到对方计算机,并把数据包发送给对方,对多态计算机传输时选择一条传输
  4. 链路层:处理连接网络的硬件部分,包括驱动、网卡、
  5. tcp如何通信:应用层发送http请求,网络层解析,发送到服务器,服务器返回信息到链路接收端在返回一直到应用层,请求结束发送端每经过一层都会把请求层的首部打包上,接受层则每次请求都会去掉首部IP协议是把数据包发送给对方,确保对方在哪里,其中包括Ip和MAC物理地址ARP协议通过MAC地址进行通信,ARP协议是可以理解为地址解析协议,通过通讯方的IP地址反查出对应的MAC地址确保TCP协议的可靠:1.按层次分:大数据分割,TCP检查数据是否最终传输过去了确保数据能到达:TCP采用三次捂手,第一次发送SYN的数据包给对方,第二次接收端接收到后返回一个SYN/ACK标志的数据包表示确认数据送达,最后结束段在发送方一个ACK标注的数据包捂手结束
  6. DNS协议:提供通过域名查找IP地址,或者从IP地址反查域名的服务

mysql优化

四大方面:1设计:存储引擎、字段类型、范式及逆范式 2功能:索引、缓存、分区分表 3.架构:主从复制、读写分离、负载均衡 4.合理sql:测试、经验

  1. MySQL主从复制是一个异步的复制过程,主库发送更新事件到从库,从库读取更新记录,并执行更新记录,使得从库的内容与主库保持一致
  2. 存储引擎:支持事务锁、行级锁定、外键约束,更加注重数据完整性和安全性,数据集中存储,行记录:一种检索机制,相当于字典
  3. innodb:独立表空间、共享表空间:优点:每个表和索引都会存储在各自表空间,可以方便表数据的迁移,可以通过alter实现表空间的回收,缺点:单表超过100G,数据处理会变慢,用分区分表来处理
  4. 共享表:优点:可以把数据和文件放在一个磁盘上,方便管理 缺点:处理一个大文件时,虽然可以把大文件分成若干个小文件,对表做操作会有大量的缝隙,对统计和日值方便不合适
  5. innodb:擅长处理并发,通过行级锁定和表锁定来实现,擅长插入和更新
  6. myisam:擅长查询,innodb:擅长数据完整性、并发处理、查询及删除
  7. mysql安全防注入:运用execute代替sql语句连接
  8. mysql原理:1.客户端连接层:连接处理、证书验证 2.架构层:sql接口和优化 3.存储层:mysql数据存储和提取,服务器通过API存储引擎进行通信 4.数据层:运行在设备上,完成数据引擎的交互
  9. mysql设计:
    9.1根据业务场景:根据需求及业务场景选择数据库类型,查询多久选择Myisam(不支持事务,非聚集型索引),插入更新多久选择Innodb(支持事务,聚集型索引),根据数据量进行分库分表操作,字段类型设计(定长字段查询比较快例如:char比varchar快,主键类型用bigint),索引设计,多条件查询用组合索引,单条件的用唯一索引,模糊搜索用全文索引(目前全文索引支持:char、varchar、text)。
    9.2索引种类:1.全文索引2.hash索引:针对单条件查询比较快("=“和"in”),对于范围查找并不是特别高效3.btree索引:索引值按照一定的算法植入数据结构中的二叉树,4.rbtree索引:用的较少:一般使用与范围查找
    9.3mysql优化:主从复制读写分离,索引(主键索引、组合索引(用于多个条件查询)、唯一索引(可以为null,但不能重复)、全文索引(like %name%)),慢查询日志(long_query_time设置语句阈值,超过则代表语句执行慢,需要优化),sql语句优化
    9.4mysql优化工具:1.慢查询日志:记录查询时间慢的语句 2.explan:查看mysql执行计划,寻找其中可优化点 3.profiling:查询资源消耗情况

php5与php7之间的区别

  1. 性能提升:PHP7比PHP5.0性能提升了两倍。
  2. 以前的许多致命错误,现在改成抛出异常。
  3. PHP7.0比PHP5.0移除了一些老的不在支持的SAPI(服务器端应用编程端口)和扩展。
  4. PHP7.0比PHP5.0新增了空接合操作符。
  5. PHP 7.0比PHP5.0新增加了结合比较运算符。
  6. PHP 7.0比PHP5.0新增加了函数的返回类型声明。
  7. PHP 7.0比PHP5.0新增加了标量类型声明。
  8. PHP 7.0比PHP5.0新增加匿名类。
  9. 错误处理和64位支持

php运行原理

  1. php运行原理
    1.1简单说明:词语解析->语法解析->opcodes指令执行->通过sapi将结果返回
    1.2详细说明:浏览器发送给服务器,如果是静态资源,直接把资源返回给客户端2.如果请求的是php文件,服务器把php文件交给php解析器进行处理,处理完成,服务器会以静态资源的形式返回给客户端(web server启动时载入fastcgi进程管理器(php的fastcgi管理器是php-fpm),fastcgi自身初始化,启动多个cgi进程,等待web server连接,当web server连接到cgi的一个解析器时,web server将变量和标准输入发送到fastcgi的子进程php-cgi,php-cgi处理完成后,将返回结果和信息从同一连接返回web server,请求处理完成,php-cgi在此时退出,通常请求cgi时,每次请求都需要重新解析php.ini,如果运用fastcgi则只在进程启动时连接一次,能够持续数据库连接)

  2. CGI运行原理:1.初始化相关变量2.调用并初始化虚拟机3.加载并解析php.ini4.激活zend(zend加载a.php文件进行解析,编译a.php脚本为opcode并执行,输出结果,关闭虚拟机,)5.返回结果给web server模块模式:以mod_php5的形式集成,此时mod_php5是接收apache传递过来的php请求,并处理这些请求,将结果返回给apache,可以在启动的时候配置好php模块,通过ap_hook_post_config挂钩,在apache启动的时候启动此模块来接收php文件的请求

  3. nginx介绍:是一种高性能的http和反向代理服务器,也是IMAP/POS3/SMTP服务器

  4. nginx+php流程:浏览器请求到nginx–>路由到index.php–>加载nginx的php-cgi模块–>fastcgi监听127.0.0.1:9000地址–>浏览器请求道当前127.0.0.1:9000地址–>php-fpm监听127.0.0.1:9000地址–>php-fpm接收到请求交给worker进程处理请求–>php-fpm处理完成后返回给nginx–>nginx通过http返回给浏览器

  5. php垃圾回收机制GCC:php变量都会有变量类型、变量value、引用计数次数、是否是引用变量四部分组成(5.3)当删除父元素的时候,容器不会被删除,因为子元素还在指向该容器,只有当文件执行完后才会被删除,这就造成了内存泄漏,最新的gc是php启动时默认设置的zval数量根缓存区(默认10000),当php发现有缓存循环引用zval时,就会把他存入打根缓存区,当根缓存区达到配置文件中的指定数量(10000)后,就会进行垃圾回收机制,以此解决内存泄漏问题

  6. 引用计数:当引用计数ref_count清0的时候就会被销毁实现内存回收

  7. 写时拷贝:当变量a赋值给变量b的时候,变量b指向变量a的容器,只有当变量b发生改变的时候才会真正的发生变量容器复制

  8. 简单说明:词语解析->语法解析->opcodes指令执行->通过sapi将结果返回
    详细说明:浏览器发送给服务器,如果是静态资源,直接把资源返回给客户端2.如果请求的是php文件,服务器把php文件交给php解析器进行处理,处理完成,服务器会以静态资源的形式返回给客户端(web server启动时载入fastcgi进程管理器(php的fastcgi管理器是php-fpm),fastcgi自身初始化,启动多个cgi进程,等待web server连接,当web server连接到cgi的一个解析器时,web server将变量和标准输入发送到fastcgi的子进程php-cgi,php-cgi处理完成后,将返回结果和信息从同一连接返回web server,请求处理完成,php-cgi在此时退出,通常请求cgi时,每次请求都需要重新解析php.ini,如果运用fastcgi则只在进程启动时连接一次,能够持续数据库连接)

  9. php包含四个部分:zend引擎:php核心,extensions:通过组件提供基础服务,sapi:服务端应用编程接口,上层应用:

  10. zend介绍:是php的内核,hashtable是zend的核心数据结构,实现典型的hsah三列结构,附加双向链表,提供了正反两个方向的数组遍历

  11. 双向链表:快速删除,避免遍历 zval结构主要有三部分组成:type:指定变量所属的类型,refcount:用来实现计数,value:存储变量的实际数据

  12. 聚集索引和非聚集索引的区别:在于表记录的排序顺序和索引的排序顺序是否一致

  13. 悲观锁:先获取锁,在进行业务操作

  14. 乐观锁:用户并发事务处理,每个事务在执行执行之前都先检查有没有其他事务又修改了数据,如果有则事务回滚。一般在锁的数据上添加版本号或者时间戳

  15. 普通索引

  16. 聚合索引(组合索引):如果有A、B、C三列,按左排序规则,B、C检索不能用

  17. hash索引:不常用

swoole介绍

  1. TCP和UDP的区别:TCP是面向连接、可靠的数据流传输,UDP提供的是非面向连接的不可靠的数据传输流,TCP注重数据安全,UDP传输数据快

  2. TCP三次握手(后续补充四次挥手): 第一次握手:建立连接,客户端发送连接请求报文段,将SYN位置为1,sequence Number 为x;客户端进入SYN SEND状态,等待服务器确认,第二次握手:服务器收到客户端SYN报文段,需要对报文段进行确认,设置Acknwledgmentnumber为x+1,同时自己还要发送SYN请求, 将SYN的设置为1,sequenceNumber为y,服务器将所有信息放到报文(SYN+ACK)中,并发送给客户端,此时服务器进入SYN RECV状态。第三次捂手:客户端接收到SYN ACK报文,然后将Acknowledgmentnumber设置为y+1,向服务器发送ACK报文,报文发送完毕,客户端 和服务器端都进入ESTABLISHED状态,完成三次握手

  3. TCP四层模型:链路层、网络层、传输层、应用层

  4. TCP流量控制:不让发送方把数据发送得过快,好让对方来得及接收,接收方可能来不及接收,这就造成了数据丢失。用滑动窗口机制实现对方发送的流量控制。

  5. TCP拥塞控制:若某一资源需求超出了该资源提供的可用部分,网络性能就要变坏,这种情况就叫做拥塞。

  6. 拥塞是为了防止过多的数据注入到网络中,这样就可以使网络的路由或链路不至于过载,

  7. 为了进行拥塞控制,TCP发送要维持一个拥塞窗口的状态变量,拥塞窗口的大小取决于网络的拥塞程度,并且动用变化,发送发窗口取为拥塞窗口和接收方的接收窗口中较小的一个。

  8. TCP采用四种算法:慢开始、拥塞避免、快重传、快回复,在网络层可以使用路由器采用适当的分组丢弃策略(如主动队列管理AQM),以减少网络拥塞的发送
    8.1. 慢开始:慢开始算法的思路是当主机开始发送数据时,如果立即把大量数据字节注入到网络,那么可能会引起网络阻塞,因为现在还不知道网络的符合情况,经验表明,较好的方法是先试探一下,即由小到大逐渐增大发送窗口,也就是由小到大逐渐增大拥塞窗口数值,cwnd初始值为1,每经过一个传播轮次,cwnd加倍。
    8.2拥塞避免:拥塞避免算法的思路是让拥塞窗口cwnd缓慢增大,即每经过一个往返时间RTT就把发放的cwnd加1。
    8.3快重传与快回复:没有FRR,如果数据包丢失,TCP将会使用定时器来要求传输暂停,在暂停的这段时间内,没有新的或复制的数据包被发送。有FRR,如果接收到一个不按顺序的数据段,他就会立即发送一个重复确认,如果发送机接受到三次重复确认,他就会假定确认指出的数据段丢失了,并立即重传这些丢失的数据,有了FRR,就不会因为重传是要求的暂停被耽误,当有多个数据包在某一段很短的时间丢失时,它则不能很有效的工作。

  9. TCP粘包现象:TCP发送若干个数据包到接收方是粘成一个包,后一个数据包的头紧挨着前一个数据的尾。

    9.1. 为什么出现粘包现象:粘包是接收方不知道数据之间的界限,不知道一次性去多少字节的数据造成的。

    9.2TPC默认的Nagle算法:
    9.2.1.只有一个分组得到确认才会发送下一个分组,
    9.2.2.收集多个小分组,在一个确认要到来时一起发送。

    9.3什么时候解决粘包问题:如果多个分组数据毫不相干,甚至是并列关系,我们一定要处理粘包问题。
    如何解决粘包问题:将传输的数据转换成字节,然后len()得到长度,先输出长度,然后将接收的缓冲区大小调整为长度,就不会出现粘包了。用Struct模板,定长8字节的整数型,接收方每次只接受8个字节。

  10. 如果已经建立了连接,但时客户端突然出现故障了怎么办:TCP设有保活计时器,客户端如果出现故障,服务器不能一直等下去,白白浪费资源,服务器每接收到一次客户端请求后都会重新复位这个计时器。

  11. TCP慢启动:TCP三次握手完成后,开始传输数据,并不是一开始向网络通道中发送大量的数据,这样很容易导致路由中缓存空间耗尽,从而发生拥塞,而是根据初始化cwnd初始化为1,逐步增大发送数据,cwnd同时也会成指数增大。

  12. TCP的syn攻击:syn就是在客户端在短时间内伪造大量的ip地址,想服务端发端的发送syn包,服务端回复确认包,并等待客户端确认,由于源地址不存在,因此服务端不断发送直至超时,这些伪造的syn包将占满未连接的队列,导致正常的syn请求因队列满而被丢弃,从而造成了网络阻塞甚至系统瘫痪

  13. 如何方式syn攻击:1.减少toc等待数2.启动syncookies3.减少重试次数4.限制但ip并打数5.限制单位时间内连接数6.限制单个地址最大连接数

redis介绍:

  1. redis启动三种方式:1.1.redis.conf配置文件1.2.启动的时候在启动命令后加入1.3.客户端命令,在启动完成后
  2. redis中存在重要数据的时候需要设置密码
  3. redis持久化流程:1.客户端向服务器发送写操作(数据在客户端内存中)2.数据库服务接收到服务器的写操作(数据在服务器内存中)3.服务器调用write这个调用将数据网磁盘离去写(数据在系统内存的缓存区)4.操作系统将缓存区的数据转移到磁盘控制器上(数据在磁盘缓存里)5.磁盘控制器将数据写到磁盘的物理介质中(数据真正的写到磁盘上)
  4. RDB持久化:是把当前内存的数据集快照以二进制写入磁盘,也就是snapshot快照,默认dump.rdb,用这个文件代替上次的文件达到数据持久化的目的。
  5. RDB的三种机制:1.save:会阻塞reids,执行save期间redis不执行其他操作,只有当RDB过程执行完成为止 ,执行完成后把旧的文件替换掉。2.bgsave:执行命令时,redis会在后台进行异步快照操作,快照同时还可以响应客户端请求(步骤:redis执行fork创建子程序,redis持久化过程有子过程完成,阻塞只发生在fork阶段)。3.自动化:在redis.conf中配置
  6. RDB的优点:1.文件紧凑,全量备份,非常适合备份和灾难恢复。2.生成RDB文件的时候,主进程会fork一个子进程来处理所有的保存工作,主进程不需要进行任何的磁盘IO操作。3.RDB恢复大数据比AOF快
  7. RDB的缺点:RDB快照是一个全量备份,存储的是内存二进制序列化形式,存储上非常紧凑,当快照持久化时,会开启一个子进程专门来负责快照持久化,子进程会拥有父进程的数据,当父进程被修改内存子进程反应不过来时,快照持久化期间被修改的数据不会被保存,可能丢失数据。
  8. AOF机制:redis收到一个命令都通过write函数追加到文件中,俗称日志记录
  9. AOF重写原理:AOF持久化带来的问题是文件越来越大,为了压缩AOF文件,redis提供了bgrewriteaof命令,将内存中的数据已命令的形式保存临时文件中,同时会fork一个子进程来重写文件。重写aof文件,并没有读取就得aof文件,而是将整个内存中的数据库内容用命令的形式重新aof文件。
  10. AOF的三种触发机制:1.每修改同步always:每次持久化都会立即同步到磁盘,性能较差,但数据保存完好,2.每秒同步everysec:异步操作,如果一秒内有宕机,有数据会丢失。3.不同no:从不同步
  11. AOF的优点:1.可以更好的保护数据的不丢失,一般AOF会每隔一秒通过后台线程执行一次fsync操作,最多丢失一秒数据。2.AOF没有任何磁盘寻址的开销,写入性能非常高,文件不容易破碎。3.AOF即使过大的时候,出现重写操作,也不会影响客户端的读写4.AOF日志文件的命令,通过非常可读的方式进行记录,这个特性非常适合做灾难误删除的紧急恢复。比如不小心flushall命令清楚了所有数据,只要后台rewrite还没发生,那么久拷贝AOF文件,将最后一条flushall命令给删除,然后再将该AOF文件放回去,就可以通过恢复机制,自动恢复所有数据。
  12. AOF的缺点:1.对于同一个文件来说AOF通常不RDB数据快照文件大。
  13. AOF开启,支持的QPS写会比RDB支持的QPS写低,因为AOF一般配置成每秒fsync一次日志文件。3.AOF发生bug,就是通过AOF日志进行恢复,没有恢复一模一样的数据。
  14. redis内存划分:1.数据:作为数据库,数据是最主要的部分,这部分占用的内存会统计在used_memory。2.进程本身运行需要的内存:代码和常量池,这部分大约有几兆,可以忽略不计,这部分不是由jemalloc分配,所以不会统计在used_memory中,AOF和RDB创建的子进程不属于redis进程,不统计在used_memory和used_memory_rss中。3.缓存内存:包括客户端缓冲区、复制积压缓冲区、AOF缓冲区,有jemalloc分配,统计在used_memory中。4.内存碎片:是redis内存分配,回收物理内存过程产生的,频繁改变数据可能导致物理内存没有释放,这部分内存不统计在used_memory中。
  15. redis主从复制:复制是redis高可用的基础,哨兵和集群都是在复制的基础上实现的高可用,复制主要实现了数据的多机备份,以及对于读操作的负载均衡和简单的故障恢复,缺陷在于:恢复故障无法自动化,写操作无法负载均衡,存储能力受到单机限制
  16. reids哨兵:在复制的基础上,哨兵实现了自动化的故障恢复,缺陷:写操作无法负载均衡,存储能力受单机限制
  17. redis缓存被击穿处理机制:使用mutex,缓存失效的时候(判断拿出来的值为空),不是立即去loaddb,而是先使用缓存工具的某些带成功的返回值操作(例如reids的SETNX或者memcache的add)去set一个mutexkey,当返回成功时,在进行load db操作并回设缓存,否则就重试整个get缓存方法。
  18. 缓存和数据库之间的数据一致性问题:分布式环境下非常容易出现缓存和数据库之间的一致问题,如果项目对数据是强一致性,那就不要用缓存,只能采用合适的策略来降低缓存和数据库不一致性的概率,而无法保证数据的强一致性,合适的策略包括合适的缓存更新策略,更新数据库后及时更新缓存,缓存更新失败后增加重试机制,例如MQ消息队列
  19. redis缓存雪崩问题:1.像缓存穿透一样加锁排列。2.建立备份缓存,设置A的过期时间,不设置B的过期时间,当缓存A失效的时候,读取缓存B,并且更新A的缓存和B的缓存。
  20. redis分布式:redis支持主从模式,master会同步数据到slave,而slave不会同步master,slave启动时会连接master,同步数据,这是一个典型的读写分离没事,利用master来插入数据,slave提供检索服务,这样可以有效减少单个计算机的并发数量
  21. redis读写分离模式:通过增加slave db数量,读的性能会成线性增加,为了避免Masterdb的单店故障,集群一般采用两台Master db做双机热备,是整个几群的读写性都非常高。
  22. redis读写分离的缺点:主机从机都要不存完整的数据,如果在数据量很大的情况下,集群的扩展还是受制于单个节点的存储能力,对于write-intersive类型的应用,读写分离并不适用。
  23. 数据库分片模型:为了解决读写分离的缺陷,可以将数据分片模型应用进来可以将每个节点看成独立的master,然后通过业务进行分片,可以设计成一个master和多个slave的模式。
  24. redis分布式锁的实现:先拿setnx来抢锁,抢到之后,再用exprie给锁加一个过期时间,防止锁忘记释放,如果在setnx执行后exprie之前进程意外crash或者重启维护了,那会怎么样?set指令有非常复杂的参数,这个应该可以同时把setnx和exprie合成一个指令来用
  25. redis做异步队列:一般使用list做队列,lpush生产消息,lpop消费消息,当lpop没有消息的时候,要适当的sleep一下,缺点:在线下消费的时候,生产消息会丢失,得使用创业的消息队列rabbitmq等,能不能产生一次消费多次?使用pub/sub主题订阅者模式,实现1:N的消息队列。
  26. redis中海量数据的正确方式:利用scan系列命令(SCAN、SSCAN、HCAN、ZCAN)完成数据迭代。
  27. redis集群:Redis Sentinal着眼于高可用,在Master宕机时会自动将Slave提升为Master,继续提供服务。Redis Cluster着眼于扩展,在单个redis不够时,使用Cluster进行分片存储。
  28. redis集群什么情况下会导致集群不可用:A、B、C三个节点集群,当B节点失败,那么整个集群会因为缺失B节点范围的槽而不可用。
  29. redis哈希槽的概念:redis集群没有一致性hash,而是引入hash槽的概念,redis集群有16384个哈希槽,每个key通过CRC16效验后对16384取模来决定防止那个槽,集群的内个节点负责一部分槽。
  30. redis并不能保障强一致性,这就意味着实际集群在特点环境下可能会丢失写操作。
  31. redis事务:事务是单独的隔离操作,事务中的所有命令都会序列化、按顺序执行,事务在执行时,不会被其他客户端的请求打断,事务的原子性,事务要么全部执行,要不全部不执行。
  32. redis如何做内存优化:尽可能使用散列表,散列表使用的内存非常少,所以尽可能的将数据抽象到三列表里。
  33. redis回收进程机制如何工作:一个客户端运行了新的命令,添加了新的数据,redis检查内存的使用清理,如果大于maxmemory的限制,则根据设定好的策略进行回收,所以就是内存不断的达到限制边界,不断的会受到边界以内,如果一个内存导致内存被大量占用,不用多久,内存很快就会被超越。
  34. redis如何保证都是热数据:redis内存数据集大小升到一定的大小后,就会实行数据淘汰策略。
  35. 如何查找一亿数据中的10W个key:使用keys扫描出所有指定模式的key列表,如果这个redis正在为线上提供服务,这会造成阻塞卡顿,因为redis是单线程的,keys指令会导致线程阻塞一段时间,线上服务停顿,直到指令执行完毕,服务才能恢复,scan命令可以无阻塞提取指定模式的key列表,但可能给会有重复的概率,在客户端去重一次就好,整个执行时间比keys长。
  36. redis设置过期时间一致:如果大量的过期时间过于集中,到过期时间时redis会出现卡顿,一般在时间上加一个随机值,是过去时间分散一点。redis连接connect和pconnect区别:connect结束后连接断开,pconnect结束后连接不断开,保持在php-fpm进程中。
  37. redis有哪些结构时间复杂度较高的list(redis hsah实现):哈希的实现编号可以是ziplist或者hashtable,ziplist编号的哈希对象采用压缩列表作为底层实现,每当有新的键值对要加入到hash对象的时候,程序会先将保存了键的压缩列表节点推入到压缩列表结尾,然后再将保存了值的压缩列表节点推入到压缩列表结尾,因此保存了同一键值对的两个节点总是紧挨在一起,保存的节点在前,保存值得节点在后,先添加到哈希对象的键值对会被放在压缩列表表头,后添加到哈希对象的键值对会被放在压缩列表的结尾。

php常用数组

array
array_chunk:将一个数组分成多个
array_column:返回数组中指定的一列
array_combine:数组合并(用一个数组的只作为键,另一个数组的值作为值)
array_filp:交换数组中的键和值
array_key_exists:检索数组里是否有指定的键名或索引
array_merge:数组合并
array_shift:将数组开头单元移除
array_pop:弹出数组中最后一个元素
array_unshift:从数组开头插入一个单元
array_push:将一个元素和多个元素压入数组末尾
array_slice:将数组中取出一段
array_rand:从数组中随机取出一个或多个单元
array_reverse:返回单元顺序相反的数组
array_search:在数组中搜索给定的值,如果成功返回首个相应的键名
array_sum:数组值求和
array_unique:数组去重
array_value:返回数组中多有的值
asort:对数组进行升序排列并保持索引关系
arsort:对数组进行降序配列并保持索引关系
count:返回数组个数
current:输出数组中当前元素的值
in_array:检测数组中是否纯在某个值
ksort:按键名进行升序排列
krsort:按键名进行降序排列
list:将数组中的值赋给一个变量
shuffle:打乱数组
sort:对数组进行升序排列
rsort:对数组进行降序排列

字符串函数

strlen:返回字符串长度
strtolower:字母小写
strtouppor:字母大写
ucwords:第一个单词首字母大写
ucfrist:首字母大写
str_replace:替换,区分大小写
str_ireplace:替换,不区分大小写
trim:清除字符串两边的空格
ltrim:清除字符串左边的空格
rtrim:清除字符串右边的空格
strpos:某个字符串第一个位置,索引是0,没有出现返回false,区分大小写
stripos:某字符串第一个位置,不区分大小写
strrpos:查询某个字符串最后出现的位置,索引是0,没有出现返回false,区分大小写
strripos:查询某个字符串最后出现的位置,不区分大小写
substr:字符串截取($str,0,3)
strstr:截取字符串从某个字符开始
strrev:字符串反转
str_repeat:重复字符串
str_shuffle:随机打乱字符串顺序
strrchr:截取字符串,从最后一个字符出现的位置开始
MD5:加密
explode:字符串指定格式分割成数组
implode:数组拼接成字符串
strcmp:比较两个字符串的大小
strcasecmp:忽略大小写,比较字符串大小写
strnatcasecmp:使用自然顺序算法比较字符串
strncasecmp:比较字符串开始的若干个字符串

mysql常用函数

mysql_affected_rows():取得前一次 MySQL 操作所影响的记录行数
mysql_data_seek():移动记录指针
mysql_errno():返回上一个 MySQL 操作中的错误信息的数字编码。
mysql_fetch_array():从结果集中取得一行作为关联数组,或数字数组,或二者兼有
mysql_fetch_assoc():从结果集中取得一行作为关联数组
mysql_fetch_field():从结果集中取得列信息并作为对象返回。 3
mysql_fetch_lengths():取得结果集中每个字段的内容的长度。 3
mysql_fetch_object():从结果集中取得一行作为对象。 3
mysql_fetch_row():从结果集中取得一行作为数字数组。 3
mysql_field_flags():从结果中取得和指定字段关联的标志。 3
mysql_field_len():返回指定字段的长度。 3
mysql_field_name():取得结果中指定字段的字段名。 3
mysql_field_seek():将结果集中的指针设定为指定的字段偏移量。 3
mysql_field_table():取得指定字段所在的表名。 3
mysql_field_type():取得结果集中指定字段的类型。 3
mysql_free_result():释放结果内存。 3
mysql_get_client_info():取得 MySQL 客户端信息。 4
mysql_get_host_info():取得 MySQL 主机信息。 4
mysql_get_proto_info():取得 MySQL 协议信息。 4
mysql_get_server_info():取得 MySQL 服务器信息。 4
mysql_info():取得最近一条查询的信息。 4
mysql_insert_id():取得上一步 INSERT 操作产生的 ID。 3
mysql_list_dbs():列出 MySQL 服务器中所有的数据库。

4.linux常用命令:

ls命令:查看当前文件下的所有文件( -a:列出所有文件包含.开始的隐藏文件,-A:列出除.和…以外的其他文件-r:反序排列 -t:以文件的修改时间排序 -s:以文件的大小写排序 -h:以易读大小写显示 -l:除文件名以外的所有文件的权限、作者、文件大小等信息列出来)cd命令命令命令:切换到当前目录 pwd命令:查看当前路径 rm命令:删除一个目录中的一个或多个文件
rmdir命令:从一个目录中删除一个或多个目录,必须有写权限,不能删除空目录
mv命令:移动文件或者修改文件名
cp命令:复制文件到目标文件(-i:提示 -r:复制目录及目录中的所有文件 -a:复制文件与源文件时间一样) cat命令:1.一次显示整个大文件2.从键盘创建一个文件3.将几个文件合并为一个文件(-b:对非空输出行号 -n:输出所有行号)
more命令:类似于cat便于阅读(+n:从第几行开始显示 -n:定义屏幕大小为n +/pattern:在每个档案显示钱搜索该字符串(pattern),然后从该字符前两行后开始显示 -c:从顶部清屏,然后显示。-l:忽略ctrl+l换页字符 -p:通过清屏窗口而不是滚动换页 -s:连续多个空行显示为一行 -u:把内容下划线去掉)
less命令:与more相似,more仅能向前移动,不能向后移动,less查看前不会加载整个文件 head命令:用来显示档案开头至标准输出,默认10行 tailml:用于显示指定文件的末尾内容,不指定文件时,作为输入信息进行处理常用开看日志文件 which命令:查找可执行文件的位置
whereis命令:查看文件位置
locate命令:配合数据库查看文件位置
find命令:实际搜索硬盘查找文件名称
chmod命令:改变文件或命令的访问权限
chown命令:将制定用户的拥有者改为指定用户或组
df命令:显示磁盘使用情况,默认当前磁盘
du命令:是对文件或目录的磁盘使用情况(例如:文件大小)
in命令:建立同步连接,减少磁盘占用
date命令:显示或设定系统的时间与日期
cal命令:显示公历日期
grep:强大的文件搜索所,全局正则表达是搜索
wc命令:统计指定文件的字节、数字、行数,并统计结果数输出
ps命令:查看当前运行进程的状态
top命令:显示当前进程的执行信息,包括进程ID、内存占有率、cup使用率 kill命令:强制终止进程 free命令:显示内存使用情况,包括物理内存、交互区内存、缓存区内存

git常用命令:

5.git提交流程git log查看提交记录–>git pull代码拉取–>git status查看是否有要提交代码–>git add提交多有代码–>git commit -m为本次代码添加注释–>git reset撤回提交代码
git init命令:创建一个新的git代码库
git init [project-name]命令:新建一个目录初始化代码库
git clone命令:下载一个项目和整个代码历史
git config --list命令:显示当前git配置
git config -e[–global]:编辑git配置文件
git config [–global] user.name "[name]"命令:提交代码时的用户信息
git add [filed1]命令:添加指定文件到缓存区
git add [dir]命令:添加指定目录到缓存区
git add -p:添加每个变化前都需要确认,对于同一个文件的多处变换,可以实现分次提交
git rm [file1]命令:删除工作区文件
git rm --cached [file]ml:停止最终文件,但文件还保留在工作区
git mv [file-original] [file-renamed]命令:改名文件,并将改名文件放入暂存区
git commit -m [message]命令:提交暂存区到仓库区
git branch命令:列出所有本地分支
git tag命令:列出所有标签
git status命令:显示所有变更文件信息
git log命令:显示当前分支的版本历史
git shortlog -sn命令:显示所有提交过的用户,按提交次数排序
git blame [file]命令:显示指定文件什么人在什么时间修改过
git diff命令:显示缓存区和工作区的差异
git show [commit]命令:显示某次提交和原数据之间的变化
git reflog命令:显示当前分支最近几次提交
git fetch [remote]命令:下载远程仓库所有变动
git remote -v命令:显示所有远程仓库
git remote add [shortname] [url]命令:添加一个新的远程仓库并连接
git pull [remote] [branch]命令:取回远程仓库的变化,与本地分支合并
git push [remote] [branch]命令:上传指定分支到远程仓库
git push [remote] --force命令:强制推动分支到远程仓库,即便有冲突
git push [remote] --all命令:推送所有分支到远程仓库
git checkout [file]命令:恢复暂存区的指定文件到工作区
git reset [file]命令:重置缓存区文件,与上次commit保持一致,但工作区不发生变化
git revert [commit]命令:新建commit,用来撤销指定commit,所有变化被将被前者抵消,并应用到当前分支
git stash命令:暂时将未提交的变化移除,稍后再移入
git archive命令:生成可供发布的压缩包
git pull命令:从服务器拉取代码,将本地代码更新为最新代码

6.workerman原理:worker是worerman最基本的容器,可以开启多个进程监听端口的使用,并使用特点的协议通讯,类似于nginx监听某个端口。每个worker进程独立运作,采用epoll(需要安装event扩展)+非阻塞IO,每个进程都能上万个客户端连接,并处理连接上发送的数据。主进程保持稳定,只负责监听子进程,不负责任何数据和业务逻辑
进程流程:master进程–>环境检查–>变为守护进程–>安装信号–>创建socket监听–>创建workers–>监控信号
子进程:worker进程–>监听端口–>epoll接收请求–>逻辑处理–>返回结果–>关闭连接
workerman主要应用异步处理、长连接、MQ消息队列、高并发

7.reids类型:string、set、zset、hash、list
string:统计点赞数
set:无序,值不重复
zset:有序集合,适合做排行榜
hash:
list:队列、查看点赞列表
redis与memcached区别:reids支持更丰富的类型,memcached仅支持string,redis比memcached更快,redis支持持久化
redis解决并发请求:redis利用队列把并发访问变成串行访问,消除了传统的数据库的开销
reids6的淘汰策略:noeviction:不删除策略,达到内存限制时,如果需要更多内存,直接返回请求错误信息,大多数会新加内存,极少数会例外。

LRU算法:allkeys-lru删除最近最少使用的key,volatile-lru:只限设置exprie的部分,删除最近最少使用的key。
随机淘汰:allkeys-randm、;所有key通用,随机删除一部分key,volatile-randm:只限于设置了exprie的部分,随机删除一分部key,volatile-ttl:只限制于设置exprie的部分,有限删除剩余时间短的key

四种排序:

//快速排序
function quick_sore($arr){
    
    
	if(!is_array($arr))return false;
	$count = count($arr);
	if($count == 1) return $arr;
	$left = $right = array();
	for($i=1;$i<$count;$i++){
    
    
		if($arr[$i]<$arr[0]){
    
    
			$left = $arr[$i];
		}else{
    
    
			$right = $arr[$i];
		}
	}
	$left = quick_sort($left);
	$right = quick_sort($right);
	return array_merge($left,$arr[0],$right);
}

//插入排序
funciotn insert_sort($arr){
    
    
	$len = count($arr);
	for($i=1;$i<$len;$i++){
    
    
		$tmp = $arr[$i];
		for($j=$i-1;$j>=0;$j--){
    
    
			if($tmp<$arr[$j]){
    
    
				$arr[$j+1] = $arr[$j];
				$arr[$j] = $tmp;

			}else{
    
    
				break;
			}
		}

	}
	return $arr;
}


//选择排序
function select_sort($arr){
    
    
	$len = count($arr);
	for($i=0;$i<$len-1;$i++){
    
    
		$p = $i
		for($j=$i+1;$j<$len;$j++){
    
    
			if($arr[$i]>$arr[$j]){
    
    
				$p = $j;
			}
		}
		if($p != $i){
    
    
			$tmp = $arr[$p];
			$arr[$p] = $arr[$i];
			$arr[$i] = $tmp;
		}
	}
	return $arr;
}


//冒泡排序
function bubble_sort($arr){
    
    
	$len = count($arr);
	for($i=1;$i<$len;$i++){
    
    
		for($j=0;$j=$len-$i;$j++){
    
    
			if($arr[j]>$arr[$j+1]){
    
    
				$tmp = $arr[$j+1];
				$arr[$j+1] = $arr[$j];
				$arr[$j] = $tmp;
			}
		}

	}
	return $arr;
}

//二分法查找
function binsearch($x,$a){
    
    
	 $c=count($a);
	 $lower=0;
	 $high=$c-1;
	 while($lower<=$high){
    
    
		 $middle=intval(($lower+$high)/2);
		 if($a[$middle]>$x){
    
    
			 $high=$middle-1;
		 } elseif($a[$middle]<$x){
    
    
			 $lower=$middle+1;
		 } else{
    
    
		return $middle;
		}
	 }
	 return false;
}

后续完善
1.基础算法
2.redis与mecher的差异及各自应用场景
3.swoole拓展机制
4.tp、yii、laravel、ci框架区别及优缺点
5.oop,mvc.mvvm.mvp
6.基础建构设计

猜你喜欢

转载自blog.csdn.net/cheers_bin/article/details/108188205