一、介绍你最得意的一个项目
四、微服务架构、SOA、单体架构、分布式架构
PHP的魔术常量、系统常量
PHP 关键配置项有哪些
PHP的生命周期/启动流程
说一下PHP的(内存)垃圾回收机制
PHP常见运行模式有几种
常见的框架, 以及各自优缺点.
array_push :在数组尾部插入一个元素
array_keys :返回数组中部分的或所有的键名并未其建立数字索引
array_values:获取数组中所有的值并给其建立数字索引
array_diff:两数组差集,判断的是数组元素的值,返回的数组会保持映射关系,具体是关联数组或索引数组,与第一个元素有关
array_intersect:两数组交集,判断的是数组元素的值,返回的数组会保持映射关系,具体是关联数组或索引数组,与第一个元素有关;array_intersect_assoc:会将索引也最为比较的依据,返回索引和数值均一致的数据。
array_sum:计算数组值的总和,以整数或者浮点数的形式返回
array_rand:从数组中随机取出一段元素,如 array_rand($arr, 2),随机返回两个元素,注意返回的是键,而不是值,所以一定是索引数组。
array_map:对于数组使用回调函数
重要的排序函数:排序都是使用的快排算法
strlen:字符串的长度
strstr:获取当前字段之后的字符串
如果 start
是非负数,返回的字符串将从 string
的 start
位置开始,从 0 开始计算。
如果 start
是负数,返回的字符串将从 string
结尾处向前数第 start
个字符开始。
如果提供了正数的 length
,返回的字符串将从 start
处开始最多包括 length
个字符(取决于 string
的长度)。
如果提供了负数的 length
,那么 string
末尾处的 length
个字符将会被省略(若 start
是负数则从字符串尾部算起)。
strpos:字符串首次出现的位置;strrpos:字符串最后一次出现的位置;
stripos:不区分大小写,字符串首次出现的位置;
exit会直接退出终止执行,退出进程;return 只是会返回上级调用处;
echo 是语法而不是函数;print 是函数,输出字符串;print_r打印出变量的信息;var_dump输出变量的信息;
PHP默认不支持多线程,但是可以通过扩展开启多线程。对于多线程而言,会存在线程安全的问题。
PHP采用了TSRM(线程安全资源管理器)的方式来进行线程安全管理工作:具体就是为每个线程复制一份全局变量和静态变量数据,保证他们不会相互影响(很耗费内存空间,特别是线程以及全局变量比较多的时候)。
phpinfo() :打印出PHP相关信息,如扩展信息、PHP版本、系统信息,生产环境中一定不能开启。
是两者都是OSI七层模型里的传输层协议,都是全双工通信。
TCP协议是有连接的,有连接的意思是开始传输实际数据之前TCP的客户端和服务器端必须通过三次握手建立连接,会话结束之后也要结束连接。而UDP是无连接的;
TCP协议保证数据按序发送,按序到达,提供超时重传来保证可靠性,但是UDP不保证按序到达,甚至不保证到达,只是努力交付,即便是按序发送的序列,也不保证按序送到;
TCP协议对系统资源要求比较多了;
TCP有流量控制和拥塞控制,UDP没有,网络拥堵不会影响发送端的发送速率
TCP是一对一的通信,而UDP则可以支持一对一,多对多,一对多的通信。
TCP面向的是字节流的服务,UDP面向的是报文的服务。
为何需要三次:避免在网络结点中流转过久的连接请求又重新回到了服务器,而服务器不知道这个请求是无效的,会向客户端发送确认报文,会造成重复的连接建立。
四次放手:首先是客户端主动发送断开连接报文,服务器端发送确认报文;然后服务器发送断开连接报文,客户端回复确认报文
常见的有jsonp方式、服务器代理、CORS三种方式,其中Jsonp与CORS(跨域资源共享)两者的区别如下。
4) 最少连接数 调度器会记录每个server的连接数 然后选择最少连接数的server提供服务,这样可以保证每个server的负载均衡。
LVS有三种工作模式:NAT、TUN、DR,目前使用最广泛的也就是DR模式。
负载均衡有两层、三层、四层、七层负载均衡几大类。其中,LVS是属于四层负载均衡;nginx以及BFE均属于七层负载均衡。
本质原因是http是无状态的,需要通过session、cookie机制来保持会话信息。
session是将会话数据保存在服务器端,比较安全;session数据可以保存在数据库、文件或者redis中;高并发情况下会产生大量的session数据,对于存储在服务器文件而言,可能会造成服务器资源的消耗紧张;
常常采用的是将session数据存储在一个单独的服务中,例如公司的passport服务。
cookie是将数据保存在客户端,数据不太安全;可以设置cookie的key 、val 、 失效时间 、域、 path;对于未设置失效时间的cookie则认为是会话cookie,它的生命周期与浏览器是同步的,浏览器关闭之后cookie便会被删除
浏览器在发送请求时会根据请求的地址查找与该地址匹配的cookie信息一起发送。
可以设置cookie的domain为根域名,这样在发起所有二级域名的请求时都会携带上该cookie信息。这也是sso单点登录的原理。
浏览器同源策略:不允许访问跨域的Cookie
1)如果是域名归属于同一个根域名,可以设置cookie的domain域为根域名(或者域名交集),无须在做其他操作
常见的事件驱动模型以及相互之间的区别。
\S:匹配任何非空白字符;
\s:匹配任何空白字符,包括空格、制表符、换页符等等;
. :匹配除换行符 \n 之外的任何单字符。
\d:匹配数字字符,与[0-9]相同
\D:匹配非数字字符,与[^0-9]相同
\w:匹配任何只包含字母数字字符和下划线的字符组成的字符串,与[0-9a-zA-Z_]相同
\W:匹配字符串,忽略下划线和字母数字字符串
正则表达式在很多地方都有使用,一定要牢记使用。
进程是操作系统分配和管理资源的基本单位,每一个进程都有一个自己的地址空间 。进程至少有 5 种基本状态,它们是:创建态,等待态,执行状态,阻塞态,终止状态。
进程之间可以通过信号量、共享地址、管道、信号等多种方式进行通信。
线程是CPU调度的基本单元,一个进程内至少会有一个主线程,一个进程内的多线程之间会共享进程的地址空间,会造成资源的竞争。
具体有以下几种解决方案:
innodb_buffer_pool_size:InnoDB存储引擎在用,这个缓冲用途很大。InnoDB可以用它还缓存索引、数据、自适应hash索引、锁、以及写入操作。其中,可以将写入操作进行合并,开启一个线程,定期把这种写入操作持久化到磁盘中去。
redis低层是使用的C语言编写的,而且数据是基于内存,并且使用了I/O多路复用的事件处理模型,是单进程单线程的服务。
Redis有安全认证功能,但是memcache就没有了。
Redis常见的有字符串、列表、hash、集合、有序集合五大类。
其中字符串的低层是使用的SDS(简单动态字符串);列表的低层是使用的压缩列表或双端链表;hash的低层是使用的字典或者压缩列表;集合的低层是使用的跳跃表;有序集合的低层可能使用压缩列表或者整数
整数字符串对象类型可以实现对象的复用,而且低层的对象数据结构里记录了对象的引用计数。
字符串:常用与缓存、计数器
hash:缓存对象数据
列表:先进先出,消息队列
集合:利用集合的交差并补,实现共同关注好友列表
有序集合:利用每个元素的优先级,实现排行榜功能
每个key一定要设置失效时间,不要使用系统自带的失效策略,而是要主动删除无效数据。 Redis对于SDS会维持一个buffer,某些情况下可能造成内存的过度占用而不会被释放。 使用setex方法代替set expire方法(因为两个方法是独立的,并不是一个原子性的操作,而且操作两次的话涉及到两次网络交互) 尽量使用批量操作,因为redis的性能瓶颈就是在网络通信处,如使用mget()
memcached不会主动进行内存的回收操作,只有在get请求数据时才会判断数据是否已经失效,如果已经失效则会删除数据;
在内存不够时会使用LRU算法进行内存的回收,这个期间可能会造成有些未失效的数据被删掉,造成数据的丢失;
redis的内存回收利用了对象的定期删除 + 惰性删除两种;同时结合了max_memory选项,在内存不够时根据LRU删除数据;
Memcached集群,server端之间并不会进行相互的通信,通信完全由你的客户端来完成,你只需在客户端规定好你的key值,然后 set进行,此时会有一个散列算法,来决定你key会存放在哪台server上。
分布式是在客户端实现的;整个的数据是放在一个大的hash表中的;key可以设置过期时间,删除策略为惰性删除,当内存空间不够时按照LRLU(最近最少使用)的原则删除数据。
Memcached没有安全认证功能,一个普通的telnet客户端就可以连接server。
常常用于页面的静态化;
Memcached主要使用于存储实时性和安全性要求不是很高的数据;由于Memcache不能提供持久化功能,一定不能将其作为主库使用;
mongodb支持副本集、索引、自动分片,可以保证较高的性能和可用性。
默认情况下,MongoDB更侧重高数据写入性能,而非事务安全,MongoDB很适合业务系统中有大量“低价值”数据的场景。但是应当避免在高事务安全性的系统中使用MongoDB,除非能从架构设计上保证事务安全。
MongoDB的复副集(Master-Slave)配置非常简洁方便,此外,MongoDB可以快速响应的处理单节点故障,自动、安全的完成故障转移。这些特性使得MongoDB能在一个相对不稳定(如云主机)的环境中,保持高可用性。
数据量很大或者未来会变得很大
依赖数据库(MySQL)自身的特性,完成数据的扩展是较困难的事,在MySQL中,当一个单达表到5-10GB时会出现明显的性能降级,此时需要通过数据的水平和垂直拆分、库的拆分完成扩展,使用MySQL通常需要借助驱动层或代理层完成这类需求。而MongoDB内建了多种数据分片的特性,可以很好的适应大数据量的需求。
MongoDB支持二维空间索引,因此可以快速及精确的从指定位置获取数据。
在一些传统RDBMS中,增加一个字段会锁住整个数据库/表,或者在执行一个重负载的请求时会明显造成其它请求的性能降级。通常发生在数据表大于1G的时候(当大于1TB时更甚)。 因MongoDB是文档型数据库,为非结构货的文档增加一个新字段是很快速的操作,并且不会影响到已有数据。另外一个好处当业务数据发生变化时,是将不在需要由DBA修改表结构。
memcache是单进程多线程的网络处理模型,低层是采用的libevent事件库来处理高并发的;支持的数据类型比较单一,而且可以进行的操作也比较少;而且不支持备份、持久化、复制等特性;
缓存穿透:查询key在缓存和数据库中均不存在数据,会造成低层存储系统的负载加载,有可能会压垮服务,造成整个服务的宕机。
缓存不可用,造成整个的流量都打到了存储层,造成低层存储的负载加大,会导致存储服务压力过大,出现宕机。
1、前期:通过架构设计保证服务的高可用性
2、发生中:限流、降级、熔断
版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。