ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[info] 进程、线程、协程 **进程:** * 进程是程序一次动态执行的过程,是程序运行的基本单位。 * 每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。 * 进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、页表、文件句柄等)比较大,但相对比较稳定安全。协程切换和协程切换 **线程:** * 线程又叫做轻量级进程,是CPU调度的最小单位。 * 线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程。 * 多个线程共享所属进程的资源,同时线程也拥有自己的专属资源。 * 程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。 ![](https://img.kancloud.cn/93/c8/93c8b5ca2d54c18fad5a9aeaf5a46bb4_1075x741.png) **协程:** * 协程是一种用户态的轻量级线程,协程的调度完全由用户控制。 * 一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程序所控制。 * 与其让操作系统调度,不如我自己来,这就是协程。 ![](https://img.kancloud.cn/3f/23/3f231a6187d5950811ddbe67c1fe452b_1084x846.png) >[info] QPS、TPS **QPS:(每秒查询/并发/响应时间)** QPS即每秒查询率,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 **QPS计算关系:** QPS = 并发量 / 平均响应时间 并发量 = QPS * 平均响应时间 ***** **TPS:(吞吐量)** Transactions Per Second(每秒传输的事物处理个数),即服务器每秒处理的事务数。TPS包括一条消息入和一条消息出,加上一次用户数据库访问。(业务TPS = CAPS × 每个呼叫平均TPS) TPS是软件测试结果的测量单位。一个事务是指一个客户机向服务器发送请求然后服务器做出反应的过程。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。 一般的,评价系统性能均以每秒钟完成的技术交易的数量来衡量。系统整体处理能力取决于处理能力最低模块的TPS值。 例如:天猫双十一,一秒完成多少订单 ***** **QPS与TPS的区别是什么** 举个栗子:假如一个大胃王一秒能吃10个包子,一个女孩子0.1秒能吃1个包子,那么他们是不是一样的呢?答案是否定的,因为这个女孩子不可能在一秒钟吃下10个包子,她可能要吃很久。这个时候这个大胃王就相当于TPS,而这个女孩子则是QPS。虽然很相似,但其实是不同的。 **如何提高单机QPS:** 1、机器本身 1.1、cpu 1.2、内存 1.3、IO 1.4、网络 2、程序代码 3、逻辑架构 >[info] PHP有哪些数据类型 **布尔,整型,浮点型,字符串,数组,对象,资源,null** ***** 1.四种变量类型 整数型(integer) 浮点数型(float) 布尔型(boolean) 字符串(string) 2.两种复合类型 数组 (array) 对象(object) 3.两种特殊类型 NULL 资源 (resource) ***** >[info] isset() 和 empty() 区别? isset判断变量是否存在,可以传入多个变量,若其中一个变量不存在则返回假;empty判断变量是否为空为假,只可 传一个变量,如果为空为假则返回真。 ***** >[info] 请说明 PHP 中传值与传引用的区别。什么时候传值什么时候传引用? **按值传递:** 函数范围内对值的任何改变在函数外部都会被忽略 。 **按引用传递:** 函数范围内对值的任何改变在函数外部 也能反映出这些修改。 **优缺点:** 按值传递时,php必须复制值。特别是对于大型的字符串和数组和对象来说,这将会是一个代价很大的操作。按引用传递则不需要复制值,对于性能提高很有好处。 ***** >[info] foo()和@foo()之间有什么区别? @代表所有warning忽略 ***** >[info] 常见的php的预定义变量有哪些? $GLOBALS — 引用全局作用域中可用的全部变量 $_SERVER — 服务器和执行环境信息 $_GET — HTTP GET 变量 $_POST — HTTP POST 变量 $_FILES — HTTP 文件上传变量 $_REQUEST — HTTP Request 变量 $_SESSION — Session 变量 $_ENV — 环境变量 $_COOKIE — HTTP Cookies ***** >[info] TCP怎么建立连接? TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN, ACK。这种建立连接的方法可以防止产生错误的连接,TCP使用的流量控制协议是可变大小的滑动窗口协议。第一次 握手:建立连接时,客户端发送SYN包(SEQ=x)到服务器,并进入SYN\_SEND状态,等待服务器确认。第二次握手: 服务器收到SYN包,必须确认客户的SYN(ACK=x+1),同时自己也送一个SYN包(SEQ=y),即SYN+ACK包,此时服务器进 入SYN_RECV状态。第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ACK=y+1),此包发送完 毕,客户端和服务器时入Established状态,完成三次握手。 ***** >[info] 代表什么呢? 3 | 6 = 多少?(7) 十进制3转化为二进制后是:11 十进制6转化为二进制后是:110 二进制11 | 二进制110 = 111 二进制111转换成十进制=7 ***** >[info] 简述 private、 protected、 public修饰符的访问权限 private : 私有成员, 在类的内部才可以访问。 protected : 保护成员,该类内部和继承类中可以访问。 public : 公共成 员,完全公开,没有访问限制。 ***** >[info] 常用的魔术方法有哪些?举例说明(靠记) ``` __construct() 实例化类时自动调用。 __destruct() 类对象使用结束时自动调用。 __set() 在给未定义的属性赋值的时候调用。 __get() 调用未定义的属性时候调用。 __isset() 使用isset()或empty()函数时候会调用。 __unset() 使用unset()时候会调用。 __sleep() 使用serialize序列化时候调用。 __wakeup() 使用unserialize反序列化的时候调用。 __call() 调用一个不存在的方法的时候调用。 __callStatic()调用一个不存在的静态方法是调用。 __toString() 把对象转换成字符串的时候会调用。比如 echo。 __invoke() 当尝试把对象当方法调用时调用。 __set_state() 当使用var_export()函数时候调用。接受一个数组参数。 __clone() 当使用clone复制一个对象时候调用。 ``` >[info] 请列举几个php数组函数?(靠记) ![](https://img.kancloud.cn/cc/c9/ccc99679b5c5f5a67e8831f7da6cdc0e_835x1002.png) >[info] session与cookie的区别? 1、cookie数据存放在第三方应用的浏览器上,session数据放在服务器上。 2、cookie不是很安全,别人可以分析存放在本地的COOKIE,进行COOKIE欺骗,考虑到安全应当使用session。 3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方 面,应当使用COOKIE。 4、单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。 5、所以个人建议: 将登陆信息等重要信息存放为SESSION 其他信息如果需要保留,可以放在COOKIE >[info] php中===与==区别 ===比较两个变量的值和类型;==比较两个变量的值,不比较数据类型。 >[info] 请说说对php中final 关键字的理解 PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承。 >[info] 你用过哪些PHP设计模式? 1、工厂模式 建立一个工厂(一个函数或一个类方法)来制造新的对象 工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如 果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。 2、单例模式 单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 单例模式是一种常见的设计模式,在计算机系统中,线程池、缓存、日志对象、对话框、打印机、数据库操作、显卡 的驱动程序常被设计成单例。 单例模式分3种:懒汉式单例、饿汉式单例、登记式单例。 单例模式有以下3个特点: 1.只能有一个实例。 2.必须自行创建这个实例。 3.必须给其他对象提供这一实例。 那么为什么要使用PHP单例模式? PHP一个主要应用场合就是应用程序与数据库打交道的场景,在一个应用中会存在大量的数据库操作,针对数据库句 柄连接数据库的行为,使用单例模式可以避免大量的new操作。因为每一次new操作都会消耗系统和内存的资源。 3、观察者模式 1:观察者模式(Observer),当一个对象状态发生变化时,依赖它的对象全部会收到通知,并自动更新。 2:场景:一 个事件发生后,要执行一连串更新操作。传统的编程方式,就是在事件的代码之后直接加入处理的逻辑。当更新的逻 辑增多之后,代码会变得难以维护。这种方式是耦合的,侵入式的,增加新的逻辑需要修改事件的主体代码。 3:观 察者模式实现了低耦合,非侵入式的通知与更新机制。 定义一个事件触发抽象类。 4、适配器模式 将各种截然不同的函数接口封装成统一的API。 PHP中的数据库操作有MySQL,MySQLi,PDO三种,可以用适配器模式 统一成一致,使不同的数据库操作,统一成一样的API。类似的场景还有cache适配器,可以将 memcache,redis,file,apc等不同的缓存函数,统一成一致。 首先定义一个接口(有几个方法,以及相应的参数)。然 后,有几种不同的情况,就写几个类实现该接口。将完成相似功能的函数,统一成一致的方法。 5、策略模式 策略模式是对象的行为模式,用意是对一组算法的封装。动态的选择需要的算法并使用。 策略模式指的是程序中涉及决策控制的一种模式。策略模式功能非常强大,因为这个设计模式本身的核心思想就是面 向对象编程的多态性思想。 策略模式的三个角色: 1.抽象策略角色 2.具体策略角色 3.环境角色(对抽象策略角色的引用) 实现步骤: 1.定义抽象角色类(定义好各个实现的共同抽象方法) 2.定义具体策略类(具体实现父类的共同方法) 3.定义环境角色类(私有化申明抽象角色变量,重载构造方法,执行抽象方法) 就在编程领域之外,有许多例子是关于策略模式的。例如: 如果我需要在早晨从家里出发去上班,我可以有几个策略考虑:我可以乘坐地铁,乘坐公交车,走路或其它的途径。 每个策略可以得到相同的结果,但是使用了不同的资源。 6、注册模式 注册模式,解决全局共享和交换对象。已经创建好的对象,挂在到某个全局可以使用的数组上,在需要使用的时候, 直接从该数组上获取即可。将对象注册到全局的树上。任何地方直接去访问。 >[info] socket 连接步骤? Socket(套接字)概念 套接字(socket)是通信的基石,是支持 TCP/IP 协议的网络通信的基本操作单元。它是网络通信过程中端点的抽象 表示,包含进行网络通信必须的五种信息:连接使用的协议,本地主机的 IP 地址,本地进程的协议端口,远地主机 的 IP 地址,远地进程的协议端口。 Socket 连接过程 建立 Socket 连接至少需要一对套接字,其中一个运行于客户端,称为 ClientSocket ,另一个运行于服务器端,称为 ServerSocket 套接字之间的连接过程可以分为三个步骤:服务器监听,客户端请求,连接确认。 服务器监听:是服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态。 客户端请求:是指由客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须 首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请 求。 连接确认:是指当服务器端套接字监听到或者说接收到客户端套接字的连接请求,它就响应客户端 套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,连接就建立好 了。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。 >[info] 如何解决超卖问题 * 悲观锁 * 乐观锁 * 队列术 * 分布式锁 >[info] 怎么实现第三方登录? 第三方登陆主要是基于author协议来实现,下面简单说下实现流程: 1、首先我们需要以开发者的身份向第三方登陆平台申请接入应用,申请成功后,我们会获得一个appID和一个 secrectID. 2、当我们的网站需接入第三方登陆时,会引导用户跳转到第三方的登陆授权页面,此时把之前申请的 appID和secrectID带给登陆授权页面。 3、用户登陆成功后即得到授权,第三方会返回一个临时的code给我们的网 站。 4、我们的网站接受到code后,再次向我们的第三方发起请求,并携带接收的code,从第三方获取access\_token. 5、第三方处理请求后,会返回一个access\_token给我们的网站,我们的网站获取到access\_token后就可以调用第三 方提供的接口了,比如获取用户信息等。最后把该用户信息存入到我们站点的数据库,并把信息保存到session中, 实现用户的第三方登陆。 >[info] 谈谈对MVC的认识? 核心思想是:视图和用户交互通过事件导致控制器改变 控制器改变导致模型改变 或者控制器同时改变两者 模型改变 导致视图改变 或者视图改变 潜在的从模型里面获得参数 来改变自己。他的好处是可以将界面和业务逻辑分离。 Model(模型),是程序的主体部分,主要包含业务数据和业务逻辑。在模型层,还会涉及到用户发布的服务,在服 务中会根据不同的业务需求,更新业务模型中的数据。 View(视图),是程序呈现给用户的部分,是用户和程序交互的接口,用户会根据具体的业务需求,在View视图层输 入自己特定的业务数据,并通过界面的事件交互,将对应的输入参数提交给后台控制器进行处理。 Contorller(控制器),Contorller是用来处理用户 输入数据,已经更新业务模型的部分。控制器中接收了用户与界 面交互时传递过来的数据,并根据数据业务逻辑来执行服务的调用和更新业务模型的数据和状态。 >[info] Laravel 中 insert () 和 insertGetId () 函数之间的显著区别是什么? Insert (): 此函数仅用于将记录插入数据库。 不返回自增 ID InsertGetId (): 此函数会在表中插入一条记录,但当 ID 字段自动递增时使用。(插入记录并返回自增的 ID) >[info] 说下你对PHP中trait的理解 Trait 是为类似 PHP 的单继承语言而准备的一种代码复用机制。Trait 为了减少单继承语言的限制,使开发人员能够 自由地在不同层次结构内独立的类中复用 method。Trait 和 Class 组合的语义定义了一种减少复杂性的方式,避免 传统多继承和 Mixin 类相关典型问题。 Trait 和 Class 相似,但仅仅旨在用细粒度和一致的方式来组合功能。 无法通过 trait 自身来实例化。它为传统继承 增加了水平特性的组合;也就是说,应用的几个 Class 之间不需要继承。 >[info] 请你说说对OOP思想的理解 面向对象编程(Object Oriented Programming,OOP,面向对象程序设计)是一种计算机编程架构。OOP 的一条 基本原则是计算机程序是由单个能够起到子程序作用的单元或对象组合而成。 核心思想:封装,继承,多态. OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数 据和向其它对象发送信息。 >[info] PHP实现协程的方式是什么?(yield) 协程:可以理解就是一种用户空间线程。 协程,有几个特点: * 协同,因为是由程序员自己写的调度策略,其通过协作而不是抢占来进行切换 * 在用户态完成创建,切换和销毁 * 从编程角度上看,协程的思想本质上就是控制流的主动让出(yield)和恢复(resume)机制 * 迭代器经常用来实现协程 >[info] 谈谈你对TCP连接是如何建立和断开的 三次握手 四次挥手 >[info] TCP和UDP的区别是什么? 简约的回答: * TCP 是面向连接的,UDP 是面向无连接的 * UDP程序结构较简单 * TCP 是面向字节流的,UDP 是基于数据报文的 * TCP 保证数据正确性,UDP 可能丢包 * TCP 保证数据顺序,UDP 不保证 ``` 1、TCP面向连接(如打电话要先拨号建立连接);UDP是无连接的,即发送数据之前不需要建立连接 2、TCP提供可靠的服务。也就是说,通过TCP连接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交 付,即不保证可靠交付 3、TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流;UDP是面向报文的 UDP没有拥塞控制,因此网络出现拥塞不会使源主机的发送速率降低(对实时应用很有用,如IP电话,实时视频会议等) 4、每一条TCP连接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通信 5、TCP首部开销20字节;UDP的首部开销小,只有8个字节 6、TCP的逻辑通信信道是全双工的可靠信道,UDP则是不可靠信道 ``` >[info] 构造函数和析构函数的理解 **构造函数:** PHP 5 允行开发者在一个类中定义一个方法作为构造函数。具有构造函数的类会在每次创建新对象时先调 用此方法,所以非常适合在使用对象之前做一些初始化工作 **析构函数:** PHP 5 引入了析构函数的概念。析构函数会在到某个对象的所有引用都被删除或者当对象被显式销毁时执 行 >[info] PHP如何获取客户端/服务端 IP,以及客户端真实IP 客户端IP: $_SERVER['REMOTE_ADDR'] 服务端IP: $_SERVER['SERVER_ADDR'] 客户端IP(代理透传): $_SERVER['HTTP_X_FORWARDED_FOR'] >[info] 如何解决PHP内存溢出问题? 1、ini_set('memory_limit','500M'); 2、unset使用完毕的变量 3、分批处理,避免生成大数组 >[info] PHP的垃圾回收机制(GC)中的zval变量容器是干啥用的 引用计数器,如果按着了xdebug,可以打印出 ``` <?php $a = "new string"; $c = $b = $a; xdebug_debug_zval( 'a' ); unset( $b, $c ); xdebug_debug_zval( 'a' ); ?> ``` 以上例程会输出: ``` a: (refcount=3, is_ref=0)='new string' a: (refcount=1, is_ref=0)='new string' ```