详解高级PHP工程师面试题

详解高级PHP工程师面试题

大家好,又见面了,我是全栈君。

第1题.Git的分支你们是怎么管理的?

git 为什么好,为什么要用 git,这不是我本文想要说明的问题。

这里想要给大家分享一下自己使用过程中产生的疑惑,以及解决的这些疑惑的过程。话又说回来,我现在依然充满疑惑。真不知道30岁的时候会不会不惑。

在使用 git 过程中,它的分支功能让我真的欣喜若狂,不过这是把双刃剑,一不小心你会得到这种git路径图:

image

图片来源:阮一峰老师博客

我的疑惑:

  1. 那么团队中我们该使用怎样的分支策略来进行开发协作?

  2. 在多人的团队中,我们应该在 master 分支上直接开发吗?

  3. 如果线上产生了bug该通过什么样方式的分支去修复?

  4. 当有多个分支的时候,测试如何有效的参与进来每一个分支的测试?

用成熟的工作流来解决问题

在解答上面的疑惑前,先介绍几个工作流,然后通过工作流的模式,来进行解答。因为我们必须在某种设定的情景下,才能讨论解决问题的思路。

下面三种工作流方式,都是采用功能驱动开发,也就是先有需求产生,然后诞生对应的分支,然后开发,最后合并回来,完成使命被删除。

  • Git flow

  • Github flow

  • Gitlab flow

关于这三种工作流的详细介绍,建议看看这篇文章-阮一峰

我现在采用的是 Git flow ,经过自己的实践,确实好用,解决不少问题。然后如果发现与自己的实际情况有些出入,可以根据需求做出些变动调整。

我的选择

我选择了 Git flow,它的主要特点是,长期存在两个分支:

  • 主分支master

  • 开发分支develop

然后,存在三种辅助分支,都是短期的,并且一半情况下只应该存在本地,不要提交到远程库。

  • 功能分支(feature branch)

  • 补丁分支(hotfix branch)

  • 预发分支(release branch)
    在进行上面的分支时,建议的命名规范:feature-xxx、release-xxx、hotfix-xxx

话外:我以前喜欢用下划线,后来发现打中线不需要按 shift ,哈哈,从此开始中线时代。

什么时候要功能分支?

当你拿到一个需求,或者不是一个立马需求上线的bug修复,那么就应该从 develop 开一个分支出来,完成这部分工作。完成后合并到 develop 分支。

image

什么时候要预发分支?

这个分支是为预发准备的,测试的介入,也只应该在该分支产生时才介入。当我们不管是新功能开发,还是一般的bug修改都差不多了。就应该从develop产生一个release分支,交给测试,如果有bug直接在上面修改。全部完成后,合并回develop,并且合并到master

关于这个分支我得再多说几句。因为这是非常重要的一步,如果我们使用了 git 钩子,当合并到 master 的时候,会自动发布到线上,所以这是临上线的最后一道屏障。

同时这里也解决了我一个疑惑,测试如何参与到git的每个分支中来?答案是:测试不应该参与到每个分支中来,只应该参与到release分支中去。其它的开发分支,都应该由开发人员自己测试,测试没有问题的时候才准许合并到develop,这就要求每一个开发要提高自己交付的产品质量,如何确保自己交付的产品质量?自动化测试是个不错的选择,好了,打住,这不是咋们今天的主要任务,这个话题改天再聊。

什么时候需要补丁分支?

这种情况越少越好。因为它产生的原因是:线上出了bug,并且必须马上修复,不管你身在何方,当手机响起,拿出电脑改bug吧。

它与release 很像,都需要完成后,同时合并到:masterdevelop。不同的是,它需要从master 上开一个分支出来。
image

注意这里没有测试的介入,一半来说都是代码上某一个小的紧急bug,虽然很严重,但是可以很容易改动。当然如果有一些例外情况,应该让测试进行测试后再合并、发布。

总结

git 开发很好用,但是要按照一定规则合理使用分支。

另外,除了:masterdevelop 分支,其它分支都不应该出现在远程仓库中。

git一定要结合它的各种钩子来使用,提升开发效率。这里后面来介绍下。

参考资料:

第2题. PHP进程间通信是如何实现的?

通常linux中的进程通信方式有:消息队列、信号量、共享内存、信号、管道、socket。

消息队列: 消息队列是存放在内存中的一种队列数据结构。

信号量:是系统提供的一种原子操作,一个信号量,同时只有你一个进程能操作。一个进程获得了某个信号量,就必须被该进程释放掉。

共享内存:是系统在内存中开辟的一块公共的内存区域,任何一个进程都可以访问,在同一时刻,可以有多个进程访问该区域,为了保证数据的一致性,需要对该内存区域加锁或信号量。

信号: 信号是一种系统调用。通常我们用的kill命令就是发送某个信号给某个进程的。具体有哪些信号可以在liunx/mac中运行kill -l查看。下面这个例子中,父进程等待5秒钟,向子进程发送sigint信号。子进程捕获信号,掉信号处理函数处理。

管道: 管道是比较常用的多进程通信手段,管道分为无名管道与有名管道,无名管道只能用于具有亲缘关系的进程间通信,而有名管道可以用于同一主机上任意进程。这里只介绍有名管道。下面的例子,子进程写入数据,父进程读取数据。

我们发现 PHP 对信号量和共享内存封装得很好,使用起来非常简单。除此之外,PHP 的类库 Sync 将常用 IPC 方法封装成为类,能实现跨平台的使用.

参考:PHP进程间通信详解  PHP进程间通信

3. Swoole的协程和php自带的yield的场景有哪些?

php自带的yield的场景:

协程可以用在,异步网络 IO 的时候,使其成为非阻塞的。

比如你在一个 http 请求里面,你需要请求外面的接口,那么会有下面的场景。

你的前置 server 是 nginx,nginx 是非阻塞异步的,但是 php-fpm 是同步阻塞的。那么当你在请求外面接口的时候,这个任务就会被阻塞。(这里补充一下,php-fpm 的 Worker 进程是同步阻塞的)

假设你使用协程,那么当你在请求接口的时候,你的这个任务就可以暂停,保存上下文。然后呢,当你的接口返回了之后,重新调起这个任务继续执行。你的进程就不必耗在这一个任务上了,可以去处理其它的 http 请求了。这样是不是并发量就高了?

同理,当你的请求在查询数据库的时候,也是一个 IO 请求,也是同步的。协程就可以让你这些 IO 编程异步非阻塞的,从而增大你的并发量。这主要是让你的 CPU 可以在等待 IO 的时候,可以处理别的事情。所有的 IO 请求都可以通过协程做到这一点。

 

 

4.搭建MySQL分布式有哪些方式?

5.什么是Hash一致性,这个方法主要运用在什么场景

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111964.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • delphi XE5 调试DLL「建议收藏」

    delphi XE5 调试DLL「建议收藏」1、设置HOSTAPPLICATION:RUN—PARAMETERS—-HOSTAPPLICATION选择EXE所在路径2、PROJECTS—-OPTIONS—–COMPILING下的黑体的属性全部变为普通的3、在DLL加入断点就可以调试了4、如果进不去的话,那么说明这个DLL本身是有问题的。我在调试的时候因为DLL中封装的类似于ADOQuery控件的一种控件

    2022年7月18日
    19
  • C++之内核对象进行线程同步

    用户模式下的线程同步机制提供了非常好的性能,但他们也的确存在一些局限性,而且不适用于许多应用程序,例如,对Interlocked系列函数只能对一个值进行操作,它们从来不会把线程切换到等待状态。我们可以

    2021年12月19日
    42
  • pycharm怎么编译python_python需要编译器吗

    pycharm怎么编译python_python需要编译器吗PyCharm编译器有很强大的代码提示功能,业界都说很好用,所以我尝试着安装并使用,以下是过程。下载地址:http://www.jetbrains.com/pycharm/download/#section=windows安装完成之后需要激活我选择的是Licenceserver,然后输入一下的链接http://idea.imsxm.com/即可激活,亲测可用,若果失效了那就…

    2025年6月17日
    3
  • 毕业四年

    好久不见,一年一度的“毕业N年”系列,2019,毕业四年了。工作去年9月份从前公司离职了,加入阿里,很快,再两个月就入职一年了。几条工作上的感受和建议,希望对你有所帮助。1、谨慎面试,大厂永远在招人以阿里为例,你的所有面试记录都是留存的,包括每个面试官的评价以及结果,如果准备不充分的情况下频繁面试,留下的记录会影响之后面试官对你的印象。如果对某个岗位感兴趣,最好联系对应岗位部门的同学,简历…

    2022年3月11日
    45
  • 《王道》数据结构笔记整理2022级_数据结构笔记整理

    《王道》数据结构笔记整理2022级_数据结构笔记整理数据结构第一章绪论1.1数据结构的基本概念1.2数据结构的三要素1.3算法的基本概念1.4算法的时间复杂度1.5算法的空间复杂度第一章绪论1.1数据结构的基本概念1.数据:数据是信息的载体,是描述客观事物属性的数、字符以及所有能输入到计算机中并被程序识别和处理的符号的集合。2.数据元素:数据元素是数据的基本单位,通常作为一个整体进行考虑和处理。一个数据元素可由若干数据项组成,数据项是构成数据元素的不可分割的最小单位。例如,学生记录就是一个数据元素,它由学号、姓名、性别等数据项组成。3.数据对象:数

    2022年8月23日
    15
  • Eureka集群原理

    Eureka集群原理问题:微服务RPC远程服务调用最核心的是什么?高可用,试想你的注册中心只有一个onlyone,它出故障了那就呵呵o( ̄︶ ̄)o了,会导致整个微服务环境不可用。解决办法:搭建Eureka注册中心集群,实现负载均衡+故障容错Eureka集群的原理:互相注册,相互守望。一个Eureka集群包含7001和7002等许多服务,在这个集群中,7001指向其他所有服务…

    2022年5月28日
    41

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号