[2020年面试题-PHP 与 golang] 1. Go 和 PHP 在运行的时候有什么区别和优势?

@author
汪春波(www.shxdledu.cn)

原文链接

分享:[分享] 大环境下瑟瑟发抖辞职的第二天,拿了两个 offer

面试题解析

  1. 看你简历里也有用过 Go,Go 和 PHP 在运行的时候有什么区别和优势?

题主原回答:
PHP 每个请求进来时都会创建 fpm-worker 进程,从而导致系统并发高时 CPU 会产生频繁创建进程的开销,而 Go 不会。

解析回答:PHP 每个请求进来时都会创建 fpm-worker 进程

补充下,这里php 请求进来就会 由PHP - FPM(php-fpm是php-cgi的进程管理器)创建一个PHP-CGI进程来准备响应用户的请求。具体过程如图,大家也可以继续往下看详细解析。

【2020年面试题-php与golang】1. 看你简历里也有用过 Go,Go 和 PHP 在运行的时候有什么区别和优势?

解析回答:而go不会

golang 是先编译,后执行。 具体可以往下看详细解析。

php 运行原理

PHP 运行模式与运行原理

目前常见的4种PHP运行模式

  1. CGI通用网关接口模式
  2. FAST-CGI模式
  3. CLI命令行模式
  4. 模块模式

CGI通用网关接口模式

每有一个用户请求,都会先要创建cgi的子进程,然后处理请求,处理完后结束这个子进程

cgi是一种为了保证web server传递过来的数据是标准格式的通用网关接口协议

比较老,比较原始,大多已经不用了

FAST-CGI模式

是cgi的升级版本,FastCGI 像是一个常驻 (long-live) 型的 CGI,它可以一直执行着,只要激活后,不会每次都要花费时间去fork 一次,也是一种协议

FastCGI的工作原理是:

  (1)、Web Server启动时载入FastCGI进程管理器【PHP的FastCGI进程管理器是PHP-FPM(php-FastCGI Process Manager)】(IIS ISAPI或Apache Module);

  (2)、FastCGI进程管理器自身初始化,启动多个CGI解释器进程 (在任务管理器中可见多个php-cgi.exe)并等待来自Web Server的连接。

  (3)、当客户端请求到达Web Server时,FastCGI进程管理器选择并连接到一个CGI解释器。Web server将CGI环境变量和标准输入发送到FastCGI子进程php-cgi。

  (4)、FastCGI子进程完成处理后将标准输出和错误信息从同一连接返回Web Server。当FastCGI子进程关闭连接时,请求便告处理完成。FastCGI子进程接着等待并处理来自FastCGI进程管理器(运行在 WebServer中)的下一个连接。在正常的CGI模式中,php-cgi.exe在此便退出了。

  在CGI模式中,可以想象 CGI通常有多慢。每一个Web请求PHP都必须重新解析php.ini、重新载入全部dll扩展并重初始化全部数据结构。使用FastCGI,所有这些都只在进程启动时发生一次。一个额外的好处是,持续数据库连接(Persistent database connection)可以工作。

CLI命令行模式

一般使用调用脚本、查看php信息时会使用到该模式

php -r”phpinfo();” |less 分页显示

模块模式

  1. Apache + mod_php
  2. lighttp + spawn-fcgi
  3. nginx + PHP-FPM

运行原理

PHP-CGI:fast-cgi是一种协议,而php-cgi是实现了这种协议的进程。不过这种实现比较烂。它是单进程的,一个进程处理一个请求,处理结束后进程就销毁

PHP - FPM:是对php-cgi的改进版,它直接管理多个php-cgi进程/线程。也就是说,php-fpm是php-cgi的进程管理器因此它也算是fastcgi协议的实现
php的运行原理,就是在服务器启动时,自动载入PHP-FPM进程管理器,从而管理多个PHP-CGI进程来准备响应用户的请求,如下图所示:

【2020年面试题-php与golang】1. 看你简历里也有用过 Go,Go 和 PHP 在运行的时候有什么区别和优势?

【2020年面试题-php与golang】1. 看你简历里也有用过 Go,Go 和 PHP 在运行的时候有什么区别和优势?

由于php-cgi是随服务器启动载入的,所以初始化变量只会发生一次

运行模式和运行原理的区别

多个运行模式相当于超市的不同入口,运行原理就是进入超市后的固定的行走路线,通过不同的运行模式进入到底层(进入超市)




golang 运行原理

golang 是先编译为静态二进制可执行文件,再去运行。

看看 go run 与 go build 的区别

go的执行原理以及Go的命令

go run 的执行过程

2020年面试题-php与golang

  1. 创建了两个临时文件夹 b001 和 exe
  2. 先执行了 compile 命令,然后 link,生成了归档文件.a 和 最终可执行文件
  3. 最终的可执行文件放在 exe 文件夹里面。
  4. 命令的最后一步就是执行了可执行文件。

举个例子,生成的临时文件可以用go run -work看到,比如当前生成的临时文件夹是如下的路径:

localhost:hello ruby$ go run -work mytest.go 
WORK=/var/folders/kt/nlhsnpgn6lgd_q16f8j83sbh0000gn/T/go-build593750496
HelloWorld
你好,Go!!!
localhost:hello ruby$ 

我们进入:/var/folders/kt/nlhsnpgn6lgd_q16f8j83sbh0000gn/T/go-build593750496目录,可以看到如下目录结构:

2020年面试题-php与golang

可以看到,最终go run命令是生成了2个文件,一个是归档文件,一个是可执行文件。

go run 命令在第二次执行的时候,如果发现导入的代码包没有发生变化,那么 go run 不会再次编译这个导入的代码包。直接静态链接进来。

go build 的执行过程

go build 用于编译我们指定的源码文件或代码包以及它们的依赖包。但是注意如果用来编译非命令源码文件,即库源码文件,go build 执行完是不会产生任何结果的。这种情况下,go build 命令只是检查库源码文件的有效性,只会做检查性的编译,而不会输出任何结果文件。

go build 编译命令源码文件,则会在该命令的执行目录中生成一个可执行文件,上面的例子也印证了这个过程。

go build 后面不追加目录路径的话,它就把当前目录作为代码包并进行编译。go build 命令后面如果跟了代码包导入路径作为参数,那么该代码包及其依赖都会被编译。

go build 命令究竟做了些什么呢?我们可以执行-n这个命令来查看。 这里略过打印输出。

执行过程和 go run 大体相同,唯一不同的就是在最后一步,go run 是执行了可执行文件,但是 go build 命令,只是把库源码文件编译了一遍,然后把可执行文件移动到了当前目录的文件夹中。

总结一下如下图:

2020年面试题-php与golang

本作品采用《CC 协议》,转载必须注明作者和本文链接
嗨,我是波波。曾经创业,有收获也有损失。我积累了丰富教学与编程经验,期待和你互动和进步! 公众号:上海PHP自学中心 付费知识星球:破解面试:程序员的求职导师
本帖由 CrazyZard 于 3年前 加精
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 11
╰ゝSakura

赞,学习一波走起

3年前 评论

“PHP 每个请求进来时都会创建 fpm-worker 进程“, 这句话没太理解,php-fpm 不是 master-worker 形式的,php-fpm在启动的时候就会创建master和一些worker进程,然后有请求过来由master分配给worker么,不需要每个请求都要创建fpm-worker啊

3年前 评论
bestcyt 3年前
g33bwyw 3年前
zw_hope 3年前
小手冰凉 3年前
zw_hope 3年前
小手冰凉 3年前
wenyu 3年前
青春不留白 3年前
wangchunbo

@╰ゝSakura 加油!

3年前 评论
wangchunbo

@EmptyCup 这个回答仅仅是面试者的回答,并不代表标准答案。我是拿别人的面试经历,来分析。 你可以往下看我写的解析。

3年前 评论
wangchunbo

@EmptyCup 每一个子进程同时只能服务一次连接。我是在php 进程管理里看到的这句话。

3年前 评论
面试权威指南 3年前

没有代码演示。

3年前 评论
wangchunbo

@admin0 对我来说 我自己看够了,以后有写这方面可以找回来,再更新哈哈。(个性签名,防止任何爬虫爬我)「来源learnku-社区」

3年前 评论

这个,这个,这个,厉害了!!!

3年前 评论

这是多少k的面试

3年前 评论
zero风来 3年前

分析的不错。请问楼主,还有没有续篇?

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!
司机 @ 欣昊玉
文章
273
粉丝
339
喜欢
558
收藏
1106
排名:64
访问:12.2 万
私信
所有博文
社区赞助商